webflux源码解析(3)-reactor netty

news2024/12/23 14:03:46

目录

  • 1.连接的状态
  • 2.reactor netty中的连接状态
  • 3. webflux中的io处理
  • 4.总结

为什么webflux在io密集型的场景能有效的提升系统吞吐量呢? 是因为它使用的是响应式编程,使用的是NIO,但这里的响应式、nio到底是怎么样的呢?响应式编程上一篇已经做了说明,本文会重点梳理结合了NIO的实现。

netty是java里最流行的nio的通信框架,webflux也是用的它,但却不是直接用的,为了适配响应式编程,对于netty进行了一层封装,使用的是 Reactor Netty,其从connection上获取请求,并将请求发送至 DispatcherHandler 中。

1.连接的状态

在编程和网络配置的上下文中,一个连接(connection)的生命周期会经历多个状态,每个状态都具有特定的含义。这些状态的出现顺序和可用性可能会因为不同的网络库和框架(如 Netty、Reactor Netty、Java NIO)而有所不同,但大体上会涉及以下几个常见的状态:

  1. CONFIGURED:连接已被配置。这个状态意味着连接的各种参数(如超时时间、缓冲区大小、协议版本等)已经被设置完毕,准备开始建立连接。

  2. CONNECTING:正在尝试连接。在这个状态下,系统正在尝试与目标服务器建立连接,但连接尚未完成。

  3. CONNECTED:连接成功建立。当连接成功建立后,将进入这个状态,此时可以开始进行数据的发送和接收。

  4. READY:连接准备就绪。某些框架或系统可能会进一步区分“已连接”和“准备就绪”两个状态。"准备就绪"状态意味着连接不仅已建立,且所有初始化步骤(如握手、认证等)都已成功完成,连接可以用于通信。

  5. DISCONNECTING:正在尝试断开连接。在这个状态下,连接正在进行关闭的准备工作,如发送剩余的数据或进行必要的清理操作。

  6. DISCONNECTED:连接已经完全断开。此状态表示连接已经被关闭,所有的资源都已释放,且无法再进行数据传输。

  7. ERROR:连接出错。这个状态表示在连接的建立、使用或关闭过程中遇到了错误。具体的错误信息通常需要通过日志或异常机制进一步检查。

  8. CLOSED:连接被关闭。这个状态往往与 DISCONNECTED 类似,但强调的是连接被有意地关闭,而不是因为错误。

值得注意的是,不同的框架和库可能会有细微的状态差异,一些状态可能会被合并或细分。

2.reactor netty中的连接状态

连接上的状态定义

reactor.netty.ConnectionObserver.State

注意此处是一个interface,在别处还有扩展

在这里插入图片描述

connection上有不同的事件,相应的有不同的处理类进行处理,这些处理类都是 ConnectionObserver 的实现类,具体的处理方法为 ConnectionObserver#onStateChange

在这里插入图片描述

例如其中的 HttpServerHandle#onStateChange , 进入执行逻辑前,会判断是否为目标事件

在这里插入图片描述

不同的事件类型对应的处理类关系是:

  • State.CONNECTED —> TcpServerDoOn
  • State.CONFIGURED —> TcpServerHandle
  • State.CONFIGURED —> TcpClientDoOn
  • State.DISCONNECTING —> PooledConnection
  • State.CONFIGURED —> TcpServerDoOnConnection
  • State.DISCONNECTING —> TcpServerBind.ChildObserver
  • ConnectionObserver.State.CONFIGURED —> HttpClientConnect
  • HttpServerState.REQUEST_RECEIVED —> HttpServerHandle
  • State.CONFIGURED —> HttpClientDoOn
  • HttpClientState.RESPONSE_RECEIVED、State.CONFIGURED —> HttpObserver
  • State.CONFIGURED、State.DISCONNECTING —> UdpServerDoOn
  • State.CONFIGURED、State.DISCONNECTING、State.RELEASED —> UdpClientDoOn
  • State.CONFIGURED、State.DISCONNECTING —> NewConnectionProvider.NewConnectionObserver

3. webflux中的io处理

io线程相关的逻辑:

reactor.netty.http.server.HttpTrafficHandler#channelRead

HttpTrafficHandler 同时是netty的ChannelInboundHandler、ChannelInboundHandler的实现类

reactor.netty.channel.ChannelOperationsHandler#channelRead

ChannelOperationsHandler 是netty的 ChannelInboundHandler 的实现类

通信核心 ChannelOperationsHandler
ChannelOperationsHandler 直接继承 io.netty.channel.ChannelInboundHandlerAdapter , 接入netty后,将netty不同的事件转换成本地的事件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

