Netty学习五:Netty框架之服务编排

article/2025/10/3 2:50:23

一、核心编排组件:ChannelPipeLine

ChannelPipeLine是Netty的核心编排组件,负责调度各类ChannelHandler,实际的加工处理由ChannelHandler完成。

ChannelPipeLine可以看做是ChannelHandler的容器,包含一组ChannelHandler实例,内部通过双向链表将ChannelHandler链接在一起。当有I/O读写事件时,依次调用ChannelHandler列表对Channel的数据进行拦截和处理。
image.png
每个Channel绑定一个ChannelPipeLine,每个ChannelPipeLine包含多个ChannelHandlerContext,所有ChannelHandlerCoontext组成双向链表。每个ChannelHandler对应一个ChannelHandlerContext,ChannelHandlerContext可以保存ChannelHandler上下文,同时包含ChannelHandler生命周期的所有事件(如 connect、bind、read、flush、write、close 等)。基于ChannelHandlerContext的封装,可以提取事件传递的前置和后置通用逻辑,降低耦合性。

ChannelPipeLine中包含两大类处理器:InboudHandler入站处理器和OutboundHandler出站处理器,内部的双向链表维护了HeadContext和TailContext的头尾节点,自定义的ChannelHandler会插入两个节点之间。

image.png HeadContext既是Inbound处理器,又是Outbound处理器,分别实现了ChannelInboudHandler和ChannelOutboudHandler。网络数据的写入操作入口就是由HeadContext完成。HeadContext作为头结点负责读取数据并传递InBound事件,当数据处理完后,数据反方向经过Outbound处理器,最终又传到HeadContext,所有HeadContext又是处理OutBound事件的最后一站。此外,HeadContext在传递时间之前还会执行一些前置操作。

TailContext只实现了ChannelOutboudHandler,在ChannelInboundHandler调用链路的最后一步执行,用于终止InBound事件的传播。作为OutBound事件传播的第一站,仅仅是将OutBound事件传递给下一个节点。

Netty支持由Channel直接触发事件,这样调用链路将会贯穿整个ChannelPipeLine。同时,也可以在某一个ChannelHandlerContext触发事件传播,这样只会从当前ChannelHandler开始事件传播,不会从头贯穿到尾。

二、事件处理器:ChannelHandler

ChannelHandler是围绕I/O事件的生命周期(建立连接、读数据、写数据、连接销毁)设计的,包含两个重要子接口:ChannelIInboudHandler和ChannelOutboundHandler,分别拦截入站和出站的各种I/O事件。

ChannelInboudHandler的事件回调方法

事件方法
新的客户端连接事件handlerAdded
通道注册事件channelRegistered
通道处于活动状态事件channelActive
通道数据可读取事件channelRead0
通道数据读取完毕事件channelReadComplete
通道进入非活动状态事件channelInactive
通道移除事件channelUnregistered
处理器移除事件(断开连接)handlerRemoved
异常发生事件exceptionCaught

ChannelOutboundHandler的事件回调方法

image (2).png

三、事件传播机制

ChannelPipeLine中的处理器分为InboundHandler和OutboundHandler两种处理器。InBound事件的传播方向为:Head --> Tail,而OutBound事件的传播方向为:Tail --> Head。
通过以下的代码演示ChannelPipeLine的时间传播机制:

serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) {ch.pipeline().addLast(new SampleInBoundHandler("SampleInBoundHandlerA", false)).addLast(new SampleInBoundHandler("SampleInBoundHandlerB", false)).addLast(new SampleInBoundHandler("SampleInBoundHandlerC", true));ch.pipeline().addLast(new SampleOutBoundHandler("SampleOutBoundHandlerA")).addLast(new SampleOutBoundHandler("SampleOutBoundHandlerB")).addLast(new SampleOutBoundHandler("SampleOutBoundHandlerC"));}
}
public class SampleInBoundHandler extends ChannelInboundHandlerAdapter {private final String name;private final boolean flush;public SampleInBoundHandler(String name, boolean flush) {this.name = name;this.flush = flush;}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("InBoundHandler: " + name);if (flush) {ctx.channel().writeAndFlush(msg);} else {super.channelRead(ctx, msg);}}
}public class SampleOutBoundHandler extends ChannelOutboundHandlerAdapter {private final String name;public SampleOutBoundHandler(String name) {this.name = name;}@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {System.out.println("OutBoundHandler: " + name);super.write(ctx, msg, promise);}
}

