Netty之Pipeline总结

前言

详细请看我的这篇文章:Netty之大动脉Pipeline

一、channel、pipeline与hander的关系

  • 一个channel,拥有一个pipeline——handler容器
  • handler不能直接放到pipeline中,必须包裹在AbstractChannelHandlerContext中。
  • AbstractChannelHandlerContext包含:HeadContext、DefaultContext、TailContext

wpsABAD.tmp

 

二、Pipeline图示

wps4A81.tmp

 三、Head

        入站起点。数据从channel读入后,一个入站数据包从channel的事件发送出来,从Head开始,依次到所有入站处理器,逐个处理。

四、Tail

        当所有入站处理完成后,开始出站从Tail开始,逐个经过所有出站处理器处理,然后将处理结果写到channel。

五、Pipeline结构

 

 六、ChannelOutboundHandler和ChannelInboundHandler

  • Head是ChannelOutboundHandler
  • Tail是ChannelInboundHandler

七、 ChannelInitializer的添加

客户端:

Bootstrap#connect()——>Bootstrap#doResolveAndConnect——>AbstractBootstrap#initAndRegister——>Bootstrap#init

  1.  在init方法里,会有config.hander()代码(它就是ChannelInitlizer内定义的Handler),将它加入到pipeline中
  2. 插入的时候会判断是否inbound和是否ountbound
  3. ChannelInitializer实现了ChannelInboundHandler接口
  4. DefaultHandlerContext的inbound=ture,outbound=false

八、自定义Handler添加过程 

AbstractBootstrap#initAndRegistery——>gourp().register(channel)——>MultithreadEventLoopGroup#register(channel)——>next().register()【EventLoop】.......

  1. 在AbstractUnsafe#registrer0方法,这个方法调用pipeline.fireChannelRegistered()
  2. 这个方法会从tail开始遍历handler,找到第一个inbound为true的channelChannelHandlerContext,找到的就是ChannelInitaliler.channelRegistered(),它会执行initChannel方法(就是我们自定义的地方)
  3. 接着就是将自定义的ChannelHandler插入到了pipeline
    注意:此时pipeline的结构就加入了我们自定义的Handler
  4. 最终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 生命周期中四个不同的状态:

  1. channelUnregistered() Channel已创建,还未注册到一个EventLoop上
  2. channelRegistered() Channel已经注册到一个EventLoop上
  3. channelActive() Channel是活跃状态(连接到某个远端),可以收发数据
  4. channelInactive() Channel未连接到远端

 一个Channel 正常的生命周期如下图所示。随着状态发生变化相应的事件产生。这些事件被转发到ChannelPipeline中的ChannelHandler 来触发相应的操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值