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

news2025/1/10 23:26:44

一、责任链模式

适用场景:

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

优点:

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

缺点:

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

二、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>() {  //初始化通道
                        @Override
                        protected void initChannel(Channel channel) throws Exception {
                            
                            //1.创建ChannelPipeline 和 tail 节点、head 节点
                            ChannelPipeline pipeline = channel.pipeline();
                            
                            //2.创建ChannelPipelineContext
                            //3.用ChannelPipelineContext来包装Handler
                            pipeline.addLast(new HttpServerCodec());   //添加的Handler
                            pipeline.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.coloradmin.cn/o/1969221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openeuler的mariadb数据库安装

下载数据库 yum install mariadb-server 如果出现文件冲突如下删除即可 yum remove selinux-policy-targeted --nobest --nobest 无视需求关系 systemctl enable --now mariadb.service #自启动 mysql_secure_installation 初始化Mysql根据自己需求填y|n 第一次进…

运动耳机界的“冠军之选”!奥运会冠军同款耳机曝光!

近期&#xff0c;相信大家的目光都被奥运会所吸引&#xff0c;作为一个有着多年使用蓝牙耳机经验的专业测评师&#xff0c;在此告诉大家&#xff0c;其实有很多奥运会选手在训练的时候会戴耳机&#xff0c;因为这样不仅可以缓解训练中的疲惫&#xff0c;而且可以增加训练的激情…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.4…

InfluxDB的安装与使用

目录 1.influxDB的下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb-1.8.3_windows_amd64.zip 2.在D盘创建一个influxDB的文件夹 3. 在安装目录输入cmd,执行influxd.exe 4.启动成功 5.下载nssm安装相关服务&#xff0c;下载地址https://nssm.cc/…

Xinstall全渠道统计服务,轻松掌握App用户全生命周期数据

在当今数字化时代&#xff0c;App的推广和运营显得尤为重要。然而&#xff0c;面对复杂多变的推广渠道和用户行为&#xff0c;如何精准地评估渠道效果、提升获客能力&#xff0c;成为了众多App运营者面临的难题。此时&#xff0c;Xinstall作为一站式App全渠道统计服务商&#x…

大麦网抢票攻略:使用Python Selenium实现

随着互联网技术的发展&#xff0c;在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而&#xff0c;面对热门活动&#xff0c;门票往往在开售瞬间被抢购一空。为了解决这一问题&#xff0c;本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…

Linux线程1

守护进程 1.守护进程的特点 后台服务进程 独立于控制终端 周期性执行某任务 不受用户登录注销影响 一般采用以d结尾的名字&#xff08;服务&#xff09; 2 . 进 程 组 进程的组长 组里边的第 一 进程 进 程 组 的ID 进 程 中 的 组 长 的ID 进 程 中 组 长 的 选 择 …

SQL注入——搜索型注入

搜索型注入——原理介绍 一些网站为了方便用户查找网站的资源&#xff0c;都对用户提供了搜索的功能&#xff0c;因为是搜索功能&#xff0c;往往是程序员在编写代码时都忽略了对其变量(参数)的过滤&#xff0c;而且这样的漏洞在国内的系统中普遍的存在; 其中又分为 POST/GET…

实验2-5-2 生成3的乘方表

//实验2-5-2 生成3的乘方表//输入一个非负整数n&#xff0c;生成一张3的乘方表&#xff0c;输出30~3n的值。可调用幂函数计算3的乘方。 #include<stdio.h> #include<math.h> int main(){int n;int num0;scanf("%d",&n);//输入在一行中给出一个非负整…

Opencv threshold函数、adaptiveThreshold函数详解和示例

1.threshold函数 double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type ) src&#xff1a;待二值化的图像&#xff0c;图像只能是 CV_8U 和 CV_32F 两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。dst&#xff1a;…

全球汽车橡胶减震支架市场规划预测:未来六年CAGR为2.5%

随着汽车行业的持续发展和消费者对驾驶舒适性的需求增加&#xff0c;汽车橡胶减震支架作为提升车辆稳定性和乘坐舒适性的关键组件&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车橡胶减震支架行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场…

反序列化靶机serial漏洞复现 超详细教程

环境搭建 漏洞环境&#xff1a;https://www.vulnhub.com/entry/serial-1,349/ 下载后使用Vmware打开 创建新的虚拟机&#xff1a; 选择客户机版本为Ubuntu 64位&#xff1a; 一直下一步&#xff0c;知道选择使用现有磁盘&#xff1a; 选择下载的vmdk磁盘文件&#xff1a; 开机…

生信技能55 - WisecondorX分析结果过滤和质控

WisecondorX分析CNV,对每条染色的CNV loss和gain进行分组,对每个组求ratio平均值和zscore平均值,基于该数值对CNV进行质控和过滤,并对连续的CNV进行合并,获得可信的CNV。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动…

利用扩散模型的反馈优化图片理解模型

利用扩散模型的反馈优化图片理解模型 自从 DDPM 以来&#xff0c;扩散模型已经成为了绝对主流的图片生成模型。最近&#xff0c;有研究者开始探索如何将扩散模型的生成能力用于提升判别模型的能力。主要有三种用法&#xff1a;生成模型反演用作判别模型、生成模型用于数据增强…

案例分享—国外优秀UI设计作品

国外 UI设计作品之所以出色&#xff0c;首先在于它们对用户体验的极致追求。设计师们深入了解用户需求&#xff0c;通过细腻的界面布局、直观的交互逻辑和丰富的视觉元素&#xff0c;打造出让用户爱不释手的作品。同时&#xff0c;他们勇于创新&#xff0c;不断尝试新的设计理念…

说说你们出来打工转了几个行业?

先说说我吧&#xff0c;大学毕业出来就从事智能交通刷卡方面&#xff0c;后来又从事多年的自动化控制&#xff0c;接着又做智能停车系统&#xff0c;接着又做医疗&#xff0c;美容仪器&#xff0c;仪器仪表&#xff0c;开关电源……做的有点杂&#xff0c;你们呢&#xff1f;一…

旧版本的Oracle OCM证书怎么升级到最新版本?

一、先来说一下OCM认证&#xff0c;全称是&#xff1a;Oracle Certified Master - Oracle认证大师&#xff0c;是Oracle数据管理员的最高级别的认证。 有了OCM证书&#xff0c;可以证明你的专业能力&#xff0c;是 Oracle 数据库管理方面具备高级和全面技能的权威认证。在竞争…

好用的抠图小技巧

在ps里的抠图方法 方法一&#xff1a;直接在菜单栏里选择主体&#xff0c;选中主体后会出现蚂蚁线&#xff0c;这个时候可能选区还不够完整&#xff0c;需要借助快速选择工具细化选取&#xff0c;选好之后按ctrlj复制选区就抠好啦 方法二&#xff1a;用快速选择工具直接选取人…

jdk环境、tomcat环境

回顾复习 安装nodejs&#xff0c;和jdk一样的软件运行环境 yum -y list installed|grep epel #是否安装epel yum -y install nodejs node -v #查看版本号 下载对应的nodejs软件npm yum -y install npm npm -v #查 npm set config ....淘宝镜像 安装vue/cli…

PatchCore:工业异常检测中的全面召回

PatchCore&#xff1a;工业异常检测中的全面召回 前言相关介绍PatchCore的工作原理&#xff1a;优点&#xff1a;缺点&#xff1a; 实验环境项目地址LinuxWindows 项目结构具体用法准备数据进行训练进行测试 常见问题ModuleNotFoundError: No module named patchcore解决方法 O…