这篇里主要说下dubbo中和netty通信相关的源码部分,consumer端主要的几个流程包括,发起连接connect,发起refer,发起请求request,接收响应,断开连接等等。
AbstractPeer
connect过程:
DubboInvoker中的Exchange currentClient
DubboProtocol中getClients,initClient会Exchangers的connect
Exchanger(HeaderExchanger)的connect,该方法会返回一个HeaderExchangeClient,里面包含一个NettyClient,在NettyClient中设置了HeaderExchangeHandler这个ChannelHandler(HeaderExchangeHandler的received的handleResponse)
Transporters.connect
Transporter.connect(NettyTransporter)
NettyClient构造
AbstractClient构造调用doOpen,doConnect
doOpen是创建bootstrap
doConnect是调用bootstrap的connect
connect成功后会得到一个channel(netty的channel),绑定到NettyClient中。
todo
DubboInvoker作为入口
DubboInvoker的doInvoke方法
HeaderExchangeClient的request方法
HeaderExchangeChannel的request方法
HeaderExchangeChannel的send方法
NettyClient(AbstractPeer)的send方法
NettyChannel的send方法
NioClientSocketChannel的write方法(这里会用netty的线程来接管处理(通过添加任务的方式),到这里为止就到了Netty的原始世界中了)
返回值是一个future。同步和异步的区别,就是这里对future的处理方式:
同步:
用get阻塞获取future的结果就是同步,
异步:
直接返回一个对future的封装(AsyncRpcResult),然后通过回调通知的方式告知调用段结果就是异步。
整体来看,就分成两大部分,第一部分是dubbo封装的一堆handler,channel的各种构造转换和调用,第二部分是netty部分,不管怎么花里胡哨,最后都要NioClientSocketChannel这个最根本的netty写请求。这个channel是netty的bootstrap发起连接操作成功后得到的channel。
纵观整个调用,NettyClient是离netty最近的一个封装类,HeaderExchangeXXX是离用户最近的一个封装类。
consumer接收请求和流程和consumer发请求的流程类似,也分成两大部分,一部分是dubbo封装的操作,另一部分是netty接管的操作,只不过和consumer发请求相比,接收请求的流程是反过来的,所以首先是Netty的部分,
NettyHandler的messageReceived(继承自netty的SimpleChannelHandler)
NettyClient(AbstractPeer)的received
MultiMessageHandler的received
HeartbeatHandler的received
AllChannelHandler的received
执行ChannelEventRunnable
DecodeHandler的received
DecodeableRpcResult的decode
HeaderExchangeHandler的received,这是最后一层handler,下面就是对response的处理了,在最后一节截图阐述了。
再次看下调用链,可以得到和上一个章节一致的结论,NettyClient是离netty最近的一个封装类,HeaderExchangeXXX是离用户最近的一个封装类。