Channel过滤器实现原理与Servlet filter机制一致,它将Channel的数据管道抽象为ChannelPipeline,消息在ChannelPipeline中流动和传递。ChannelPipeline持有I/O事件拦截器ChannelHandler的链表,由ChannelHandler对I/O事件进行拦截和处理,可以方便的通过新增和删除ChannelHandler来实现不同的业务逻辑定制,不需要对已有的ChannelHandler进行修改,能够实现对修改封闭和对扩展的支持。
1、ChannelPipeline功能说明
ChannelPipeline是ChannelHandler的容器,他负责ChannelHandler的管理和时间拦截与调度。
2、ChannelPripeline的事件处理
1)底层的SocketChannel read()方法去读ByteBuf,触发ChannelRead事件,由I/O线程NioEventloop调用ChannelPipeline的fireChannelRead(Object msg)方法,将消息传输到ChannelPipeline中
2)消息依次被HeadHandler、ChannelHandler1、ChannelHandler2.……TailHandler拦截和处理,在这个过程中,任何ChannelHandler都可以中断当前的流程,结束消息的传递
3)调用ChannelHandlerContext的write方法发送消息,消息从TailHandler开始,途经ChannelHandlerN……ChannelHandler1,HeadHandler,最终被添加到消息发送缓冲区中等待刷新和发送,在此过程中也可以中断消息的传递
Netty的事件分为:inbound事件和outbound事件。
inbound事件通常由I/O线程触发,上图的左半部分;触发inbound事件的方法
①ChannelHandlerContext.fireChannelRegistered():Channel注册事件
②ChannelHandlerContext.fireChannelActive():TCP链路建立成功,Channel激活事件
③ChannelHandlerContext.fireChannelRead(Object):读事件
④ChannelHandlerContext.fireChannelReadComplete():读操作完成通知事件
⑤ChannelHandlerContext.fireExceptionCaught(Throwable):异常通知事件
⑥ChannelHandlerContext.fireUserEventTriggered(Object):用户自定义事件
⑦ChannelHandlerContext.fireChannelWritabilityChanged():Channel的可写状态变化通知事件
⑧ChannelHandlerContext.fireChannelInactive():TCP连接关闭,链路不可用通知事件
Outbound事件通常是由用户主动发起的网络I/O操作,上图对应的右半部分。触发Outbound事件的方法如下:
① ChannelHandlerContext.bind(SocketAddress, ChannelPromise):绑定本地地址事件
②ChannelHandlerContext.connect(SocketAddress, Soc