§1 出站 & 入站
Netty 是通过由多个 Handler
组成的链处理所有通信的
多个 Handler
组成的链即 Pipeline
Handler
本身是具有方向的,通常认为以 读 为处理重点的是 入站,以 写 为处理重点的是 出站
如下图
如何理解出站 & 入站
- 概括的讲
- 从当前程序端发出的是 出站,通常需要写
- 进入当前程序端的是 入站,通常需要读
- 出站、入站是一个相对的概念,随程序端的不同而变化
- 站在 Client,Client -> Server 是 ==出站 ==
- 站在 Server,Server -> Client 是 出站
- 并不是 S->C 是出站、C->S 是入站
如下图所示
出站 & 入站的影响
- 经过不同方向的
Handler
- 出站需要经过
OutBoundHandler
- 入站需要经过
InBoundHandler
- 出站需要经过
- 不同的编解码需求
- 出站通常需要编码
- 入站通常需要解码
§2 Pipeline & ChannelPipeline
作用
- 作为 Handler 的集合,负责处理、拦截出入站 IO 事件
- 很类似过滤器栈,责任链模式
- 可以完全控制 IO 事件的处理方式,并控制各个
ChannelHandler
如何相互调用
结构
- 每个
Channel
都有且仅有一个Pipeline
二者关系参考 并发编程 | Netty - [Reactor 模型] ChannelPipeline
本质上是一个双向链表- 链表的节点类型是
ChannelHandlerContext
,ChannelHandlerContext
内部是ChannelHandler
- 通常不同
Pipeline
中的ChannelHandler
不共享
技术上是可以做到共享的,但是一旦共享就需要处理线程安全问题,影响性能 - 入站、出站的
ChannelHandler
在同一个链表中,但不会互相影响,Handler 与当前操作不符时会直接放行
常用方法
头部追加 Handler
addFirst()
尾部追加 Handler
addLast()