Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端

这篇里主要说下dubbo中和netty通信相关的源码部分,consumer端主要的几个流程包括,发起连接connect,发起refer,发起请求request,接收响应,断开连接等等。

1.发起连接

AbstractPeer

connect过程:

DubboInvoker中的Exchange currentClient

DubboProtocol中getClients,initClient会Exchangers的connect

Exchanger(HeaderExchanger)的connect,该方法会返回一个HeaderExchangeClient,里面包含一个NettyClient,在NettyClient中设置了HeaderExchangeHandler这个ChannelHandler(HeaderExchangeHandler的received的handleResponse)

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第1张图片

Transporters.connect

Transporter.connect(NettyTransporter)

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第2张图片

NettyClient构造

AbstractClient构造调用doOpen,doConnect

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第3张图片

doOpen是创建bootstrap

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第4张图片

doConnect是调用bootstrap的connect

connect成功后会得到一个channel(netty的channel),绑定到NettyClient中。

2.refer

todo

3.发起调用

DubboInvoker作为入口

DubboInvoker的doInvoke方法

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第5张图片

HeaderExchangeClient的request方法

HeaderExchangeChannel的request方法

HeaderExchangeChannel的send方法

NettyClient(AbstractPeer)的send方法

NettyChannel的send方法

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第6张图片

NioClientSocketChannel的write方法(这里会用netty的线程来接管处理(通过添加任务的方式),到这里为止就到了Netty的原始世界中了)

返回值是一个future。同步和异步的区别,就是这里对future的处理方式:

同步:

用get阻塞获取future的结果就是同步,

异步:

直接返回一个对future的封装(AsyncRpcResult),然后通过回调通知的方式告知调用段结果就是异步。

Netty第二章 2020 7-2——Netty在Dubbo中的应用(1)Consumer端_第7张图片

整体来看,就分成两大部分,第一部分是dubbo封装的一堆handler,channel的各种构造转换和调用,第二部分是netty部分,不管怎么花里胡哨,最后都要NioClientSocketChannel这个最根本的netty写请求。这个channel是netty的bootstrap发起连接操作成功后得到的channel。

纵观整个调用,NettyClient是离netty最近的一个封装类,HeaderExchangeXXX是离用户最近的一个封装类。

4.接收请求

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是离用户最近的一个封装类。

你可能感兴趣的:(netty,netty)