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

本文深入探讨了Dubbo中消费者端使用Netty进行通信的关键步骤,包括发起连接、引用服务、发起调用和接收响应。从AbstractPeer的connect开始,详细解析了DubboInvoker、HeaderExchanger、NettyClient以及NettyChannel等组件的角色和交互,展示了如何通过Netty的bootstrap建立连接并发送请求。同时,提到了同步与异步调用的区别,并强调了NettyClient和HeaderExchangeHandler作为与Netty和用户交互的重要接口。
摘要由CSDN通过智能技术生成

这篇里主要说下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)

Transporters.connect

Transporter.connect(NettyTransporter)

NettyClient构造

AbstractClient构造调用doOpen,doConnect

doOpen是创建bootstrap

doConnect是调用bootstrap的connect

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

2.refer

todo

3.发起调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值