笔记原文:05 | 服务编排层:Pipeline 如何协调各类 Handler ?
我们可以认为 EventLoop 是 Netty 的调度中心。
实际的业务处理逻辑则是由 ChannelPipeline 中的 ChannelHandler 完成
学完本篇尝试回答下面问题:
1、ChannelPipeline 与 ChannelHandler 的关系是什么?它们之间是如何协同工作的?
2、ChannelHandler 的类型有哪些?有什么区别?
3、Netty 中 I/O 事件是如何传播的?
原始的网络字节流经过 Pipeline ,被一步步加工,最后得到成品。
ChannelPipeline 由一组ChannelHandler 实例组成,可以把ChannelPipeline 看作是 ChannelHandler 的载体
在 ChannelPipeline 的内部,多个ChannelHandlerContext 组成双向链表
每一个 Channel 会绑定一个 ChannelPipeline
每一个 ChannelPipeline 都包含多个 ChannelHandlerContext
每一个 ChannelHandlerContext 都对应一个 ChannelHandler
⭐️
DefaultChannelPipeline 有2个内部类 HeadContext、 TailContext
HeadContext 实现了 ChannelInboundHandler 和 ChannelOutboundHandler 接口。
HeadContext 是入站的第一站,出站的最后一站。
HeadContext 负责读取数据并开始传递 InBound 事件,数据处理完成后,数据会反方向经过 出站处理器,最终传递到 HeadContext。
// TODO 需要图解
TailContext 只实现了 ChannelInboundHandler 接口。
TailContext 是出站的第一站,入站的最后一站。
TailContext 用于终止 Inbound 事件传播,比如释放 Message 数据资源等
I/O 事件的生命周期
ChannelHandler 是围绕 I/O 事件的生命周期所设计的,例如建立连接、读数据、写数据、连接销毁等
ChannelHandler 有两个重要的子接口:ChannelInboundHandler 和 ChannelOutboundHandler,分别拦截入站和出站的各种 I/O 事件。
1、ChannelPipeline 与 ChannelHandler 的关系是什么?它们之间是如何协同工作的?
ChannelPipeline 是双向链表结构,包含 ChannelInboundHandler 和 ChannelOutboundHandler 两种ChannelHandler 。
2、ChannelHandler 的类型有哪些?有什么区别?
ChannelInboundHandler 、ChannelOutboundHandler两中类型
ChannelInboundHandler 用来处理入站事件
ChannelOutboundHandler 用来处理出站事件
3、Netty 中 I/O 事件是如何传播的?
入站事件和 出站事件的传播方向相反,入站事件的传播方向为 Head -> Tail,而 出站事件传播方向是 Tail -> Head。