本文共 3141 字,大约阅读时间需要 10 分钟。
Netty作为一个高性能的网络框架,依赖于Channel Pipeline和Channel Handler的强大功能来处理复杂的网络通信逻辑。本文将从基础到高级深入探讨Netty的Channel Pipeline和Channel Handler,帮助开发者全面理解其工作原理和应用场景。
在处理复杂的业务逻辑时,避免if else的泛滥,实现对业务逻辑的模块化处理。将不同的逻辑放置到单独的类中,串联起来形成完整的逻辑处理链。
Netty通过责任链模式组织代码逻辑,支持逻辑的动态添加和删除,方便各类协议的扩展。
一个连接对应一个Channel,处理逻辑在Channel Pipeline中。Channel Pipeline是双向链表结构,与Channel一对一对应。每个结点是一个ChannelHandlerContext对象,包含逻辑处理器Channel Handler,处理独立的逻辑。
ChannelHandlerContext对象包含必要的上下文信息,与Channel Pipeline保持关联。
Channel Handler分为Inbound和Outbound两大子接口:
默认实现类为ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,分别实现Inbound和Outbound事件的传播。
Inbound事件传播到下一个Inbound Handler,Outbound事件传播到下一个Outbound Handler。事件执行顺序与添加顺序一致,Inbound事件的执行顺序与Outbound事件相反。
Inbound事件通常由IO线程触发,包括注册、活跃、读取、完成、不活跃等事件。触发方法均带有fire字样,如fireChannelRegister()、fireChannelActive()等。
Outbound事件通常由用户主动触发,包括绑定、连接、断开、关闭、注册、读取等操作,触发方法如bind()、connect()、write()等。
实现ChannelInboundHandler接口,避免直接实现ChannelHandler,减少代码冗余。
实现ChannelOutboundHandler接口,同样减少代码冗余。
用于自定义解码,自动管理内存,避免手动处理ByteBuf。
用于处理指令处理,简化逻辑,避免冗长的if else判断。
用于自定义编码,自动管理ByteBuf创建和返回。
使用executionMask区分Inbound和Outbound事件类型。Inbound事件Mask范围为1-8,Outbound事件Mask范围为9-16。
Inbound事件传播顺序与添加顺序一致,Outbound事件传播顺序与添加顺序相反。
服务端启动和客户端连接接入时,创建Channel Pipeline。
保存Channel引用,处理Inbound和Outbound事件,支持动态添加删除Channel Handler。
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()); }});
通过addLast()方法添加,检查重复添加,创建ChannelHandlerContext结点,添加到链表,回调handlerAdded()。
通过remove()方法移除结点,释放资源。
通过理解Channel Pipeline和Channel Handler的工作原理,开发者可以更高效地构建和管理网络通信逻辑。Netty的责任链模式提供了灵活性和扩展性,使开发过程更加简便。
转载地址:http://nvcfk.baihongyu.com/