dubbo2.7 43 异步执行
dubbo2.7 43 异步执行
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`
Dubbo 服务提供方的异步执行
背景
Provider 端异步执行将阻塞的业务从 Dubbo 内部线程池切换到业务自定义线程,避免 Dubbo 线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无异于节省资源或提升 RPC 响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。
注意
Provider 端异步执行和 Consumer 端异步调用是相互独立的,你可以任意正交组合两端配置
- Consumer 同步 - Provider 同步
- Consumer 异步 - Provider 同步
- Consumer 同步 - Provider 异步
- Consumer 异步 - Provider 异步
示例
定义 CompletableFuture 签名的接口
服务接口定义:
1 | public interface AsyncService { |
服务实现:
1 | public class AsyncServiceImpl implements AsyncService { |
通过 return CompletableFuture.supplyAsync()
,业务执行已从 Dubbo 线程切换到业务线程,避免了对 Dubbo 线程池的阻塞。
使用 AsyncContext
Dubbo 提供了一个类似 Serverlet 3.0 的异步接口AsyncContext
,在没有 CompletableFuture 签名接口的情况下,也可以实现 Provider 端的异步执行。
服务接口定义:
1 | public interface AsyncService { |
服务暴露,和普通服务完全一致:
1 | <bean id="asyncService" class="org.apache.dubbo.samples.governance.impl.AsyncServiceImpl"/> |
服务实现:
1 | public class AsyncServiceImpl implements AsyncService { |