dubbo2.7 42 异步调用
dubbo2.7 42 异步调用
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
在 Dubbo 中发起异步调用
背景
从 2.7.0 开始,Dubbo 的所有异步编程接口开始以 CompletableFuture 为基础
基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。
示例
使用 CompletableFuture 签名的接口
需要服务提供者事先定义 CompletableFuture 签名的服务,具体参见 服务端异步执行 接口定义:
1 | public interface AsyncService { |
注意接口的返回类型是 CompletableFuture<String>
。
XML 引用服务:
1 | <dubbo:reference id="asyncService" timeout="10000" interface="com.alibaba.dubbo.samples.async.api.AsyncService"/> |
调用远程服务:
1 | // 调用直接返回 CompletableFuture |
使用 RpcContext
在 consumer.xml 中配置:
1 | <dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService"> |
调用代码:
1 | // 此调用会立即返回 null |
或者,你也可以这样做异步调用:
1 | CompletableFuture<String> future = RpcContext.getContext().asyncCall( |
重载服务接口
如果你只有这样的同步服务定义,而又不喜欢 RpcContext 的异步使用方式。
1 | public interface GreetingsService { |
那还有一种方式,就是利用 Java 8 提供的 default 接口实现,重载一个带有 CompletableFuture 签名的方法。
CompletableFuture 签名的方法目前只支持 Dubbo 协议,其他协议由于第三方实现问题,需要视具体情况而定。
有两种方式来实现:
- 提供方或消费方自己修改接口签名
1 | public interface GreetingsService { |
- Dubbo 官方提供 compiler hacker,编译期自动重写同步方法,请 在此 讨论和跟进具体进展。
你也可以设置是否等待消息发出:1
sent="true"
等待消息发出,消息发送失败将抛出异常。sent="false"
不等待消息发出,将消息放入 IO 队列,即刻返回。
1 | <dubbo:method name="findFoo" async="true" sent="true" /> |
如果你只是想异步,完全忽略返回值,可以配置 return="false"
,以减少 Future 对象的创建和管理成本:
1 | <dubbo:method name="findFoo" async="true" return="false" /> |