1、Pipeline与ChannelHandler通过责任链设计模式来组织代码逻辑,并且能够支持逻辑的动态添加和删除,Netty能够支持各类协议的扩展,比如HTTP、Websocket和Redis,靠的就是Pipeline和ChannelHandler。
2、无论从服务端来看,还是从客户端来看,在Netty的整个框架里面,一个连接对应着一个Channel。这个Channel的所有处理逻辑都在一个叫作ChannelPipeline的对象里,ChannelPipeline是双向链表结构,它和Channel之间是一对一的关系.
如下图所示,ChannelPipeline里的每个节点都是一个ChannelHandlerContext对象,这个对象能够获得和Channel相关的所有上下文信息。这个对象同时包含一个重要的对象,那就是逻辑处理器
ChannelHandler,每个ChannelHandler都处理一块独立的逻辑
12、ChannelHandler的分类
第一个子接口是ChannelInboundHandler,从字面意思可以猜到,它是处理读数据的逻辑。比如在一端读到一段数据,首先要解析这段数据,然后对这段数据做一系列逻辑处理,最终把响应写到对端。在组装响应之前的所有处理逻辑,都可以放置在一系列ChannelInboundHandler里处理,它的一个最重要的方法就是channelRead()。读者可以将ChannelInboundHandler的逻辑处理过程TCP的七层协议解析过程联系起来,把收到的数据一层层地从物理层上升到应用层。
第二个子接口ChannelOutboundHandler是处理写数据的逻辑,它是定义一端在组装完响应之后把数据写到对端的逻辑。比如,我们封装好一个response对象后,有可能对这个response做一些其他特殊逻辑处理,然后编码成ByteBuf,最终写到对端。它最核心的方法就是write(),读者可以将ChannelOutboundHandler的逻辑处理过程与TCP的七层协议封装过程联系起来。我们在应用层组装响应之后,通过层层协议的封装,直到底层的物理层。
这两个子接口分别有对应的默认实现:
ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,它们分别实现了两大子接口的所有功能,在默认情况下会把读写事件传播到下一个Handler