上篇我们介绍了ExchangeClient初始化原理,地址如下
Dubbo源码解读-Exchangeclient初始化-优快云博客
本文主要针Dubbo消费端调用流程中,DubboInvoker的调用流程,从dubbo源码角度进行解析。
大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
主要内容
- 关联知识介绍
- DubboInvoker的调用流程解析
- 图解调用流程
关联知识介绍
- 消费端调用流程
消费端依赖注入服务端后,当消费端请求服务端时,调用流程为:MockClusterInvoker->FailOverClusterInvoker->DubboInvokerr.doInvoke().最终回调DubboInvoker类。DubboInvoker调用前的详细流程可跳转至
https://mp.youkuaiyun.com/mp_blog/creation/editor/138048991
- ExchangeClient初始化过程。
- DubboInvoker调用流程总结和铺垫
DubboInvoker.doInvoker的调用流程解析
概括流程
MockClusterInvoker.invoke->FailOverClusterInvoker.invoke->DubboInvoker.doInvoke()
流程总结如下:
- 单工通信:消费端注解配置。method:isReturn=false;
- 不需要返回值,减少一次服务端给客户端响应的TCP通信
- 不需要创建DefaultFeature
- 异步处理:
- netty本来就是异步通信,不等待返回结果。返回ResponseFuture设置到Rpc上下文。
- 需要返回结果时,调用ResponseFuture.get()阻塞等待即可
- 双端通信(消费端分两个流程发送请求和接受服务端应答)
- 发送请求:(clinet链负责发送请求)
- headerExchangeChannel.request():
- 创建DefaultFuture类并返回,调用NettyClient发送请求.
- DefaultFuture:持有持有FUTURES:请求ID和Feature
- CHANNELS:请求ID和NettyClient。
- 调用default.get()进行阻塞等待。
- 接受应答:(Handler链负责接受请求或者应答)
- 服务端有数据返回时,回调用NettyClientHandler.channelRead()方法。
- 开始调用Handler的执行链。
- HeartbeatHandler:发送心跳应答
- AllChannelHandler:服务隔离思想,获取线程池异步执行
- DecodeHandler:编解码,Hession进行反序列化
- HeaderExchangeHandler:
- 服务端:
- 双工通信:处理请求,调用Filter执行链,最终调用Service方法。并将结果通过channel返回给客户端。
- 单工通信:直接处理请求
- 消费端:
- 根据请求ID获取对应的defaultFuture
- 设置Response
- 唤醒get方法