大致流程
1.customer会先调用代理类 ,获取 invoker 然后进行 过滤 如 有服务降级到话 就进行 mockinver。再通过spi进行负载均衡。
2.得到invoker后进行 构造请求头。通过netty 或者 本地暴露进行调用
3.服务端收到请求后,会丢给线程池。
业务线程会根据 servicekey从 exporterMap 获取对应的invoker,调用真正的实现
4.客户端收到结果后会根据request 获取存储的feature。完成服务调用
dubbo中服务调用的三种方式(2.6的方式)
代码在 DubboInvoker 的 doInvoke 中。
-
oneway:
还是很常见的,就是当你不关心你的请求是否发送成功的情况下,就用 oneway 的方式发送,这种方式消耗最小,啥都不用记,啥都不用管。
-
异步调用
其实 Dubbo 天然就是异步的,可以看到 client 发送请求之后会得到一个 ResponseFuture,然后把 future 包装一下塞到上下文中,这样用户就可以从上下文中拿到这个 future,然后用户可以做了一波操作之后再调用 future.get 等待结果。 -
同步调用
,这是我们最常用的,也就是 Dubbo 框架帮助我们异步转同步了,从代码可以看到在 Dubbo 源码中就调用了 future.get,所以给用户的感觉就是我调用了这个接口的方法之后就阻塞住了,必须要等待结果到了之后才能返回,所以就是同步的。
可以看到 Dubbo 本质上就是异步的,为什么有同步就是因为框架帮我们转了一下,而同步和异步的区别其实就是future.get 在用户代码被调用还是在框架代码被调用。
但是2.7有新特性 异步化改造
2.7新特性 异步化改造
核心代码:
save for 2.6.x compatibility, for example, TraceFilter in Zipkin uses com.alibaba.xxx.FutureAdapter
翻译 :
为了2.6的兼容性,使用了下面代码
暂时没特别明白,
详见下面:
https://blog.csdn.net/qq_27243343/article/details/100171932
参考资料 :
https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453146350&idx=1&sn=059e12e95c2866e54d714012bc4f7d10&scene=21#wechat_redirect