Netty 必知必会(四)—— Channel-Pipeline 责任链

一、责任链模式

适用场景:

  • 对于一个请求来说,如果每个对象都有机会处理它,而且不明确到底是哪个对象会处理请求时,我们可以考虑使用责任链模式实现它,让请求从链的头部往后移动,直到链上的一个节点成功处理了它为止

优点:

  • 发送者不需要知道自己发送的这个请求到底会被哪个对象处理掉,实现了发送者和接受者的解耦
  • 简化了发送者对象的设计
  • 可以动态的添加节点和删除节点

缺点:

  • 所有的请求都从链的头部开始遍历,对性能有损耗
  • 极差的情况,不保证请求一定会被处理

二、Netty中的Channel-Pipeline责任链

Netty 的 Pipeline 管道的设计,就采用了责任链设计模式。

  • ChannelPipeline 管道 保存了Channel通道所有处理器信息
  • 创建新 Channel 时自动创建一个专有的 ChannelPipeline
  • ChannelPipeline里面是一个由多个ChannelHandlerContext串联起来的双向链表
  • 每个ChannelHandlerContext有一个后继指针next和前驱指针prev
  • ChannelHandler则是被包装在ChannelHandlerContext中

1.ChannelHandler 有两个重要的子接口:

  • ChannelInboundHandler:用于拦截入站事件(如数据被接收、新的连接建立等)。
  • ChannelOutboundHandler:用于拦截出站事件(如数据被发送、连接关闭请求等)。

ChannelDuplexHandler 既继承了 ChannelInboundHandlerAdapter,又实现ChannelOutboundHandler 的接口,所以既能入站,也可以出站。

2.ChannelHandlerContext 是 ChannelHandler 的上下文信息。ChannelHandlerContext 负责保存处理器的状态,并且提供了方法来访问 ChannelChannelPipeline 以及其他 ChannelHandler

3.责任传播和终止机制
ChannelHandlerContext 提供了一系列 fireXXX 方法,用于将事件传播给链中的下一个处理器。例如:fireChannelRead(Object msg):当新的数据被读取时,调用这个方法将事件传递给下一个入站处理器。
如果开发者在自定义的 ChannelHandler 中重写了某个事件处理方法,并且没有调用对应的 fireXXX 方法,那么事件的传播就会在该处理器处终止。

  • 在pipeline中的任意一个节点,只要我们不手动的往下传播下去,这个事件就会终止传播在当前节点
  • 对于入站数据,默认会传递到尾节点,进行回收,如果我们不进行下一步传播,事件就会终止在当前节点

4.Netty中事件的定义

5.Pipeline中的handler增添方法

ChannelPipeline是线程安全的,ChannelHandler可以在任何时候添加或删除。

6.Handler的执行分析 

当入站事件时,执行顺序是 1 、 2 、 3 、 4 、 5
当出站事件时,执行顺序是 5 、 4 、 3 、 2 、 1
在这一原则之上, ChannelPipeline 在执行时会进行选择
3 和 4 为出站处理器,因此入站事件的实际执行是 :1 、 2 、 5
1 和 2 为入站处理器,因此出站事件的实际执行是 :5 、 4 、 3
不同的入站事件会触发 handler 不同的方法执行:
上下文对象中 fire** 开头的方法,代表入站事件传播和处理
其余的方法代表出站事件的传播和处理。

三、ChannelPipeline 的创建过程

整个过程如下:

  • 任何一个SocketChannel创建的同时都会创建一个绑定的ChannelPipeline。同时创建 tail 节点和 head 节点,形成最初的双向链表。
  • 在调用 ChannelPipeline 的 addLast等方法的时候,会根据给定的 handler 创建一个 Context, 然后,将这个 Context 插入到链表的尾端(tail 前面)
  • Context 包装 handler,多个 Context 在 pipeline 中形成双向链表
ServerBootstrap serverBootstrap = new ServerBootstrap();   //新建服务器端启动类
serverBootstrap.group(bossGroup, workGroup);               //设置EventLoopGroup线程组
serverBootstrap.channel(NioServerSocketChannel.class)      //设置通道类型:同步非阻塞.handler(new LoggingHandler(LogLevel.DEBUG)).childHandler(new ChannelInitializer<Channel>() {  //初始化通道@Overrideprotected void initChannel(Channel channel) throws Exception {//1.创建ChannelPipeline 和 tail 节点、head 节点ChannelPipeline pipeline = channel.pipeline();//2.创建ChannelPipelineContext//3.用ChannelPipelineContext来包装Handlerpipeline.addLast(new HttpServerCodec());   //添加的Handlerpipeline.addLast(new HttpObjectAggregator(64 * 1024));pipeline.addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS));pipeline.addLast(new HandlerHeartBeat());}  });                        

源码推导见下: 

Netty17——Pipeline、Handler和HandlerContext的创建_pipeline handlercontext-CSDN博客

四、参考

【图解IO与Netty系列】Netty源码解析——ChannelPipeline中的责任链模式_netty责任链源码分析-CSDN博客

深入netty19-netty中的设计模式-工厂、责任链、观察者详解_netty 责任链-CSDN博客

Netty框架之责任链模式及其应用_netty责任链-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388936.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫初识

一、什么互联网 互联网&#xff08;Internet&#xff09;是全球范围内最大的计算机网络&#xff0c;它将数以百万计的私人、公共、学术、商业和政府网络通过一系列标准通信协议&#xff08;如TCP/IP&#xff09;连接起来形成的一个庞大的国际网络。 互联网的起源可以追溯到196…

Java 后端已经过时的技术,也是我逝去的青春

