Netty源码之——ChannelPipeline
Posted 弄死熊猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty源码之——ChannelPipeline相关的知识,希望对你有一定的参考价值。
在此之前,已经介绍过netty server的线程模型和启动流程,今天主要来介绍一个netty非常重要,但是大家平时编码又接触不到的一个概念——ChannelPipeline。
如果从领域驱动设计(DDD)的角度来看的话,ChannelPipeline应该是netty框架中最大的一个聚合根。为什么这么说呢,下面我就用源码来给大家解读一下。
如上图代码所示,DefaultChannelPipeline是netty框架默认的ChannelPipeline,我们可以看到,里面主要有三个属性head、tail的channelHandlerContext和一个channel对象,也就是说channelpipeline其实是聚合了channelHandlerContext和channel对象的聚合根。
如上图,我们可以看到,它的构造函数里面对channel和tail、head的context做了初始化,仔细看能看到,context里面是有pre和next属性的,讲head和tail以链表的结构关联起来,所以总结下来,channelpipeline其实就是channel和一个链表结构的context的封装。
如上图,从defaultchannelpipeline的父类接口可以看出,它的所有方法都是对channel和channelhandler的具体操作。这个时候大家可能会疑惑,怎么突然多出个channelhandler出来。不用着急,我们接着往下看。
如上图,这个是之前在defaultchannelpipeline里面什么channelhandlercontext对象类的部分代码,可以看出channelhandlercontext的方法其实都是调用channelhandler在进行具体操作,也就是说channelpipeline其实就是channel和一个关于链式结构的channelhandler的聚合。现在我们也许可以理解网上很多博文说的channelpipeline是一个让channel流通的管道,管道上面有很多槽位,来对channel进行不同的操作,他们所说的槽位就是我在这里介绍的的channelhandler链表。关于channelhandler,其实用过netty的同学应该知道,我们接受netty数据流的时候多多稍稍会实现或者继承关于channelhandler的抽象类或者接口,没错,就是我们看到的这个channelhandler链表,外层用自旋的方式调用channelpipeline的不同方法把channel传入channelhandler就实现了channel在个管道中流向不同的槽位的操作。channelpipeline的addlast方法是我们初始化netty server的时候最常用的方法,调用它会把你传进去的自定的channelhandler加到channelhandler的链表中去,具体是加到tail之前的最后一个channelhandler后面,其他的方法根据方法名的含义我就可以知道会把handler加入到链表的哪个位置。再举一个例子,firechannelregistered方法就是在channel注册的时候把channel传入到channelhandler里面,让用去实现对channel里的数据具体操作。最后奉上一个简单的关于channelpipeline聚合根的结构图
至此,整个channelpipeline的结构就已经大致的过了一遍了,如有理解偏差,望指正。最后,希望本文能对对netty有兴趣的同学理解netty有所帮助。
欢迎转载、使用、重新发布,但务必署名文章原作者 弄死熊猫
以上是关于Netty源码之——ChannelPipeline的主要内容,如果未能解决你的问题,请参考以下文章