广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >怎么使用Dubbo异步处理
  • 946
分享到

怎么使用Dubbo异步处理

2024-04-02 19:04:59 946人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么使用dubbo异步处理”,在日常操作中,相信很多人在怎么使用Dubbo异步处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Dubbo异步处理”

这篇文章主要介绍“怎么使用dubbo异步处理”,在日常操作中,相信很多人在怎么使用Dubbo异步处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Dubbo异步处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

异步调用

我们平常大部分都是使用 Dubbo 的同步调用,即调用 Dubbo 请求之后,调用线程将会阻塞,直到服务提供者返回结果。

那相反,Dubbo 异步调用就不会阻塞调用线程,那么在服务提供者返回结果这段时间,我们就可以执行其他业务逻辑。

下面我们从代码示例,来学习一下如何使用 Dubbo 异步调用。

PS:下面例子 Dubbo 版本为 2.7。

第一种方式

Dubbo 异步调用是针对方法级别,所以我们需要对引用接口中指定方法做一些专门的配置。

异步调用配置其实与普通 xml服务引用配置类似,只不过我们还需要增加一个 dubbo:method将指定方法配置成异步调用。

示例 xml 配置如下:

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

服务引用配置完成之后,此时如果直接调用这个方法,将会立即返回 null,内部将会异步执行服务端调用逻辑。

// 此调用会立即返回null String world = asyncService.sayHello("world");

// 画个时序图

如果我们需要获取服务提供者返回的结果,那么此时需要借助 rpcContext。这个类是 Dubbo 中专门用于保存 「RPC」  调用过程中一些关键信息。

因此我们可以借助这个类可以获取到 「RPC」 很多信息,这次我们主要使用下面的方法获取 CompletableFuture。

RpcContext.getContext().getCompletableFuture()

CompletableFuture 是 jdk1.8 之后提供的异步任务增强类,我们可以直接调用其 get 方法直接获取返回结果。

// 此调用会立即返回null String world = asyncService.sayHello("world"); // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future CompletableFuture<String> helloFuture = RpcContext.getContext().getCompletableFuture(); helloFuture.get();

这里需要注意一点。调用get 方法之后,线程就会被阻塞,「直到服务端返回结果或者服务调用超时」。

另外如果不想线程被阻塞,我们可以使用 whenComplete,添加回调方法,然后异步处理返回结果。

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

从上面的例子我们可以看到, Dubbo 消费端异步调用借助了JDK 提供的  CompletableFuture,这个类非常强大,提供的方法也非常多。

小黑哥之前写过一篇文章,比较完整的介绍了 CompletableFuture的用法,感兴趣可以深入学习一下。

// TODO 文章

上面的方式我们使用 xml引用服务,不过现在很多同学应该直接使用 Dubbo 注解引用服务。

如果想直接使用注解方式,其实也非常简单,只要使用 @Method注解即可。

配置方法如下:

@Reference(interfaceClass = AsyncService.class,         timeout = 1000,         methods = {@Method(name = "sayHello", async = true)}) private AsyncService asyncService;

第二种方式

第一种方式我们还需要额外修改 Dubbo 相关配置,相对来说比较繁琐。那第二种方式就不需要做额外配置了,它只要使用  RpcContext#asyncCall就可以直接完成异步调用。

示例代码如下:

// 使用  asyncCall 异步调用 CompletableFuture<String> f = RpcContext.getContext().asyncCall(() -> asyncService.sayHello("async call request")); // get 将会一直阻塞到服务端返回,或者直到服务调用超时 System.out.println("async call returned: " + f.get());  // 异步调用,不关心服务端返回 RpcContext.getContext().asyncCall(() -> {     asyncService.sayHello("one way call request1"); });

这种方式返回依然是 CompletableFuture对象,操作方式就如同第一种方式。

第三种方式

终于到了最后一种方式了,这种方式与上面两种方式都不太一样,其完全不需要借助RpcContext就可以完成,开发流程与普通 Dubbo 服务一样。

首先需要服务提供者事先定义 CompletableFuture 签名的服务:

public interface AsyncService {     CompletableFuture<String> sayHello(String name); }

「注意接口的返回类型是 CompletableFuture。」

服务端接口实现逻辑如下:

