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

2022-11-30 15:05:32 浏览数 (1)

1 pipeline是什么?

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

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

ChannelHandler接口具有两个子接口:

  • ChannelInboundHandler
  • ChannelOutboundHandler

可以将ChannelInboundHandler和ChannelOutboundHandler实例都添加到Netty ChannelPipeline。

  • 添加了ChannelInboundHandler、ChannelOutboundHandler实例的ChannelPipeline

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

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

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

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

  • 因此,若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 异常的传播

最佳实践

8 pipeline总结

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

inbound 事件类型顺序正相关 outbound 逆相关

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

0 人点赞