首页 > 其他分享 >Dubbo实战篇--异步

Dubbo实战篇--异步

时间:2023-06-04 15:48:15浏览次数:39  
标签:Dubbo 实战篇 调用 异步 -- CompletableFuture Provider 线程

theme: cyanosis
日期 更新说明
2023年6月3日 初版编辑

最是人间留不住,朱颜辞镜花辞树

离开这段时间,发现Dubbo其实已经已经发布到了3.2了,其实有点断更。

前言

“异步”作为性能优化的利器之一,对于系统优化是一种常见思路;Dubbo天然的异步模式,不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。本文将针对Dubbo 异步使用展开介绍。

使用

Dubbo 异步调用

在 Dubbo 中服务调用方和服务提供方都支持异步调用,其调用模式可以组合为以下四种:

  1. Consumer同步 - Provider同步
  2. Consumer异步 - Provider同步
  3. Consumer同步 - Provider异步
  4. Consumer异步 - Provider异步

Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无异于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。

使用方式

使用 CompletableFuture 签名的接口

  1. 服务接口的调用添加 CompletableFuture
public interface AsyncService {
    CompletableFuture<String> sayHello(String name);
}
  1. 服务接口实现接口:
public class AsyncServiceImpl implements AsyncService {
    @Override
    public CompletableFuture<String> sayHello(String name) {
        return CompletableFuture.supplyAsync(() -> {
            System.out.println(name);
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "async response from provider.";
        });
    }
}

通过 return CompletableFuture.supplyAsync() ,业务执行已从 Dubbo 线程切换到业务线程,避免了对 Dubbo 线程池的阻塞。

  1. XML 引用服务
<dubbo:reference id="asyncService" timeout="10000" interface="com.alibaba.dubbo.samples.async.api.AsyncService"/>
  1. 调用远程服务
// 调用直接返回CompletableFuture
CompletableFuture<String> future = asyncService.sayHello("async call request");
// 增加回调
future.whenComplete((v, t) -> {
    if (t != null) {
        t.printStackTrace();
    } else {
        System.out.println("Response: " + v);
    }
});
// 早于结果输出
System.out.println("Executed before response return.");

使用 AsyncContext

在 consumer.xml 中配置

<dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService">
      <dubbo:method name="sayHello" async="true" />
</dubbo:reference>

调用代码

// 此调用会立即返回null
asyncService.sayHello("world");
// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
CompletableFuture<String> helloFuture = RpcContext.getServiceContext().getCompletableFuture();
// 为Future添加回调
helloFuture.whenComplete((retValue, exception) -> {
    if (exception == null) {
        System.out.println(retValue);
    } else {
        exception.printStackTrace();
    }
});

或者,也可以这样做异步调用

CompletableFuture<String> future = RpcContext.getServiceContext().asyncCall(
    () -> {
        asyncService.sayHello("oneway call request1");
    }
);

future.get();

异步总是不等待返回,你也可以设置是否等待消息发出

  • sent="true" 等待消息发出,消息发送失败将抛出异常。
  • sent="false" 不等待消息发出,将消息放入 IO 队列,即刻返回。
<dubbo:method name="findFoo" async="true" sent="true" />

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

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

参考

阅读文献

代码案例

https://gitee.com/will-we/dubbo-blog/tree/main/2-advanced/dubbo-async

标签:Dubbo,实战篇,调用,异步,--,CompletableFuture,Provider,线程
From: https://www.cnblogs.com/weir110/p/17455749.html

相关文章

  • 猜数字
    1-实例代码'''---------------------------------#@Date:2023-06-0415:10:24#@Author:Devin#@LastModified:2023-06-0415:18:55------------------------------------''''''程序说明: 电脑给出一个范围内的随机数,用户尝试根据反馈猜测,直至猜......
  • [CEOI2017] Sure Bet(双指针)
    题目大意:给出两个数组A,B,可以在两个数组选择任意多个数,代价为选择的数的数目,得到的奖励为在数组A和数组B中选择的数的两个总和较小的那个,求能得到的最大收益思路:1.先给两个数组分别由大到小排序后求前缀和,不难得出在数组A中选择i个数,数组B中选择j个数时,最大收益为:m......
  • 智能AI客服系统- 企业AI知识库
    我们都使用过ChatGPT,也能感受得到他的大模型能力。但是,它并不能知道我们企业或个人的私有知识信息。现在,唯一客服系统已经搭配了智能知识库AI,基于ChatGPT和私有数据构建智能知识库,智能辅助客服回复用户消息。可以做到全自动回复,或者辅助客服人工回复。智能AI客服系统+企业AI知......
  • YouCompleteMe插件安装
    Vundle安装YouCompleteMe安装YouCompleteMe对软件版本要求,编译python默认都是静态库,YouCompleteMe需要动态库ProblemsinstallingPython3with--enable-sharedexportLD_RUN_PATH=~/opt/python3.10/lib;./configure--prefix=~/opt/python3.10/--enable-sharedexpo......
  • 歌德巴赫猜想
    一、问题描述: 二、设计思路:  三、程序流程图:  四、代码实现:#include<stdio.h>#include<math.h>intfun(intn){inti;if(n==2)return1;if(n%2==0)return0;for(i=3;i<=sqrt(n);i+=2)if(n%i==0)re......
  • xxx管理系统
    宿舍管理系统图书管理系统学生选课系统在线考试系统学生成绩管理系统人力资源管理系统医院管理系统酒店管理系统购物网站/电子商务系统在线银行系统电影票订购系统基于位置的应用(如餐厅预订系统、出租车叫车应用)社交网络平台在线订餐系统旅游管理系统智能家居控制......
  • Android NDK链接静态库动态库
    在NDK中使用LOCAL_LDLIBS进行链接LOCAL_LDLIBS:=/home/tsh/work/ndk-demo/dobby/libdobby.aLOCAL_LDLIBS+=-llog如果在AOSP环境中中可以使用LOCAL_SHARED_LIBRARIES:=liblogLOCAL_STATIC_LIBRARIES+=/home/tsh/work/ndk-demo/dobby/libdobby.a......
  • .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍
    在Asp.NetCore上面由于现在前后端分离已经是趋势,所以asp.netcoreMVC用的没有那么多,主要以WebApi作为学习目标。一、创建一个WebApi项目我使用的是VS2022,.Net7版本。在创建界面有几项配置:配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置Ht......
  • 交易遇到的问题
    1.常见,联网踩坑问题。技术深度,手段。交易一致性问题重复支付问题支付回调(有时差,丢失会重试)分布式系统防重操作update时判断状态,已经是成功的状态,则不发货了,直接返回成功。防重幂等:每次请求过来,返回的结果都一样。 更改订单状态通知发货交易订单的状态机超......
  • MySQL逻辑架构图
    整体架构MySQL可以分为Server层和存储引擎层两部分。不同的存储引擎(不同的表可以设置不同的存储引擎)共用一个Server层(从连接器到执行器)。查询流程连接器Command列显示Sleep表示空闲连接。如果客户端太长时间没动静,那么连接器会自动将它断开,由参数wait_timeout控制,默认值是8......