webflux源码解析(3)-reactor netty

目录

  • 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.rhkb.cn/news/409458.html

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

相关文章

vue的for循环不建议用index作为key

我们页面总有一些相似的,我们想用循环渲染,根据对象数组结构进行渲染,这是不是很熟悉的场景。这时候我们需要有一个唯一的key绑定在循环渲染的元素上,一般情况下我们会用id,因为id是唯一的。然而有些页面要循环的数据&…

生鲜O2O系统app源码开发之功能解析:构建高效便捷的生鲜电商生态

随着互联网技术的飞速发展和消费者对于生活品质要求的日益提升,生鲜电商行业迎来了前所未有的发展机遇。生鲜O2O(Online to Offline)系统作为连接线上购物与线下服务的关键桥梁,其源码开发不仅关乎平台的稳定运行,更直…

【XML详解】

XML基本概念 XML(全称EXtensible Markup Language,可扩展标记语言):是一种用于存储和传输数据的标记语言,通过标签(tags)来定义数据的结构和含义。数据格式:XML本质上是一种数据的格…

盘点15款主流客户管理系统,助力企业选型!

本文将盘点15款主流客户管理系统: 简道云、纷享销客、销售易、HubSpot、Zoho CRM、SAP CRM、Oracle CRM、金蝶云星空 CRM、用友 CRM、悟空 CRM、Salesforce、Microsoft Dynamics 365、亿客 CRM、八百客 CRM、CloudCC CRM。 在当今的商业环境中,客户管理系…

记一次将请求改为协商缓存的艰难过程

简单回顾一下前端缓存策略 ⛏️ 强缓存:在请求头规定的max-age和expirse过期之前直接读取本地缓存的资源,如果已经过期则调用协商缓存协商缓存:也叫弱缓存,以下都称为协商缓存。协商缓存是缓存过期,刷新缓存时间或者文…

JVM - 1.类加载子系统

1.类加载子系统 1.作用 1.负责从文件系统或网络中加载字节码(.class)文件,即将物理磁盘上的字节码文件加载到内存中,生成供程序使用的类对象 2.字节码文件要求在文件开头有特定的文件标识(CA FE BA BE)3.类加载器(ClassLoader)只负责字节码文件的加载&am…

pdf文件渲染到canvas

1、jQuery 2、Fabric.js Fabric.js是一个对canvas进行封装的Javascript库,主要的功能包括在canvas上创建和填充图形,比如矩形、圆形、多边形;生成的图像自带缩放、旋转、拖拽等功能。 3、PDF.js PDF.js 是一个使用 HTML5 构建的便携式文档格式…

在Linux中如何安装JDK

一、卸载JDK (可以不删除,直接安装新的JDK,然后修改环境变量) 1.1卸载使用yum安装的jdk 1.1.1卸载系统预安装的JDK 使用命令:yum list installed |grep java 注意:该命令只能查看使用yum命令安装的jav…

【架构-24】XML和JSON

XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种常用的数据格式,用于在不同系统之间传输和交换数据。它们各有优点和缺点,适用于不同的场景。下面是对XML和JSON的简要介绍以及它们之间的对比。 XM…

有关于算法备案的五大误区

有关于算法备案的五大误区 在这个数据为王的时代,算法已然成为推动社会前进的隐形巨轮。从搜索框中的每一次点击,到购物车里的每一件商品推荐,再到朋友圈里刷屏的动态,算法的身影无处不在,悄无声息地编织着我们的数字生…

提升文旅热度带动商家增收,抖音生活服务“心动大连”活动启动

8月22日,抖音心动之城大连系列活动(下称“心动大连”)启动仪式召开,主题为“遇见大连,心动无限”。活动由大连市人民政府指导,大连市文化和旅游局、抖音生活服务共同主办,旨在发挥抖音平台内容和…

opencv-python图像增强十六:图像马赛克

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、算法流程:二、算法实现:2.1 生成背板图:2.2 图片添加马赛克效果 三,整体代码实现:四&#xff0c…

点亮星星的世界:当小孩得了自闭症该怎么办

在这个丰富多彩的世界里,每一个孩子都是独一无二的天使。然而,有一些孩子却仿佛被困在了自己的小小世界中,难以与外界正常交流和互动。他们是自闭症儿童,他们的世界充满了挑战和困惑,也让家长们陷入了深深的担忧和焦虑…

UE5学习笔记17-让人物的视线和鼠标移动时的方向一致,并且不让人物模型旋转,只改变视线方向

一、创建标准动画帧 1.我想让人物在装备武器后根据鼠标的移动方向改变人物的视线方向,并且人物模型不会改变朝向 2.我的动画中存在一个四个方向瞄准的动画,将左下,坐上,左转,右上,右下,右转&…

Android - 音频参数合入

音频参数宏观来看分为两部分,audio和music。不管是哪个平台都需要分别合入这两部分。 A10 music参数 相关工程师调试后会提供 audio_para 文件,将该文件替换至对应工程下的文件编译即可 例: device/sprd/sharkle/sl8541e_1h10_32b/rootdir/system/et…

程序员失业跑滴滴,意外自学AI绘画成主业,月入过万不是梦!

一、突如其来的裁员 那是一个阴沉的下午,我像往常一样,在公司忙碌着。突然,HR叫我去会议室,告诉我由于公司业务调整,我所在的部门被整体裁撤。作为一名程序员,我从未想过自己会面临失业的困境。拿着那份补偿…

大语言模型-PDF文档解析

PDF解析能够提升大语言模型系统的信息处理能力和应用范围,为用户提供更加便捷、高效、个性化的服务体验。本文介绍三种常用的pdf解析方式:Open Parse、pdfplumber、PyMuPD。 一、Open Parse Open Parse是一个能够直观地识别文档布局并有效地对其进行分…

mac安装java17(jdk17)

1. 下载jdk17 官网下载:https://www.oracle.com/java/technologies/downloads 2. 直接安装 安装完后目录会存放在下面目录下 /Library/Java/JavaVirtualMachines 111111deMBP JavaVirtualMachines % ls jdk-11.0.227 jdk-17.jdk 3. 如果你已经安装过java&#…

kafka的12个重要概念

kafka的12个重要概念 1、服务器broker1.1、Broker 的主要功能1.2、Kafka Broker 的架构1.3、配置和管理1.4、高可用性和负载均衡1.5、总结 2、主题topic2.1、主要特点 3、事件Event4、生产者producer4.1、主要功能4.2、Producer 的配置选项4.3、Producer 的工作流程4.4、总结 5…

网页,html,Web端实现RTSP/RTMP实时推流视频和播放

随着技术的不断发展,实时流传输已经成为许多应用的重要组成部分。RTSP(Real-Time Streaming Protocol)作为一种实时流媒体传输协议,广泛应用于视频监控、直播等领域。然而,在Web端实现RTSP实时推流视频播放却面临一些挑…