前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty源码解析实战(6)-pipeline

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

作者头像
JavaEdge
发布2022-11-30 15:05:32
2900
发布2022-11-30 15:05:32
举报
文章被收录于专栏:JavaEdgeJavaEdge

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 异常的传播

对应 tail 为当前节点的情形
对应 tail 为当前节点的情形

最佳实践

在最后定义异常处理器,否则默认是 tail 节点的警告打印信息
在最后定义异常处理器,否则默认是 tail 节点的警告打印信息
所有异常最终处理位置
所有异常最终处理位置

8 pipeline总结

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 pipeline是什么?
  • 2 pipeline初始化
  • 3 添加ChannelHandler
  • 6 outBound事件的传播
  • 7 异常的传播
  • 8 pipeline总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档