博客
关于我
Netty源码—5.Pipeline和Handler一
阅读量:789 次
发布时间:2023-02-15

本文共 3141 字,大约阅读时间需要 10 分钟。

Netty Pipeline和Channel Handler深入解析

Netty作为一个高性能的网络框架,依赖于Channel Pipeline和Channel Handler的强大功能来处理复杂的网络通信逻辑。本文将从基础到高级深入探讨Netty的Channel Pipeline和Channel Handler,帮助开发者全面理解其工作原理和应用场景。

Pipeline和Handler的作用和构成

Pipeline和Handler的作用

在处理复杂的业务逻辑时,避免if else的泛滥,实现对业务逻辑的模块化处理。将不同的逻辑放置到单独的类中,串联起来形成完整的逻辑处理链。

Netty通过责任链模式组织代码逻辑,支持逻辑的动态添加和删除,方便各类协议的扩展。

Pipeline和Handler的构成

一个连接对应一个Channel,处理逻辑在Channel Pipeline中。Channel Pipeline是双向链表结构,与Channel一对一对应。每个结点是一个ChannelHandlerContext对象,包含逻辑处理器Channel Handler,处理独立的逻辑。

ChannelHandlerContext对象包含必要的上下文信息,与Channel Pipeline保持关联。

Channel Handler的分类

Channel Handler分为Inbound和Outbound两大子接口:

  • Inbound Channel Handler:处理读数据逻辑,主要方法为channelRead()。
  • Outbound Channel Handler:处理写数据逻辑,主要方法为write()。

默认实现类为ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,分别实现Inbound和Outbound事件的传播。

Inbound事件传播到下一个Inbound Handler,Outbound事件传播到下一个Outbound Handler。事件执行顺序与添加顺序一致,Inbound事件的执行顺序与Outbound事件相反。

Inbound事件通常由IO线程触发,包括注册、活跃、读取、完成、不活跃等事件。触发方法均带有fire字样,如fireChannelRegister()、fireChannelActive()等。

Outbound事件通常由用户主动触发,包括绑定、连接、断开、关闭、注册、读取等操作,触发方法如bind()、connect()、write()等。

特殊的Channel Handler

1. ChannelInboundHandlerAdapter

实现ChannelInboundHandler接口,避免直接实现ChannelHandler,减少代码冗余。

2. ChannelOutboundHandlerAdapter

实现ChannelOutboundHandler接口,同样减少代码冗余。

3. ByteToMessageDecoder

用于自定义解码,自动管理内存,避免手动处理ByteBuf。

4. SimpleChannelInboundHandler

用于处理指令处理,简化逻辑,避免冗长的if else判断。

5. MessageToByteEncoder

用于自定义编码,自动管理ByteBuf创建和返回。

Channel Handler的生命周期

1. 回调方法执行顺序

  • 新建连接:handlerAdded() → channelRegistered() → channelActive() → channelRead() → channelReadComplete()。
  • 关闭连接:channelInactive() → channelUnregistered() → handlerRemoved()。

2. 应用场景

  • handlerAdded()与handlerRemoved()用于资源管理。
  • channelActive()与channelInactive()用于TCP连接状态管理。
  • channelRead()用于数据处理和拆包。
  • channelReadComplete()用于批量刷新。

Channel Pipeline的事件处理

1. 消息读取和发送流程

  • Inbound事件:读取数据,依次经过各ChannelHandler处理。
  • Outbound事件:发送数据,从TailContext开始,依次处理。

2. Pipeline特征

  • 动态添加删除Channel Handler。
  • 线程安全,使用synchronized关键字。

Channel Pipeline问题整理

1. Netty如何判断Channel Handler类型

使用executionMask区分Inbound和Outbound事件类型。Inbound事件Mask范围为1-8,Outbound事件Mask范围为9-16。

2. 添加Channel Handler的顺序

Inbound事件传播顺序与添加顺序一致,Outbound事件传播顺序与添加顺序相反。

3. 手动触发事件传播方式区别

  • ctx.writeAndFlush():触发Outbound事件,按顺序传播。
  • ctx.channel().writeAndFlush():只触发当前结点的Outbound事件。

Channel Pipeline初始化

1. 初始化时机

服务端启动和客户端连接接入时,创建Channel Pipeline。

2. 初始化内容

  • Pipeline由Channel创建,包含HeadContext和TailContext。
  • 每个结点保存ChannelHandlerContext,包含必要的上下文信息。

3. Pipeline说明

保存Channel引用,处理Inbound和Outbound事件,支持动态添加删除Channel Handler。

添加和删除Channel Handler

1. 客户端代码示例

bootstrap.childHandler(new ChannelInitializer
() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast(new Spliter()); p.addLast(new Decoder()); p.addLast(new BusinessHandler()); p.addLast(new Encoder()); }});

2. Pipeline添加Channel Handler

通过addLast()方法添加,检查重复添加,创建ChannelHandlerContext结点,添加到链表,回调handlerAdded()。

3. 删除Channel Handler

通过remove()方法移除结点,释放资源。

事件和异常传播

  • 读写事件通过Pipeline传播。
  • 异常通过fireExceptionCaught()传播。

总结

通过理解Channel Pipeline和Channel Handler的工作原理,开发者可以更高效地构建和管理网络通信逻辑。Netty的责任链模式提供了灵活性和扩展性,使开发过程更加简便。

转载地址:http://nvcfk.baihongyu.com/

你可能感兴趣的文章
Net操作Excel(终极方法NPOI)
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
net网络查看其参数state_dict,data,named_parameters
查看>>
Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载
查看>>
NeurIPS(神经信息处理系统大会)-ChatGPT4o作答
查看>>
neuroph轻量级神经网络框架
查看>>
Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
查看>>
new Blob()实现不同类型的文件下载功能
查看>>
New Concept English three (35)
查看>>
NEW DATE()之参数传递
查看>>
New Journey--工作五年所思所感小记
查看>>
new Queue(REGISTER_DELAY_QUEUE, true, false, false, params)
查看>>
New Relic——手机应用app开发达人的福利立即就到啦!
查看>>
new work
查看>>
new 一个button 然后dispose,最后这个button是null吗???
查看>>
NewspaceGPT的故事续写能力太强了
查看>>
NewspaceGPT绘制时序图
查看>>
NewspaceGPT绘制类图
查看>>
new一个对象的过程
查看>>
new和delete用法小结
查看>>