Netty源码阅读笔记1:ChannelPipeline责任链模式

源码系列 专栏收录该内容
4 篇文章 0 订阅

工作中接触到很多框架底层都采用了Netty作为通信组件,比如阿里的dubbo,蘑菇街的tesla等,于是对Netty产生了好奇,想看一看这个传说中的基于事件的异步IO框架到底是怎么实现的。经过断断续续地对Netty对源码的阅读,渐渐的有了一些体会,记下来,怕自己忘记。

关于Netty的介绍这里就不写了,官网已经介绍地很详细了:netty官网 本文只谈自己阅读netty源码的一些感想。

初读netty源码的时候,感觉一头雾水,找不到真正处理业务逻辑的地方,Channel、ChannelPipeline、ChannleHandlerContext、ChannelHandlerInvoker等一大堆类感觉很混乱,其实它们之间的关系和职责还是挺清晰的,如下图所示:
ChannelPipeline关系图

各个类的职责如下:
Channel:封装了jdk原生的channel,提供统一的API,作为其它各个功能组件的容器。

ChannelPipeline:责任链模式的核心组件,ChannelHandler的容器,按顺序组织各个ChannelHandler,并在它们之间转发事件。

ChannelHandlerContext:封装一个具体的ChannelHandler,并为ChannelHandler的执行提供一个线程环境(ChannelHandlerInvoker)可以理解为ChannelPipeline链路上的一个节点,节点里面包含有指向前后节点的指针,事件在各个ChannelHandler之间传递,靠的就是ChannelHandlerContext。

ChannelHandlerInvoker:顾名思义,是ChannelHandler的一个Invoker,它存在的意义是为ChannelHandler提供一个运行的线程环境,默认的实现DefaultChannelHandlerInvoker有一个EventExecutor类型的成员,就是Netty的EventLoop线程,所以默认ChannelHandler的处理逻辑在EventLoop线程内。当然也可以提供不同的实现,替换默认的线程模型。

ChannelHandler: 真正对IO事件作出响应和处理的地方,也是Netty暴露给业务代码的一个扩展点。一般来说,主要业务逻辑就是以自定义ChannelHandler的方式来实现的。

ChannelPipeline 有一个著名的Inbound和outBound事件流模型,javadoc里面的图已经能说明问题了,但是可能还是有很多人搞不清头和尾,因此,自己画了下面的图:
ChannelPipeline 流向图

最接近底层socket的是head,最接近业务层的是tail,业务方配置的handler都是基于两者之间的。

关于ChannelPipeline,只需要了解DefaultChannelPipeline这个默认的实现类,这个类其实就是一个链表管理类,管理者每一个ChannelHandlerContext类型的节点,从它的addFirst、addLast、remove等成员方法就可以看出来。

ChannelHandler是一个顶级接口,有两个子接口ChannelInboundHandler和ChannelOutboundHandler分别处理read和write相关的IO事件,为了便于业务方实现,两个子接口分别有一个简单的Adapter实现类,所有方法的默认实现都是代理给ChannelHandlerContext类(其实是不关心事件,直接转发给pipeline中下一个节点的handler来处理)。业务方实现自己的ChannelHandler时,推荐继承相应的Adapter类,只实现自己关心的事件的处理方法。

  • 0
    点赞
  • 2
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

一天到晚游泳的鱼_89

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值