reactor.netty.http.server.HttpServerOperations#onInboundNext

监听connection中的 REQUEST_RECEIVED 事件
在这里插入图片描述

outbound\ inbound的注册
上述涉及的有 ChannelOperationsHandlerHttpTrafficHandlerChannelOperationsHandler
不同的处理器有对应的类型:

  • ChannelOperationsHandler 的类型为 NettyPipeline.ReactiveBridge
  • HttpTrafficHandler 的类型为 NettyPipeline.HttpTrafficHandler

HttpTrafficHandler 的注册在 HttpServerBind 中完成 reactor.netty.http.server.HttpServerBind.Http1Initializer#accept
在这里插入图片描述
HttpServerOperations 继承 ChannelOperations,其中完成了 ChannelOperationsHandler 的注册 reactor.netty.channel.ChannelOperations#addReactiveBridge
在这里插入图片描述

reactor.netty.tcp.TcpServerBind.ChildObserver#onStateChange

当连接的状态发生变化时调用,例如 http的request或者response

reactor.netty.http.server.HttpServerHandle#onStateChange

HttpServerOperationsHttpServerHandle 都是 reactor.netty ConnectionObserver 的实现类
在该方法中调用了 subscribe 方法

在这里插入图片描述

上述方法中调用的 handler.apply() 方法 即为ReactorHttpHandlerAdapter#apply

org.springframework.http.server.reactive.ReactorHttpHandlerAdapter#apply
在这里插入图片描述

方法中的 handler.hanlder() 方法调用路径为:

  • org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.ServerManager#handle
  • org.springframework.web.server.adapter.HttpWebHandlerAdapter#handle
  • org.springframework.web.server.handler.FilteringWebHandler#handle
  • 在这里插入图片描述
  • org.springframework.web.server.handler.DefaultWebFilterChain#filter
  • 在这里插入图片描述

相关的filter是 org.springframework.web.server.WebFilter 的实现类
在这里插入图片描述

此处 DefaultWebFilterChain 中handler即为 DispatcherHandler
org.springframework.web.reactive.DispatcherHandler#handle

至此, DispatcherHandler就到了webflux处理请求的主流程,可参考 webflux源码解析(1)-主流程

4.总结

Recator Netty的部分,完成了从connection中接收请求动作,之后请求会传递到了DispatcherHandler,进入webflux处理请求的主流程,可参考 webflux源码解析(1)-主流程。

这个链路上的 reactor.netty.http.server.HttpServerHandle#onStateChange 方法调用了subscribe 方法,触发了响应式调用链的执行(可参考webflux源码解析(2)-reactor)

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

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

相关文章

自动化智能立体库验收报告

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 这份文件是一份关于自动化智能立体库的验收报告,它包含了以下几个核心部分: 到货验收表:列出了自动化智能立体…

dubbo:dubbo整合nacos实现服务注册中心、配置中心(二)

文章目录 0. 引言1. nacos简介及安装2. 注册中心实现3. 配置中心实现4. 源码5. 总结 0. 引言 之前我们讲解的是dubbozookeeper体系来实现微服务框架,但相对zookeeper很多企业在使用nacos, 并且nacos和dubbo都是阿里出品,所以具备一些天生的契合性&#…

黑神话:悟空四年前就布局商标,多个名称申请全类!

近日黑神话:悟空上线,预售超4亿元,普推知产商标老杨经检索发现,背后的主体游科互动早在三年前就布局商标,申请了多个核心名称的45类全类的商标。 背后的游科互动名下申请了245件商标,其“黑悟空”是2021年申…

如何通过观测云实现AIOps突破?

在当今信息技术迅猛发展的浪潮中,企业正置身于一个日益复杂化的 IT 环境,并面临着数据量的爆炸性增长。智能运维(AIOps),作为 IT 运维管理领域的革新者,融合了大数据和机器学习技术,致力于对 IT…

全场景——(四)Modbus 通讯协议

