• Dubbo的异步调用


    1.背景
    分布式服务架构
    当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键
    今天说一下的Dubbo的异步调用
    2.基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
    在这里插入图片描述
    3.在 consumer.xml 中配置:

    <dubbo:reference id="fooService" interface="com.alibaba.foo.FooService">
          <dubbo:method name="findFoo" async="true" />
    </dubbo:reference>
    <dubbo:reference id="barService" interface="com.alibaba.bar.BarService">
          <dubbo:method name="findBar" async="true" />
    </dubbo:reference>
    

    4.调用代码

    // 此调用会立即返回null
    fooService.findFoo(fooId);
    // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
    Future<Foo> fooFuture = RpcContext.getContext().getFuture(); 
    
    // 此调用会立即返回null
    barService.findBar(barId);
    // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
    Future<Bar> barFuture = RpcContext.getContext().getFuture(); 
    
    // 此时findFoo和findBar的请求同时在执行,客户端不需要启动多线程来支持并行,而是借助NIO的非阻塞完成
    
    // 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒
    Foo foo = fooFuture.get(); 
    // 同理等待bar返回
    Bar bar = barFuture.get(); 
    
    // 如果foo需要5秒返回,bar需要6秒返回,实际只需等6秒,即可获取到foo和bar,进行接下来的处理。
    

    5.你也可以设置是否等待消息发出
    sent=“true” 等待消息发出,消息发送失败将抛出异常。
    sent=“false” 不等待消息发出,将消息放入 IO 队列,即刻返回。

    <dubbo:method name="findFoo" async="true" sent="true" />
    

    6.如果你只是想异步,完全忽略返回值,可以配置 return=“false”,以减少 Future 对象的创建和管理成本:

    <dubbo:method name="findFoo" async="true" return="false" />
    

    注意:2.0.6 及其以上版本支持,异步总是不等待返回
    dubbo官方中文文档

  • 相关阅读:
    2020系统综合实践 第五次实践作业
    2020系统综合实践 第4次实践作业
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    2020系统综合实践 第1次实践作业
    wireshark大作业——负载均衡
    第07组 Beta版本演示
    第07组 Beta冲刺(4/4)
    软工实践个人总结
    第03组 Beta冲刺(5/5)
  • 原文地址:https://www.cnblogs.com/szls-666/p/12494223.html
Copyright © 2020-2023  润新知