Netty4 ChannelPipeLine分析

Netty4 ChannelPipeLine分析

 ChannelPipeLine查找ChannelHandler的顺序:

DefaultChannelHandlerContext.findContextInbound()方法表示正向查找

ChannelStateHandler的实例:

 

 

Netty 4 的 ChannelHandler(s)是以链表的形式连接在一起的,

 

当数据达到时,ChannelPipeline.head(ChannelHandlerContext(含有HeadHandler) )的fireInboundBufferUpdated方法会被调用,

现在来看看DefaultChannelHandlerContext.fireInboundBufferUpdated() 方法:

 

 

 

 

 

 

 

 


DefaultChannelHandlerContext.findContextInbound()方法表示正向查找

ChannelStateHandler的实例:

 

找到ChannelStateHandler后,执行其ChannelHandlerContext的invokeInboundBufferUpdated事件

 

结论: ChannelPipeLine中的ChannelHandler(s)由其对应的ChannelHandlerContext(s)之间形成了链式调用关系:
先是ChannelInboundHandler(s)对应的ChannelHandlerContext(s)之间形成了对invokeInboundBufferUpdated链式调用关系(此时,非ChannelInboundHandler类型的会被跳过),如图:

其中正方法上decoder,aggregator,handler的inboundBufferUpdated方法会被调用 ,而因为encoder不是ChannelStateHandler所以会被跳过.

 

 

 

故验证了以下的结论: ChannelPipeLine中ChannelHandler的执行顺序:

 

 

Nettyt利用一个ThreadLocal的Buffer来 Share same ThreadLocal for all decoder/encoders to minimize memory usage

 

 

 

关于Netty的Zero-Copy的方式:

 

1: 当ChannelInboundHandler

以下为这条处理器链的排列情况:

 

 

现在来看看HttpResponseEncoder的执行情况,此时它将要执行编码操作,

取它的下一个ChannelOutboundHandler(HeadHandler)的输入buffer,作为自己的输出buffer,

中间完全不用临时生成一个buffer,这是好想法!! 

而说回inbound方向上也是一样的,decoder将自己的输入结果直接写到agregator的输入buffer上,

而aggregator也将输出结果直接写到handler的输入buffer上,完成不用开辟临时buffer. 

所以数据流在整个inbound到outbound过程中,是完全不需要开辟新buffer的,这节省了好多 空间开辟与释放的开销.  

在其中一些细节上,Netty也可以在同一次ChannelHandler链的执行过程中,共用一个ThreadLocal<OutputMessageBuf>来避免Buf的创建.

 

ChannelHandlerContext中的关键方法

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值