ChannelPipeline&ChannelHandler

ChannelPipeline&ChannelHandler

ChannelPipleline和ChannelHandler机制类似于Servlet和Filter机制。
它将Channel的数据管道抽象为ChannelPipeline,消息在ChannelPipeline中流动和传递。

1 ChannelPipeline

ChannelPipeline是ChannelHandler的容器,负责ChannelHandler的管理和事件拦截与调度。
ChannelPipeline是线程安全的,多个业务线程可以并发操作ChannelPipeline而不存在多线程并发问题。

1.1 ChannelHandler管理

ChannelPipeline支持运行态动态的添加或删除ChannelHandler。

1.2 事件
1.2.1 inbound

inbound一般由IO线程触发。
当等待事件达到时,IO线程触发IO事件,事件通过HeaderHandler、ChannelHandler。。。TailHandler拦截处理。
它是事件处理的总入口,以fireXXX命名的方法都是从IO线程流向用户业务Handler的inbound事件。

  1. fireChannelRegistered。Channel注册事件
  2. fireChannelActive。TCP链路建立成功,Channel激活
  3. fireChannelRead。读事件
  4. fireChannelReadComplete。读操作完成事件
  5. fireExceptionCaught。异常通知事件
  6. fireUserEventTriggered。用户自定义事件
  7. fireChannelWritablityChanged。可写状态变化通知事件
  8. fireChannelInactive。链路关闭,不可以通知事件
1.2.2 outbound

由用户线程或代码发起的IO操作被称为outbound。
当用户线程发起网络IO操作,消息从TailHandler开始,经过ChannelHandlerN…ChannelHandler1,HeadHandler,最终被执行。

  1. bind。绑定本机地址
  2. connect。链接到服务器
  3. write。发送事件
  4. read。读事件
  5. flush。刷新事件
  6. disconnect。断开链接事件
  7. close。关闭链接事件

2 ChannelHandler

实现事件的拦截和处理。
相当于Servlet的Filter过滤器。
拆包、粘包、编码、解码都由它完成。

2.1 注解
2.1.1 Shard

多个ChannelPipeline公用同一个ChannelHander

2.1.2 Skip

忽略该Handler

2.2 实现
2.2.1 ChannelHandlerAdapter

所有接口实现都是事件穿透

2.2.2 ByteToMessageDecoder

将字节数组或字节缓冲区解码为业务对象。

2.2.3 MessageToMessageDecoder

二次解码器,将一个对象二次解码为其他对象。

2.2.4 LineBasedFrameDecoder

依次遍历ByteBuf对象,如果发现\n \r\n则就以此为结束位置,从可读索引到结束索引区间的字节组成一行。

2.2.5 DelimiterBasedFrameDecoder

可以自动完成以分隔符作为码流结束标识的消息的解码。

2.2.6 FixedLengthFrameDecoder

固定长度的解码器,能够按照指定长度对消息进行自由的解码。

2.2.7 LengthFieldBasedFrameDecoder

消息体的长度存放在消息中,通过解析长度信息进行解码,从而避免粘包和拆包问题

  1. lengthFieldOffset。长度字段的偏移量
  2. lengthFieldLength。长度字段的长度
  3. lengthAdjustment。长度修正参数
  4. initialBytesToStrip。初始化数据读取时忽略长度
2.2.8 MessageToByteEncoder

将pojo对象编码成ByteBuf

2.2.9 MessageToMessageEncoder

将一个对象编码成另一个对象。

2.2.10 LengthFieldPrepender

计算当前待发送的二进制字节长度,将该长度添加到ByteBuf得缓冲头中。
lengthFieldPrepender为true时,消息长度将包含长度本身所占用的字节数。

3 ChannelHandlerContext

ChannelHandler管理的方式,将Channel相关资源Channel、EventExecutor、ChannelHandlerInvoker、ChannelHandler进行封装,并在ChannelPipeline中以双向链表的方式进行组织。

wenxinzizhu wechat
扫一扫,添加我的微信,一起交流共同成长(备注为技术学习)