Dubbo源码分析(三)Exchanger

在一个框架中我们通常把负责数据交换和网络通信的组件叫做Exchanger。Dubbo中每个Invoker都维护了一个ExchangeClient的引用,并通过它和远程的Server进行通信。整个与ExchangeClient相关的类图如下

Dubbo Exchanger

其中包含了remoting相关的接口定义。个人觉得这个接口设计有些过于发杂,但为了可以展示全貌还是把全部内容都画了进去。

ExchangeClient只有一个常用的实现类,HeaderExchangeClient

先通过url获取Exchanger,默认返回一个HeaderExchanger,之后通过它的connect()创建HeaderExchangeClient。

在Invoker需要发送数据时,单程发送使用的是ExchangeClient的send方法,需要返回结果的使用request方法

在实现中这个调用被传递到HeaderExchangeClient维护的HeaderExchangeChannel对象,而channel后续的具体操作又依赖构造函数中传入的Client,这个参数实际是一个Channel接口。

最终send方法传递到channel的send,而request方法则是通过构建ResponseFuture和调用send组合实现的。接下来的重点就是这个Channel参数如何来构建

它来自Transporters的connect方法,具体的Transporter来源于ExtensionLoader,默认为NettyTransporter,由它构建的是NettyClient。NettyClient再次维护了一个Channel引用,来自NettyChannel的getOrAddChannel()方法,创建的是NettyChannel。最终由基类AbstractClient实现的send方法调用了NettyChannel

执行Netty的channel.write()将数据真正发送出去,也可以由此看出boolean sent;参数的含义:是否去等待发送完成、是否执行超时的判断。

本文主要以Client的角度对通信流程进行了介绍,Server端也可以遵循这样的路径去梳理,这里就不再赘述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值