apachedubbo深度分析(apachedubbo异步调用如何实现)

技术Apache Dubbo全链路异步怎么实现本篇内容介绍了“Apache Dubbo全链路异步怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希

本文介绍了“如何实现Apache Dubbo全链路异步”的相关知识。很多人在实际的案件操作过程中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!

Dubbo从2.7.0版本升级了对java8的支持,支持JUC包中所有基于CompletableFuture的异步编程接口,解决了2.7.0版本之前异步调用函数的不便。

Dubbo异步调用也是基于NIO的无阻塞能力实现的。服务使用者可以并行调用多个远程服务,而无需启动多个线程。通话过程如下:

Apache  Dubbo全链路异步怎么实现

Dubbo2.7.0之前的弊端

在2.7.0之前,Dubbo的服务消费者通过以下方式异步调用服务提供者:

公共接口UserService { String findUser(字符串名称);}//此调用将立即返回nulluserservicefind user(fooid);//获取被调用的Future引用,当返回结果时,会得到通知并设置为这个futurefutureuser Future=rpccontext . getcontext()。get future();user future . get();

或者

//此调用将立即返回nulluserservicefind user(userid);//获取Dubbo的内置ResponseFuture并设置回调response future=((futureadapter)rpccontext . getcontext()。getfuture())。get future();future . setcallback(new response callback(){ @ overridedpublicavitdone(object response){ system . out . print(response);} @ overridedpublicationcated(Throwableexception){ exception . printstacktrace();}});

我们可以看到,从代码的使用和干净程度来看,它是极其不友好的,在异步调用后需要很多额外的操作才能得到结果。

Dubbo2.7.0基于CompletableFuture的增强

2.7.0发布后,Dubbo升级支持java8,同时增强了基于CompletableFuture的异步调用。2.7.0允许接口返回CompletableFuture。有了这种类型的返回值,我们更容易在消费者和提供者端实现异步编程。

基于CompletableFuture的Dubbo2.7.0的几种编程方法

1.接口直接返回CompletableFuture。

基于Dubbo的应用,服务消费者和服务提供商都依赖于第二方SDK。我们可以直接将第二方SDK的接口返回值定义为CompletableFuture类型。根据这种返回值类型,服务消费者可以方便地进行异步调用。

//接口定义了publicationinterceusercservice { comptablefuturefindeduser(string name);}//提供方publicclass userserviceimpletsuserservice

 {    public CompletableFuture<User> findUser(String name) {        return CompletableFuture.supplyAsync(() -> {            try {                Thread.sleep(5000);            } catch (InterruptedException e) {                e.printStackTrace();            }            return new User();        });    }}// Consumer端final UserService userService = (AsyncService) context.getBean("userService");CompletableFuture<User> future = userService.findUser("liuli");future.whenComplete((v, t) -> {    if (t != null) {        t.printStackTrace();    } else {       System.out.println("Response: " + v);    }});

方法2、重载原始方法

如果我们不想修改原始方法,我们可以重载原始方法,并将重载后的方法定义为CompletableFuture类型的返回值。

// 定义接口public interface UserService {    // 原始方法    User findUser(String name);    // 为了保证方法级服务治理规则依然有效,建议保持方法名不变: findUser    // 使用default实现,避免给服务端提供者带来额外实现成本    // boolean placeHoler只是为了实现重载而增加,只要Java语法规则允许,你可以使用任何方法重载手段    default CompletableFuture<User> findUser(String name, boolean placeHolder) {      return CompletableFuture.completedFuture(findUser(name));    }}// Provider端public class UserServiceImpl implements UserService {    @Override    public User findUser(String name) {        return new User();    }}// Consumer端UserService userService = (UserService) context.getBean("userService");CompletableFuture<User> future = userService.findUser("liuli");System.out.println("async call ret :" + future.get());

这样一来,服务消费端可以直接调用重载后的findUser方法即可。

方法3、基于AsyncContext实现异步调用

// 接口定义public interface UserService {    User findUser(String name);}// Provider端public class UserServiceImpl implements UsercService {    public User findUser(String name) {        final AsyncContext asyncContext = RpcContext.startAsync();        // 耗时方法在线程中执行        new Thread(() -> {            User user = new User();            // 返回结果            asyncContext.write(user);        }).start();        return null;    }}// Consumer端UserService userService = (UserService) context.getBean("userService");System.out.println(userService.findUser("liuli"));

在方法体中通过RpcContext.startAsync()开启异步,然后耗时业务在新线程中异步执行,然后执行的结果通过asynvContext.write方法写回,方法直接返回null。

“Apache Dubbo全链路异步怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147018.html

(0)

相关推荐

  • 怎么在网上买鞋,怎样在网络上买到好品质的鞋子

    技术怎么在网上买鞋,怎样在网络上买到好品质的鞋子选择靠谱的网站:假若去淘宝买的话怎么在网上买鞋,不光要选择信誉高的店铺,还要看该店铺买家的评论,是否可以退换,卖家是否加入消保等。不能过于追求低价:在网上销售鞋的很多,但真

    生活 2021年10月30日
  • 英文大小写26个字母,二十六个字母大小写小学英语

    技术英文大小写26个字母,二十六个字母大小写小学英语1、二十六个字母大小写书写顺序英文大小写26个字母:2、26个英文字母及发音音标如下: A a [ei] B b [bi:] C c [si:] D d [di:] E

    生活 2021年10月23日
  • 如何解析Perl命令行程序用法

    技术如何解析Perl命令行程序用法如何解析Perl命令行程序用法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Perl命令行程序命令行程序下面的几个Pe

    攻略 2021年11月12日
  • 毛线鞋,3岁小孩毛线棉鞋怎么织

    技术毛线鞋,3岁小孩毛线棉鞋怎么织你好毛线鞋:很高兴回答“3岁小孩毛线棉鞋怎么织”这个问题。1.准备工具/原料:棒针、毛线。2、方法/步骤:起针30针,双色线交替编织20行.织21行的时候,鞋口留5针不织,从织22行开始

    生活 2021年10月31日
  • 接头发,接头发需要多少钱,求真实答案

    技术接头发,接头发需要多少钱,求真实答案这个具体要看你接什么价位的,我是说假发的发质,有全假的合成纤维发,有半真半假的一半纤维一半真发,有全真的受损发,有全真的健康发等接头发。有一块钱一束,三块一束,八块一束。一般五块钱

    生活 2021年10月31日
  • mysql安装过程中遇到问题怎么办(安装mysql最后一步不成功怎么办)

    技术mysql重新安装的疑问问题有哪些这篇文章主要介绍mysql重新安装的疑问问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!近日遇到一个问题 重新安装了一下系统,但庆幸的是mysql的安

    攻略 2021年12月21日