购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 Dubbo客户端通信原理

经过对服务器端各个技术组件的学习,理解Dubbo客户端通信原理就会容易很多。我们在介绍服务器端时所引入的Exchanger和Transporter接口都同时包含了对客户端方法的定义,而Transporter的实现类NettyTransporter也提供了NettyClient,如代码清单3-21所示。

代码清单3-21 NettyTransporter类代码

这些与NettyTransporter相关的核心类之间的关系如图3-5所示。

图3-5 与NettyTransporter相关的核心类结构图

对图3-5中的很多类我们都已经了解了,因此在介绍Dubbo的客户端通信原理时,不会像介绍服务器端那样全面展开讲解,而是更关注客户端本身的特性,所以我们的思路是先从底层的NettyClient类切入。

与NettyServer类一样,NettyClient也存在一个抽象的父类AbstractClient。作为网络客户端的通用抽象,AbstractClient这个模板类共提供了doOpen、doConnect、doDisconnect、doClose、getChannel这5个模板方法。与服务器端所提供的3个方法相比,客户端还需要关注与Connect这一操作相关的两个方法。

NettyClient中的doOpen方法如代码清单3-22所示,创建ClientBootstrap并完成初始化参数设置。

代码清单3-22 NettyClient中的doOpen方法代码

和NettyServer一样,NettyClient也完成了对Netty框架的封装。在NettyClient的doConnect方法中,同样使用ClientBootstrap完成与服务器端的连接和事件监听。而doDisconnect方法则用于移除当前已经断开连接的Channel。与HeaderExchangeServer类类似,HeaderExchangeClient也添加了定时心跳收发及心跳超时监测机制。

继续从通信过程的底层往上走,会遇到HeaderExchanger和Exchangers类,然后一直追溯到DubboProtocol的initClient方法,该方法完成对ExchangeClient的创建,如代码清单3-23所示。

代码清单3-23 DubboProtocol的initClient方法代码

该方法的调用发生在代码清单3-24所示的getClients方法中。

代码清单3-24 getClients方法代码

值得注意和学习的一点在于,Dubbo在管理客户端资源上引入了共享客户端的概念,通过计数引用的方式来决定是否复用已创建的ExchangeClient。 Jtn5JQ4CfSI7KqJDhCmR6/sJn8T+lkAXo8sLaux1Y+EbLQ9Ak/heHHH54tfi+fDs

点击中间区域
呼出菜单
上一章
目录
下一章
×