public class AsyncServiceImpl implements AsyncService {     private static Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);      @Override     public CompletableFuture<String> sayHello(String name) {         return CompletableFuture.supplyAsync(() -> {             try {                 Thread.sleep(10000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             return "async response from provider.";         });     }  }

服务端需要使用 CompletableFuture 完成业务逻辑。

消费端这时就不需要借助了 RpcContext,可以直接调用服务提供者。

// 调用直接返回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.")

这种方式对于调用者来就比较方便,无需引入其他对象,可以像使用同步的方式使用异步调用。

其他参数

上面介绍了三种的 Dubbo 异步调用的使用方式,下面主要介绍一下异步调用涉及其他参数。

sent

我们可以在 dubbo:method 设置:

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

也可以在注解中设置:

@Reference(interfaceClass = XXX.class,         version = AnnotationConstants.VERSION,         timeout = 1000,         methods = {@Method(name = "greeting", timeout = 3000, retries = 1, sent = false)})

默认情况下sent=false, Dubbo 将会把消息放入 IO 队列,然后立刻返回。那这时如果宕机,消息就有可能没有发送给服务端。

那如果我们将其设置成 sent=true,Dubbo 将会等待消息发送发出才会返回,否则将会抛出异常。

return

Dubbo 异步调用默认将会创建 Future 对象,然后设置到 RpcContext 中。那我们如果不关心返回值,只想单纯的异步执行,那我们可以配置  return="false",以此减少 Future 对象的创建和管理成本。

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

到此,关于“怎么使用Dubbo异步处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么使用Dubbo异步处理

本文链接: https://www.lsjlt.com/news/83910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用Dubbo异步处理
    这篇文章主要介绍“怎么使用Dubbo异步处理”,在日常操作中,相信很多人在怎么使用Dubbo异步处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Dubbo异步处理”...
    99+
    2022-10-19
  • dubbo异步调用的原理是什么
    Dubbo异步调用的原理是通过使用线程池来实现异步调用。首先,服务消费者发送请求给服务提供者,然后服务提供者将请求放入线程池中进行处...
    99+
    2023-10-23
    dubbo
  • JavaScript中怎么处理异步
    JavaScript中怎么处理异步,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、回调函数回调是一个函数被作为一个参数传递到另一个函数里,在...
    99+
    2022-10-19
  • NodeJs中怎么使用async和await处理异步
    NodeJs中怎么使用async和await处理异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。场景远古时代我们在编写exp...
    99+
    2022-10-19
  • Node.js中怎么实现异步处理
    这篇文章将为大家详细讲解有关Node.js中怎么实现异步处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。异步的“坑”最近一段时间参与开发了一个Node.j...
    99+
    2022-10-19
  • dubbo服务调用异常怎么解决
    要解决Dubbo服务调用异常,可以参考以下几个步骤:1. 检查服务提供者和消费者的配置是否正确,包括注册中心地址、服务接口、版本号等...
    99+
    2023-10-23
    dubbo
  • RocketMQ怎么实现请求异步处理
    这篇文章主要介绍“RocketMQ怎么实现请求异步处理”,在日常操作中,相信很多人在RocketMQ怎么实现请求异步处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”RocketMQ怎么实现请求异步处理”的疑...
    99+
    2023-06-19
  • 如何使用async/await来处理异步
    这篇文章将为大家详细讲解有关如何使用async/await来处理异步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先说一下async的用法,它作为一个关键字放到函数前面,...
    99+
    2022-10-19
  • PHP中使用Redis实现异步处理
    随着互联网的发展,Web应用程序的性能和效率成为了关注的焦点。而PHP是一种常用的Web开发语言,Redis则是一款流行的内存数据库,如何将二者结合起来提高Web应用程序的性能和效率就成为了一个重要的问题。Redis是一个非关系型内存数据库...
    99+
    2023-05-16
    PHP redis 异步处理
  • AndroidRxJava异步数据处理库使用详解
    目录观察者模式操作符创建Observable转换Observable过滤Observable组合Observable错误处理Schedulers调度器-解决多线程问题管理RxJava...
    99+
    2022-11-13
    Android RxJava异步数据处理 Android RxJava
  • SpringMVC如何使用ListenableFuture进行异步处理
    这篇文章主要介绍了SpringMVC如何使用ListenableFuture进行异步处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用 ListenableFuture ...
    99+
    2023-06-17
  • SpringMVC如何使用ResponseBodyEmitter进行异步处理
    小编给大家分享一下SpringMVC如何使用ResponseBodyEmitter进行异步处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用 Response...
    99+
    2023-06-17
  • SpringMVC如何使用Callable进行异步处理
    这篇文章将为大家详细讲解有关SpringMVC如何使用Callable进行异步处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用 Callable 进行异步处理使用 Callable 进行异步处理与 ...
    99+
    2023-06-17
  • SpringMVC如何使用DeferredResult进行异步处理
    这篇文章主要介绍SpringMVC如何使用DeferredResult进行异步处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用 DeferredResult 进行异步处理DeferredResult 这个类代表...
    99+
    2023-06-17
  • SpringMVC如何使用StreamingResponseBody进行异步处理
    这篇文章主要介绍SpringMVC如何使用StreamingResponseBody进行异步处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用 StreamingResponseBody 进行异步处理如果希望跳过...
    99+
    2023-06-17
  • Java中怎么处理异步超时的问题
    这篇文章主要讲解了“Java中怎么处理异步超时的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中怎么处理异步超时的问题”吧!一天,我在改进多线程代码时被Future.get()卡...
    99+
    2023-06-17
  • python中异步IO怎么同时处理请求
    小编给大家分享一下python中异步IO怎么同时处理请求,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python主要应用领域有哪些1、云计算,典型应用OpenS...
    99+
    2023-06-14
  • JavaScript异步怎么理解
    本篇内容主要讲解“JavaScript异步怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript异步怎么理解”吧! 导读 首先,要知道J...
    99+
    2022-10-19
  • node 中如何使用Async异步处理模块
    今天就跟大家聊聊有关node 中如何使用Async异步处理模块,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Async异步处理模块!以下是小sam的...
    99+
    2022-10-19
  • PHP中如何使用Redis实现异步处理
    这篇“PHP中如何使用Redis实现异步处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP中如何使用Redis实现异步...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作