Apache达博全链路异步怎么实现

  介绍

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

达博从2.7.0版本开始,升级了对java8的支持,以JUC包下的CompletableFuture为基础,支持所有异步编程接口,解决了2.7.0版本之前异步调用功能使用上的不方便。

达博异步调用也是基于NIO的非阻塞能力实现的,服务消费端不需要启动多个线程即可完成并行调用多个远程服务,其调用流程如下:

 Apache达博全链路异步怎么实现

<强> Dubbo2.7.0之前的弊端

在2.7.0之前,达博的服务消费者异步调用服务提供者的的方式如下:

<节>
 <代码>公共接口UserService{ <代码>,findUser,字符串(字符串名称); <代码>} <代码> 
<代码>//此调用会立即返回零代码 <代码> userService.findUser (fooId); <代码>//拿到调用的未来引用,当结果返回后,会被通知和设置到此未来 <代码> Future.getFuture userFuture=RpcContext.getContext()(); <代码> userFuture.get();
  

或者

<节>
//,此调用会立即返回nulluserService.findUser (userId);//,拿到达博内置的ResponseFuture并设置回调ResponseFuture  future =, ((FutureAdapter) RpcContext.getContext () .getFuture ()) .getFuture (); future.setCallback (new  ResponseCallback (), {,,, @Override ,,, public  void 完成(Object 响应),{,,,,,,,System.out.print(反应),,,,,},,,,@Override ,,, public  void 抓住(Throwable 例外),{,,,,,,,exception.printStackTrace (),,,,,}}); 
  

我们可以看到,无论从使用方面,还是从代码的整洁度方面,都极不友好,需要进行很多额外的操作才能拿到异步调用后的结果。

Dubbo2.7.0基于CompletableFuture的增强

2.7.0发布后,Dubbo升级到对java8的支持,同时基于CompletableFuture增强了异步调用。2.7.0允许接口返回CompletableFuture,通过这种类型的返回值,我们更容易的实现Consumer、Provider端的异步编程。

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

方法1、接口直接返回CompletableFuture

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

// 接口定义public interface UsercService {    CompletableFuture findUser(String name);}// Provider端public class UserServiceImpl implements UserService {    public CompletableFuture 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 future = userService.findUser("liuli");future.whenComplete((v, t) -> {    if (t != null) {        t.printStackTrace();    } else {       System.out.println("Response: " + v);    }});
  null   null   null

Apache达博全链路异步怎么实现