zoukankan      html  css  js  c++  java
  • 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官方中文文档

  • 相关阅读:
    iOS4.3可显著选拔iPhone4和iPad速度
    传iPhone5回归金属机身 形状似touch4
    联发科月度收入跌至四年来冰点
    品评:上海电信业不可被摩登数据蒙住双眼
    分析师以为移动搜集运营商需开发数据赚钱新途径
    智能手机市场输家和赢家:Android手机厥后居上
    人大代表张新建:减速互联网及短信拘留立法
    思科任命尝试副总裁加里摩尔出任首席运营官
    运营商纷繁筹建移动付出公司
    2011年中国3G移动通讯市场瞻望与分析
  • 原文地址:https://www.cnblogs.com/szls-666/p/12494223.html
Copyright © 2011-2022 走看看