dubbo系列十一、dubbo transport层记录

本文深入探讨了Dubbo的Transport层,分析了服务端和客户端的TCP连接过程,以及NettyServerHandler和NettyClientHandler的角色。内容包括dubbo的ChannelHandler设计,以及请求通信层的完整流程,帮助理解和使用dubbo的网络通信机制。
摘要由CSDN通过智能技术生成

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

前言

dubbo接口方法重载且入参未显式指定序列化id导致ClassCastException分析时候用到了dubbo的通信层和编解码,dubbo有个transport层,默认使用netty4进行网络通信,写的非常好,dubbo的netty4可以直接作为基础模块作为我们项目的通信框架。但是由于dubbo要兼容mina、graazz、netty5等网络通信,因此自定定义了一套Channel、ChannelHandler来适配不同的通信框架,我们看到时候容易搞混乱,实际我们只需要netty4而已,因此记录下dubbo provider和consumer的tcp建立监听和连接,方便排除问题,也用于以后使用到netty4的时候,直接可以迁移过去。

dubbo服务端和客户端建立连接记录

此xmind是针对dubbo系列一、dubbo启动流程的补充,增加了dubbo tcp的监听和连接,如下图 dubbo netty客户端&服务端启动流程,有了此图,以后遗忘了,也很容易回顾起来。

dubbo netty客户端&服务端启动流程

xmind下载地址

dubbo服务端

功能:监听tcp端口,创建NettyServer对象,此对象表示tcp 服务端,持有dubbo channelhandler chain、客户端连接的dubbo channel、监听端口绑定的netty channel。NettyServer也是个ChannelHandler。

服务端netty pipeline 【HeadContext InternalDecoder InternalEncoder NettyServerHandler TailContext】

接收客户端请求,触发pipeline的channelRead事件,执行顺序 HeadContext->InternalDecoder->InternalEncoder->NettyServerHandler->TailContext,仅执行netty pipeline inboud事件

响应客户端请求,触发pipeline的write事件,执行顺序 TailContext->NettyServerHandler->InternalEncoder->InternalDecoder->HeadContext,仅执行netty pipeline outboud事件

其中InternalDecoder/InternalEncoder分别用作dubbo协议解码/编码

重要的是NettyServerHandler,是个inboud&outbound,持有dubbo channelhandler chain(即NettyServer,而NettyServer又持有dubbo channelhandler chain),维护的客户端连接channel集合,而dubbo channel(即NettyChannel)又持有netty channel,在读取请求时候,经过解码后,把netty channel封装为dubbo channel(即NettyChannel),然后由dubbo channelhandler chain链式处理dubbo channel,这样针对不同的通信进行了统一封装,最后由dubbo channel chain调用最终的目标对象。那么我们扩展的话,也只是扩展dubbo channel chain而已。

这里的dubbo channelhandler chain是[NettyServer->MultiMessageHandler->HeartbeatHandler->AllChannelHandler->DecodeHandler->HeaderExchangeHandler->DubboProtocol$1],由NettyServerHandler触发,每个channehandler职责不同,最终由 channelhandler DubboProtocol$1进行调用目标方法,执行业务逻辑。

dubbo客户端

即netty client,连接服务端,和服务端保持长连接,对象是NettyClient,同时也是个ChannelHandler,持有netty channel,持有dubbo channelhandler chain【MultiMessageHandler->HeartbeatHandler->AllDispatcher->DecodeHandler->HeaderExchangeHandler->DubboProtocol$1】。

设计方式和nett server基本相同,也是通过netty pipeline触发dubbo channel chain。

client 端netty pipeline 【HeadContext->InternalDecoder->InternalEncoder->NettyClientHandler->TailContext】。

请求服务端,触发pipeline的write事件,执行顺序 TailContext->NettyClientHandler->InternalEncoder->InternalDecoder->HeadContext,仅执行netty pipeline outboud事件。

接收服务端响应,触发pipeline的channelRead事件,执行顺序 HeadContext->InternalDecoder->InternalEncoder->NettyClientHandler->TailContext&#

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值