前言
详细请看我的这篇文章:Netty之大动脉Pipeline
一、channel、pipeline与hander的关系
- 一个channel,拥有一个pipeline——handler容器
- handler不能直接放到pipeline中,必须包裹在AbstractChannelHandlerContext中。
- AbstractChannelHandlerContext包含:HeadContext、DefaultContext、TailContext
二、Pipeline图示
三、Head
入站起点。数据从channel读入后,一个入站数据包从channel的事件发送出来,从Head开始,依次到所有入站处理器,逐个处理。
四、Tail
当所有入站处理完成后,开始出站从Tail开始,逐个经过所有出站处理器处理,然后将处理结果写到channel。
五、Pipeline结构
六、ChannelOutboundHandler和ChannelInboundHandler
- Head是ChannelOutboundHandler
- Tail是ChannelInboundHandler
七、 ChannelInitializer的添加
客户端:
Bootstrap#connect()——>Bootstrap#doResolveAndConnect——>AbstractBootstrap#initAndRegister——>Bootstrap#init
- 在init方法里,会有config.hander()代码(它就是ChannelInitlizer内定义的Handler),将它加入到pipeline中
- 插入的时候会判断是否inbound和是否ountbound
- ChannelInitializer实现了ChannelInboundHandler接口
- DefaultHandlerContext的inbound=ture,outbound=false
八、自定义Handler添加过程
AbstractBootstrap#initAndRegistery——>gourp().register(channel)——>MultithreadEventLoopGroup#register(channel)——>next().register()【EventLoop】.......
- 在AbstractUnsafe#registrer0方法,这个方法调用pipeline.fireChannelRegistered()
- 这个方法会从tail开始遍历handler,找到第一个inbound为true的channelChannelHandlerContext,找到的就是ChannelInitaliler.channelRegistered(),它会执行initChannel方法(就是我们自定义的地方)
- 接着就是将自定义的ChannelHandler插入到了pipeline
注意:此时pipeline的结构就加入了我们自定义的Handler - 最终pipeline将移除掉ChannelInitlializer
九、Pipeline传播机制
这里是源码注释自带的图,但是跟我们下面描述有些不符
——我们先以描述的为准
描述:
- inbound从head传播到tail
- ountbound从tail传播到head
十、outbound传播方式
Bootstrap.connect()——>AbstractChannel.connect()——>pipeline.connect()——>tail.connect()——>AbstractChannelHandlerContext.connect()===>
接着执行到findContextOuntbound():从tail开始查找第一个outbound为true的handler===>
调用invokeConnect方法:调用ountboundHandler的connect方法,如没有重写,则调用channelOutboundHandlerAdapter之后,会调用下一个Context.connect(),最终在head.connect中调用unsafe.connect
十一、inbound
调用connect之后怎么执行inbound:
AbstractNioUnsafe.connect()——>fulfillConnectPromise()——>pipeline.fireChannelActive()——>AbstractChannelHandlerContext.invokeChannelActive【先是head】
从head一次执行下一个inbound的channelActive.......
十二、channel生命周期
Netty 有一个简单但强大的状态模型,并完美映射到ChannelInboundHandler 的各个方法。下面是Channel 生命周期中四个不同的状态:
- channelUnregistered() Channel已创建,还未注册到一个EventLoop上
- channelRegistered() Channel已经注册到一个EventLoop上
- channelActive() Channel是活跃状态(连接到某个远端),可以收发数据
- channelInactive() Channel未连接到远端
一个Channel 正常的生命周期如下图所示。随着状态发生变化相应的事件产生。这些事件被转发到ChannelPipeline中的ChannelHandler 来触发相应的操作。