最近这段时间收到了一些读者的私信&#xff0c;问我某个技术要不要学&#xff0c;还有一些的同学竟然对 Java 图形化很感兴趣&#xff0c;还想找这方面的工作。 我接触 Java 已近 10多年了&#xff0c;见证了许多 Java 技术变迁&#xff0c;包括&#xff1a; JavaEE 框架&…

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中&#xff0c;应急事件的发生常常是突如其来的&#xff0c;它们对人民的生命财产安全构成重大威胁&#xff0c;同时也对社会稳定提出严峻挑战。在这样的紧急情况下&#xff0c;迅速开展有效的救援工作显得尤为重要。而在整个救援过程中&#xff0c;应急设备的使用…

1-4章节复习总结

1-4章节总结 章节重点回顾-第一章-中央处理单元练习题 章节重点回顾-第一章-进制章节重点回顾-第一章-校验码奇偶校验码CRC循环冗余校验码海明码练习题 多草节重点回顾-第一草-计算机体系结构分类章节重点回顾-第一章-计算机指令练习题 章节重点回顾-第一章-指令流水线练习题 章…

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研&#xff0c;经理让用canvas做一个表格&#xff0c;于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码&#xff0c;可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…

POI 快速入门 Excel导入导出

Excel导入导出 1 什么是POI POI简介&#xff08;Apache POI&#xff09;&#xff0c;Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI官网http://poi.apache.org/ HSSF &#xff0d; 提…

攻防世界之《这个按钮做什么》题解

下载解压后&#xff0c;发现只有一个文件。 放入exeinfope软件里看看 根据activity猜测可能是安卓软件&#xff0c;修改文件后缀为.apk 然后用模拟器打开这个软件并会自动安装。 打开软件界面如下&#xff1a; 看得出来只有一个密码输入框&#xff0c;应该找到对应的密码就会…

每日一面系列之美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以

ConcurrentHashMap 为什么 key 和 value 不能为 null&#xff1f; ConcurrentHashMap 的 key 和 value 不能为 null 主要是为了避免二义性。null 是一个特殊的值&#xff0c;表示没有对象或没有引用。如果你用 null 作为键&#xff0c;那么你就无法区分这个键是否存在于 Concu…

仓颉语言 -- 网络编程

使用新版本 &#xff08;2024-07-19 16:10发布的&#xff09; 1、网络编程概述 网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。 仓颉为开发者提供了基础的网络编程功能&#xff0c;在仓颉标准库中&#xff0c;用户可使用…

资源|Python入门必看书籍,适合零基础小白,附PDF

小编为初学Python的朋友们汇总了7本零基础入门书籍&#xff0c;包括Python三剑客等&#xff0c;都是在编程届多年畅销的书籍&#xff0c;也是众多从业者的选择&#xff0c;全文详细介绍了书籍主要内容&#xff0c;有需要的宝子根据自身情况自取 需要书籍PDF的宝子评论区留言哦 …

IIS解析漏洞~IIS6.X漏洞分析

类型代码量作用一句话木马代码量极少配合webshell管理工具使用小马代码量比小马多大马代码量最多功能比较完善&#xff08;执行命令&#xff0c;文件操作等&#xff09;图片马里面传有一句话木马 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本)&am…

我在高职教STM32——串口通信(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享…

Python机器学习实战:分类算法之支持向量机-垃圾邮件识别

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 目录 支持向量机算法介绍 练习题 Python代码与分析 支持向量机和朴素贝叶斯的联系 支持向量机算法介绍 支持向量机&#…

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述

企业邮箱如何支持免费试用?

企业邮箱如何支持免费试用&#xff1f;Zoho企业邮箱提供多种版本&#xff0c;支持免费试用&#xff0c;具备权威认证、信息安全、全球部署等特点。试用步骤包括访问官网、选择版本、输入信息、验证域名等。特色功能包括定制化界面、搜索、日程安排等。支持多种设备和操作系统。…

腾讯服务器单机版 kafka 3.7 安装

1.Kafka是什么 Kafka是Apache开源的一款基于zookeeper协调的分布式消息系统&#xff0c;具有高吞吐率、高性能、实时、高可靠等特点&#xff0c;可实时处理流式数据。它最初由LinkedIn公司开发&#xff0c;使用Scala语言编写。 Kafka历经数年的发展&#xff0c;从最初纯粹的消…

MySQL:QEP 查询执行计划

QEP QEP 是指查询执行计划&#xff08;Query Execution Plan&#xff09;&#xff0c;它是由数据库系统在执行查询时生成的一组操作指令。这些指令定义了查询的具体执行方式&#xff0c;包括涉及哪些表、使用哪些索引、以及哪些算法、操作符等。 查询执行计划是数据库查询优化…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理&#xff08;ITSM&#xff09;在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键&#xff0c;还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容&#xff0c;深入探…

搭建日志系统ELK(二)

搭建日志系统ELK(二) 架构设计 在搭建以ELK为核心的日志系统时&#xff0c;Logstash作为日志采集的核心组件&#xff0c;负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显&#xff1a; 占用较多的服务器资源。配置复杂&#xff0c;学习曲线陡峭。处理大数据量时…

FPGA开发——呼吸灯的另一种实现方式

一、概述 关于呼吸灯的设计其实在前面的文章中就已经提到过&#xff0c;这篇文章更多的针对前面的实现方式进行一个改良。在前面的呼吸灯的设计使用的是us、ms、s的三级计数器进行功能实现&#xff0c;这种实现方法应该是我们最后理解也是最常用的方式。但经过蜂鸣器的音乐播放…