2019-04-08 | Dubbo | UNLOCK

SpringBoot整合Dubbo-异步

Dubbo 异步调用

基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。

在 consumer.xml 中配置:
ps:这里在 consumer中配置,其实在provider中配置也是可以的,文章最后给出基于SpringBoot的注解实现Dubbo异步的案例,在provider中配置

1
2
3
4
5
6
<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>

代码案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 此调用会立即返回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,进行接下来的处理。

你也可以设置是否等待消息发出: 2
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" />

异步理解心得:
昨晚猴哥想吃宵夜了,于是走近厨房,拔出两根猴毛一吹,出现了两个猴孙,一个烧水煮面,一个调配料,弄完之后 猴哥直接就去吃了,这就是异步,本来一个人做吃的需要先调配料再煮面才能吃,而异步化后,能够同时调配料和煮面,这样调配料(4分钟),煮面(5分钟),异步化后就只需要5分钟,表述不好将就看。

评论加载中