您好,欢迎来到刀刀网。
搜索
您的当前位置:首页Netty之Pipeline总结

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

八、自定义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 来触发相应的操作。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务