最终的控制台输出为:
image (3).png

四、异常传播机制

ChannelPipeLine中的事件传播采用了经典的责任链模式,调用链路环环相扣。但是,如果有一个节点处理逻辑出现异常会怎么样?当用户在自定义的ChannelHandler中对异常没有进行拦截,最终会由TailContext进行拦截。

通过以下代码演示,第一个A节点会抛出RunTimeException。同时重写ChannelInboundHandlerAdapter的exceptionCaught方法,直在开头加上控制台输出

public class SampleInBoundHandler extends ChannelInboundHandlerAdapter {private final String name;private final boolean flush;public SampleInBoundHandler(String name, boolean flush) {this.name = name;this.flush = flush;}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {System.out.println("InBoundHandler: " + name);if (flush) {ctx.channel().writeAndFlush(msg);} else {throw new RuntimeException("InBoundHandler: " + name);}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {System.out.println("InBoundHandlerException: " + name);ctx.fireExceptionCaught(cause);}
}

最终的控制台输出结果为:
image (4).png

实际在用Netty进行开发时,推荐对异常进行同一拦截,然后根据实际业务场景进行更加完善的异常处理机制,参考如下方式:
image.png

具体的代码如下:

public class ExceptionHandler extends ChannelDuplexHandler {@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {if (cause instanceof RuntimeException) {System.out.println("Handle Business Exception Success.");}}
}

最终的控制台输出结果为:
image (5).png


http://chatgpt.dhexx.cn/article/CTtx0LLX.shtml

相关文章

企业级低代码服务编排库 - Commander

写在前面。低代码最近被炒的火热,各种争议不断,我们且不去添油加醋,仔细想来,在一些特定的场景,在整体架构的特定层面,低代码平台确实是可以发挥其长处的,足矣。 一.微服务编排的必…

资源调度和服务编排技术架构

从传统云网融合的角度出发,结合边缘计算、网络云化及智能控制的优势,在算力网络连接下实现更加广泛的算力资源纳管和动态调度。算力网络正是为了提高云、边、端三级计算的协同工作效率而出现的。算力网络资源调度和服务编排整体技术架构如图1所示。 图1 …

如何通过网关做服务编排?

什么是服务编排/数据聚合? 服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务,并对每个服务的返回结果做数据处理,最终整合成一个大的结果返回给前端。 例如一个服务是“查询用户预定的酒店”,前端仅需要传一个订单…

零代码平台中的服务编排思路

先打个广告,我们的第三场零代码实践的直播在本周五( 11 月 5 日 )晚8点准时开始,扫描下面二维码,直接预约直播,到时间微信会自动提醒。 随着企业数字化转型的进程加快,零代码平台的的应用越来越…

Kstry框架一种服务编排的实现

Kstry是什么? 所见( 图示模型 )即所得( 代码执行 )的可视化流程编排框架可轻易将流程从串行升级到并行,支持任务拆分、任务重试、任务降级、子任务遍历、指定超时时间的并发框架共享能力平台侧的微服务业务…

java接口服务编排_GOKU API Gateway CE V3.1.0 发布:新增服务编排、配置版本管理等...

Goku API Gateway (中文名:悟空 API 网关)是一个基于 Golang 开发的微服务网关,能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界…

云原生服务编排技术

基于云原生的服务编排技术主要实现融合计算、存储和网络能力开放,通过云原生和云计算统一编排调度平台来实现底层资源的调度及上层服务编排。运用 OpenStack底层基础设施层的资源调度管理能力,对数据中心内的异构计算资源、存储资源和网络资源可以进行有…

Docker Compose 服务编排

微服务架构中一般会有多个微服务,每一个微服务一般都会部署多个实例,如果每一个服务都手动启动,工作量会很大。服务编排就是按照一定的业务规则进行批量管理容器。 docker基础请参考 Docker相关内容整理(一)_活水774的…

9_服务编排

是什么 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启 动停止,维护的工作量会很大。来看下我们日常工作: 要从Dockerfile build image 或者去 dockerhub 拉取 image要创…

Docker服务编排

概述 服务编排概念 微服务架构的应用系统中一般包含若干个微服务,每个微服务都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。 具体工作大概如下: 从Dockerfile build image或者取dockerhub拉取image。创建多…

详解微服务编排

你的组织是否使用微服务风格的体系结构来实现其业务功能?你使用什么方法来实现微服务的通信和编排?在过去的几年中,微服务一直是一个相当占主导地位的应用程序架构,通常与云平台(例如,容器、K8s、FaaS&…

服务编排-前端应用和后端服务能力间关键衔接

转载自:https://www.toutiao.com/a6922250238791090691/?log_fromce077552cde8e_1635167920723 首先提出一个重要观点,即在当前微服务架构转型中,服务编排将成为一个大的技术发展趋势,其主要原因展开描述如下: 当前…

蚁群算法原理及Matlab实现

转自:https://blog.csdn.net/zuochao_2013/article/details/71872950 原 蚁群算法 2017年05月13日 20:23:13 阅读数:7821 蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年首先提出,并首先…

蚁群算法讲解python

简介 蚁群算法(Ant Clony Optimization, ACO)作为一个启发式群智能算法,它是由一群无智能或有轻微智能的个体通过相互协作而表现出智能行为,从而为求解复杂问题提供了一个新的可能性。 ACO是一种仿生学算法&#xff…

蚁群算法详解(含例程)

该篇博客为课程学习的笔记,含一个例子可以帮助理解蚁群算法,主要为理论知识的总结。 蚁群算法详解 1.算法简介2.Ant System(蚂蚁系统)2.1 路径构建2.2 信息素更新 3. 改进的蚁群算法3.1 精英策略的蚂蚁系统(Elitist Ant System, EAS)3.2 基于排列的蚂蚁…

蚁群算法小结及算法实例(附Matlab代码)

目录 1、基本蚁群算法 2、基本蚁群算法的流程 3、关键参数说明 3.1 信息素启发式因子 α 3.2 期望启发因子 β 3.3 信息素蒸发系数 ρ 3.4 蚂蚁数目 m 3.5 信息素强度 Q 对算法性能的影响 3.6 最大进化代数 G 4、MATLAB仿真实例 4.1 蚁群算法求解旅行商问题&#xf…

蚁群算法代码实现

旅行商问题大都是用遗传算法求解,不过蚁群算法比它高效得多,在百度的蚁群算法吧里有人发了个注释清晰的代码,有兴趣的可以去研究一下蚁群算法和模拟退火算法,这两者都可以解决旅行商问题。而关于遗传算法和模拟退火算法&#xff0…

蚁群算法(ACO)

目录 ACO简介 基本原理 算法步骤 流程图 参数意义 构建路径 更新信息素 实例演示(TSP问题) ACO简介 蚁群是自然界中常见的一种生物,人们对蚂蚁的关注大都是因为“蚁群搬家,天要下雨”之类的民谚。然而随着近代仿生学的发展&…

蚁群算法及其应用

产生背景 20世纪90年代初,意大利科学家Marco Dorigo等受蚂蚁觅食行为的启发,提出蚁群算法(Ant Colony Optimization,ACO)。 一种应用于组合优化问题的启发式搜索算法。 在解决离散组合优化方面具有良好的性能。 基本思想 信息素跟踪&#…

蚁群算法原理及python代码实现

本文转载自:https://blog.csdn.net/fanxin_i/article/details/80380733 蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年首先提出,并首先使用在解决TSP(旅行商问题)上。 之后…