上篇我们介绍了Exchangeclient初始化,地址如下
Dubbo源码解读-Exchangeclient初始化-CSDN博客
本文主要针Dubbo消费端DubboInvoker涉及到的知识点进行汇总一下 。方便理解之前ExchangeClient和后面DubboInvoker的调用流程。
大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
DubboInvoker总结和调用流程铺垫
- DubboInvoker对象初始化时,getClient()创建Client和handler的执行连
- HeaderExchangeClient-》
- 主要类:
- HeaderExchangeChannel.request():发送请求
- HeaderExchangeHandler.receive():接受服务端响应
- DefaultFeature.doReceive():设置response,唤醒get方法
- 发起请求是会生成一个流水号ID,即request对象id属性。服务端响应也会带上这个ID
- DefaultFeature有两个全局变量
- FUTURES:请求ID和Feature
- CHANNELS:请求ID和NettyClient
- get():阻塞等待
- doReceive()收到服务端响应,唤醒get()方法
- callBack.实现消费端回调。
- 一个请求,对应一个应答。所有请求创建的defaultFeature保存在DefaultFeature里面。消费端应答时,通过请求流转过程中的ID,获取对应的defaultFeature。再进对get()方法唤醒。
- request(ID)->defaultFuture<-response(ID)
- 消费端链路:
- 请求链路:HeaderExchangeClient.request()->HeaderExchangeChannel.request()->NettyClient.send()->nettyChannel
- 响应链路:NettyClientHandler->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangeHandler->defalutFutrue.doReceive()
- 服务端链路:
- 请求链路:HeaderExchangeServer->*->NettyServer->NettyServerHandler
- 响应链路:NettyServerHandler->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangeHandler->ExchangeHandlerAdapter.reply()->DubboExporter.getInvoker->Invoker执行[Filter1-》Filter2-〉invokerDelegete->AbstractProxyInvoker->wrapper->ServiceClass]
- 服务端接收请求和消费端接收响应的入口
- 消费端:NettyClientHandler.channelRead(),然后调用上面Handler执行链,最后调用defaultfuture.doRecieve()设置response,唤醒get方法
- 服务端:NettyServerHandler.channelRead(),然后调用上面Handler执行链,接着调用ExchangeHandlerAdapter.reply()方法->找到DubboExport,获取Invoker执行链,挨个调用。最后钓到abstractProxyInvoker持有的被代理对象,也就是对应Service的方法。
- 序列化方式:默认Hession(原因:目前为止最稳定且效率最高的)
总结:上面内容中,每个从业务流程和源码角度进行了详细分析,如果大家有疑问或者对文章排版任何方面有建议都可以留言评论,看到都会及时回复大家。
知识总结,分享不易,全文手敲,欢迎大家关注点赞评论收藏。
当然如果觉得文章写的不错,也可点击大赏按钮,深深的鼓励一下博主。哈哈!!!!