文章目录 一、学习Modbus的快速方法1.1 寄存器速记1.2 协议速记 二、初识Modbus2.1 背景2.2 什么是Modbus?2.2.1 Modbus简介2.2.2 Modbus特点2.2.3 Modbus常用术语2.2.4 Modbus事务处理 三、Modbus软件与使用3.1 Modbus软件简介3.2 Modbus Poll(主站设备…

鸿蒙HarmonyOS之使用ArkTs语言实现层级树状目录选择UI

一、实现效果 二、实现步骤 代码示例中用到的颜色、图片等资源可以自行替换设置 1、Index.ets 里面调用 import { CategoryView} from ./CategoryView;//主页面 Entry Component struct Index {State tabsIndex: number 0;build() {...//层级目录ViewCategoryView()...} …

AMD和NVIDIA一起挤牙膏,新显卡性能反而降低

红厂 AMD 因为新品锐龙 9000 CPU,在这两天算是赚足了眼球和关注度。 在两周的延迟后,高端 R9 系列终于是端上来了,R9-9900X 和 R9-9950X,核心规模和最高加速频率与上代保持不变,基础频率略有降低。 国行售价分别为 339…

FFmpeg的入门实践系列一

欢迎诸位来阅读在下的博文~ 在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力! 江山如画,客心如若,欢迎到访,一展风采 文章目录 参考环境本系列的适用人群FFmpeg的简介FFmpeg…

【等保测评】Ngnix模拟测评

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 结果记录:此项不适用,Nginx无独立的登录管理界面,身份鉴别由操作系统层面实现 b)应具有登…

基于linux下的mplayer播放器项目

项目名称:基于MPlayer的C语言控制接口 版本:1.0 1. 项目概述 本项目旨在设计一个基于MPlayer的简单C语言控制接口,提供用户与媒体播放器的交互功能。用户可以通过文本菜单选择不同的操作,如播放、暂停、停止、调整播放速度、跳…

MySql 高阶二(SQL 性能分析)

SQL 性能分析: 查看当前数据库的 增删改查的使用情况 show global status like Com_______;慢查询日志: -- 查看状态 show variables like slow_query_log目前是开启状态。如何开启,编辑my.cnf 文件 添加下面的语句,编辑完成后…

【卡码网C++基础课 1.A+B问题1】

文章目录 题目描述与分析一、C函数基础二、输入输出流三、变量四、写入数据五、输出数据六、尝试第一次提交七、循环输入输出八、延伸 题目描述与分析 题目描述: 你的任务是计算ab。 输入描述: 输入包含一系列的a和b对,通过空格隔开。一对a…

《内生性随机边界模型及 Stata 具体操作步骤》

目录 一、文献综述 二、理论原理 三、实证模型 四、稳健性检验 五、程序代码及解释 一、文献综述 自 Aigner 等(1977)、Meeusen 和 van den Broeck(1977)引入随机前沿模型以来,该模型已有 40 多年的历史。它由确定…

【Qt】Qt窗口 | QStatusBar 状态栏

文章目录 一. 状态栏二. 代码创建&使用状态栏1. 创建状态栏2. 在状态栏中显示实时消息3. 在状态栏中显示控件 一. 状态栏 状态栏是应用程序中输出简要信息的区域,通常位于窗口的底部,用于显示应用程序的状态信息或提供用户与应用程序交互的反馈。一…

qt的model view 使用示范

首先在ui界面拖一个tableView ui->tableView->setModel(mission_model); 然后设置model的qss,并用view绑定model void SettingWidget::init_missionmodel(QString plane_type, QString mission_name) {if(mission_model)delete mission_model;mission_model…

《智能计算系统:从深度学习到大模型(第2版)》重磅上市!

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

PINCE——Linux 原生游戏内存修改器,一款替代 Cheat Engine 的强大游戏修改器,Linux 游戏玩家必备神器!

PINCE——Linux 原生游戏内存修改器,一款替代 Cheat Engine 的强大游戏修改器,Linux 游戏玩家必备神器! PINCE 是 GNU Project Debugger(GDB) 的前端/反向工程工具,常用作程序调试器,主要用于游戏领域,修改…

docker容器图形化管理之Portainer

docker容器轻量级图形页面管理之Portainer 1、查看portainer镜像 [rootlocalhost ~]# docker search portainer 2、下载portainer镜像 [rootlocalhost ~]# docker pull portainer/portainer #选择喜欢的portainer风格镜像下载 3、启动dockerui容器 [rootlocalhost ~]# doc…

京东物流开放平台对接云打印功能

这是京东开发文档的流程图,根据自己的需求分析,我选择的是接入方式一 这是接入方式一的流程图: 所有第一步我们先下载他的打印组件并安装:京东物流开放平台 第二步呢就是看你有没有自定义快递面单的需求,由于目前我没有特别的需…

录屏选区指南,优选3款支持区域录制的录屏软件!

在数字内容创作和分享的时代,录屏软件成为了游戏玩家、教育工作者和视频博主的重要工具。无论是想要捕捉精彩的游戏瞬间,还是制作教学视频,选择正确的录屏区域都是确保内容质量和观众体验的关键。然而,面对市面上众多的录屏软件&a…