Netty源码解析实战(6)-pipeline

1 pipeline是什么?

ChannelPipeline是Netty中很是核心的概念。每一个Netty SocketChannel包含一个ChannelPipeline。markdown

ChannelPipeline包含ChannelHandler实例的list。当数据移入和移出SocketChannel时,将调用这些ChannelHandler实例。数据结构

ChannelHandler接口具备两个子接口:ide

  • ChannelInboundHandler
  • ChannelOutboundHandler

能够将ChannelInboundHandler和ChannelOutboundHandler实例都添加到Netty ChannelPipeline。编码

  • 添加了ChannelInboundHandler、ChannelOutboundHandler实例的ChannelPipeline

从SocketChannel接收到数据后,该数据将传递到ChannelPipeline中的第一个ChannelInboundHandler。此ChannelInboundHandler处理数据,而后将数据传递到ChannelPipeline中的下一个ChannelInboundHandler。3d

实际上,ChannelInboundHandler能够在将接收到的数据传递到管道中的下一个处理器以前对其进行转换。例如,原始的字节能够转换为HTTP对象或其余一些对象。而后,管道中的下一个处理器将看到HTTP对象,而非原始数据。netty

当将数据写回到SocketChannel时,它以相同方式发生。数据从ChannelOutboundHandler传递到ChannelPipeline中的ChannelOutboundHandler,直到到达SocketChannel。 ChannelOutboundHandler实例还能够转换流程中的数据。对象

尽管该图将ChannelInboundHandler和ChannelOutboundHandler实例显示为单独的列表,但它们实际上位于同一list(管道)中。blog

  • 所以,若ChannelInboundHandler决定将某些内容写回SocketChannel,则数据将经过比ChannelInboundHandler写入数据更早的ChannelPipeline中位于全部ChannelOutboundHandler实例。

    Netty具备编解码器(编码器+解码器)的概念。 Netty编解码器将字节转换为消息对象(Java对象),或将消息对象转换为字节。例如,编解码器可能会将传入的HTTP请求的原始字节转换为HTTP对象,或者将HTTP响应对象转换回原始字节。

Netty编解码器对象实际上只是一个(或两个)ChannelHandler实现。编解码器一般由将请求字节转换为对象的ChannelInboundHandler实现和将响应对象转换为字节的ChannelOutboundHandler组成。接口

Netty随附了几种不一样协议的编解码器,例如HTTP,WebSocket,SSL / TLS等。为了将这些协议与Netty一块儿使用,您必须将相应的协议编解码器ChannelInboundHandler和ChannelOutboundHandler添加到要使用的SocketChannel的ChannelPipeline中协议。事件

  • netty是如何判断ChannelHandler类型的?
  • 对于ChannelHandler的添加应该遵循什么顺序?
  • 用户手动触发事件传播,不一样的触发方式有什么区别?
2 pipeline初始化

pipeline在建立Channel的时候被建立


双向链表结构

Pipeline节点数据结构: ChannelHandlerContext


看看其一个实现类

基本数据结构组件

Pipeline中的两大哨兵: head和tail




3 添加ChannelHandler

先看看用户代码

判断是否重复添加


















用户方自定义实现便可

6 outBound事件的传播



















同理之后的过程

7 异常的传播









对应 tail 为当前节点的情形

最佳实践
在最后定义异常处理器,不然默认是 tail 节点的警告打印信息
全部异常最终处理位置

8 pipeline总结



调用 pipeline 添加节点时,netty 会使用 instanceof 关键字判断当前节点是 inboound 仍是 outbound 类型,分别用不一样的 boolean 类型变量标识

inbound 事件类型顺序正相关
outbound 逆相关
异常处理器要么从 head 或者 tail 节点开始传播 inbound事件则从当前节点开始传递到最后节点 outbound事件则从当前节点开始传递 到第一个 outbound节点