Netty原理
# Netty原理
# 1、事件传播
- pipeline初始化
①所有channelHandler由channelPipeline统一管理,pipeline维护一个双向链表结构。
②channelPipeline初始化时,会默认创建两个哨兵channelHandler,即HeadContext、TailContext,HeadContext在链表头部,TailContext在尾部,我们添加的channelHandler总是处于二者之间。
③以fineXXX命名的方法都是从IO线程向用户业务handler的inBound事件。

- 传播方式
①通过当前通道ctx.channel()传播,实际上就是通过pipeline传播。
channel传播inbound入站事件时,起点为HeadContext,从左向右触发遇到的第一个inbound事件。
channel传播outbound出站事件时,起点为TailContext,从右向左触发遇到的第一个outbound事件。
②通过ChannelHandlerContext上下文传播。
ctx传播inbound入站事件时,起点为当前channelHandler,从左向右触发遇到的第一个inbound事件。
ctx传播outbound出站事件时,起点为当前channelHandler,从右向左触发遇到的第一个outbound事件。
- 举例
①ByteToMessageDecoder#channelRead调用了channel.writeAndFlush,那么会依次触发MessageToByteEncoder#write事件、HeadContext#write事件;而如果是调用ctx.writeAndFlush那么只会触发HeadContext#write事件。
②BizHandler#channelRead调用了channel.fireChannelRead,那么会依次触发HeadContext#channelRead事件、ByteToMessageDecoder#channelRead事件、BizHandler#channelRead事件...,并会造成读事件的死循环。因此一般传播读事件时会通过ctx.fireChannelRead进行,只会触发TailContext#channelRead事件并结束。