webflux源码解析(1)-主流程

news2024/9/25 9:33:19

目录

  • 1.关键实例的创建
    • 1.1 实例创建
    • 1.2 初始化
  • 2.处理请求的关键流程
    • 2.1 从ReactorHttpHandlerAdapter开始
    • 2.1 DispatcherHandler的初始化
    • 2.2查找mapping handler
    • 2.3 处理请求(执行handler)
    • 2.4 返回结果处理
  • 3.webflux的配置装配
  • 参考:

WebFlux是Spring 5.0框架推出的一个全新的响应式Web框架,是基于Project Reactor构建的,它旨在利用响应式编程的特性来构建异步非阻塞的应用程序。

在io密集型的场景中,使用webflux这类响应式io框架,能大幅提高系统的吞吐量。

本文主要是关于其主流程的梳理,包括关键实例的创建、配置等。

1.关键实例的创建

1.1 实例创建

webflux的通信框架采用的是netty,类比于传统的springboot的tomcat ,其对应的server实例在springboot中 netty server的初始化:

org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#onRefresh

在这里插入图片描述
在这里插入图片描述
其中各通信框架的选择从 ReactiveWebServerFactory 的实现类开始:

org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#getWebServerFactory

在这里插入图片描述
在这里插入图片描述

创建 webServer 的关键方法是:
org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory#getWebServer

在这里插入图片描述

注意此处的 handlerAdapter为 ReactorHttpHandlerAdapter

1.2 初始化

实例创建后,启动webServer:
org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#finishRefresh

在这里插入图片描述

2.处理请求的关键流程

2.1 从ReactorHttpHandlerAdapter开始

org.springframework.http.server.reactive.ReactorHttpHandlerAdapter#apply

在这里插入图片描述

依次调用:
org.springframework.web.server.adapter.HttpWebHandlerAdapter#handle
org.springframework.web.reactive.DispatcherHandler#handle

处理请求的核心控制器 org.springframework.web.reactive.DispatcherHandler(等同于阻塞方式的DispatcherServlet

请求的关键方法: org.springframework.web.reactive.DispatcherHandler#handle

在这里插入图片描述

2.1 DispatcherHandler的初始化

initStrategies()在启动时会注册相应的处理类:
org.springframework.web.reactive.DispatcherHandler#initStrategies

在这里插入图片描述

HandlerMapping 的实现类:
在这里插入图片描述
HandlerAdapter 的实现类:
在这里插入图片描述

HandlerResultHandler 的实现类
在这里插入图片描述

  • 注册url 与方法的映射: AbstractHandlerMethodMapping#initHandlerMethods
  • 最终调用的注册方法为:AbstractHandlerMethodMapping#registerHandlerMethod在这里插入图片描述

2.2查找mapping handler

webflux跟springMVC相同,使用的是 @RequestMapping 注解定义接口,对应的mappingHandlerorg.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping

RequestMappingHandlerMappingHandlerMapping的实现类

查找handler的具体方法为: AbstractHandlerMethodMapping#getHandlerInternal

2.3 处理请求(执行handler)

org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter#handle

RequestMappingHandlerAdapterHandlerAdapter 的实现类

在这里插入图片描述

2.4 返回结果处理

org.springframework.web.reactive.DispatcherHandler#handleResult

在这里插入图片描述

此处getResultHandler(result) 返回的是 ResponseBodyResultHandler , 为 HandlerResultHandler 的实现类
其中封装了将CompletableFuture自动封装为mono的逻辑

3.webflux的配置装配

WebFluxAutoConfiguration 自动装配时先自动装配EnableWebFluxConfiguration

进而配置类调用以此为:
EnableWebFluxConfiguration -> DelegatingWebFluxConfiguration -> WebFluxConfigurationSupport

最终 WebFluxConfigurationSupport 不仅配置 DispatcherHandler 还同时配置了其他很多WebFlux核心组件包括 异常处理器WebExceptionHandler,映射处理器处理器HandlerMapping,请求适配器HandlerAdapter,响应处理器HandlerResultHandler等。

参考:

你的响应阻塞了没有?–Spring-WebFlux源码分析

reactor3 源码分析_public: void subscribe(subscriber* s){ void callba-CSDN博客

深入剖析 Spring WebFlux

Spring: Blocking vs non-blocking: R2DBC vs JDBC and WebFlux vs Web MVC (amis.nl)

Performance of relational database drivers. R2DBC vs JDBC (amis.nl)

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

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

相关文章

算法的学习笔记—对称的二叉树(牛客)

😀前言 在算法的世界中,二叉树是一个极其重要的数据结构。它不仅广泛应用于各种算法的设计中,也是面试中常见的考察点之一。今天,我们将深入探讨一个经典的二叉树问题——对称的二叉树,并且会展示如何通过Java代码来解…

趋动VAICP技术认证全球考试正式上线

8月18日,趋动科技主办的VAICP(VirtAl Certified Professional) Al算力池化专家认证考试正式在 Pearson VUE上线。 即日起,凡参加过VAICP培训的学员,可立即通过Pearson VUE官网注册参加考试,官网链接:https://home.pea…

是肯定,更是动力 | 一封封感谢信纷至沓来,全视通服务获赞誉

在全视通的故事里,有那么一群人,他们穿梭于全国各地,奔波于各种交付调试、维检。山河湖海,严寒酷暑,从晨曦至夜幕,他们只为兑现那份让客户更加满意的承诺。他们是使命必达的守护者——全视通服务团队。他们…

串口UART

常见通信接口 串口定义 串口定义: 通用串行异步收发器 通用:UART的应用非常广泛,应用领域:工控行业,电力系统等串行:处理器和外设之间只需连接一根信号线,处理器和外设数据传输是一个bit位一…

CORS跨域问题全解:原理、问题与解决方案

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

【Qt】QDesigner 源码 控件图片资源路径

qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\win qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\widgets

docker部署drawio

1)介绍Drawio.io GitHub:GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. Draw.io是一款开源的绘制流程图的工具,拥有大量免费素材和模板。程序本身支持中文在内的多国语言,创建…

【源码+文档+调试讲解】健美操评分系统

摘 要 健美操评分系统采用B/S架构,数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写,使用了springboot框架。该系统从三个对象:由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页,个人中心,裁判…

2024潜力市场:工商业屋顶光伏项目开发!

随着全球对可再生能源的日益重视和“双碳”目标的持续推进,工商业屋顶光伏项目作为分布式光伏的主要类型之一,正迎来前所未有的发展机遇。 一、技术成熟度与成本降低 近年来,光伏技术的飞速发展显著提升了光伏组件的转换效率,并降…

记git仓库由局域网迁移到外网

项目管理平台:gitlab 一台云主机 流程: 1.外网机器上搭建gitlab 2.项目网站上新建空白项目 3.本机就项目切换到主分支,切换源:git remote set-url origin http://x.x.x.x:yyy/zzzz/new.git 4.登陆新平台的账号,使…

【吸引力法则】探究人生欲:追求深度体验与宇宙链接

文章目录 什么是人生欲?唤醒人生欲:克服配得感的三大障碍1 第一大障碍:法执的压制2 第二大障碍:家庭的继承2.1 家庭创伤的代际传递2.2 家庭文化基因的传递2.2.1 “成年人最大的美德是让自己的生活过得更加精彩。”2.2.2 荷欧波诺波…

【数据分享】1999—2022年地级市地区生产总值及一二三产构成数据(Shp/Excel格式)

在之前的文章中,我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

第二十三节、血量更新逻辑的实现

一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类,然后创建项目菜单 2、进行订阅 放入事件类,关联代码,即可进行广播 传递给这…

【什么是依赖倒置原则?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

还原source insight4.0的工具栏

工具栏消失了一部分 要还原 Source Insight 工具栏,可以按照以下步骤操作: 打开 Source Insight。在菜单栏中选择 "View"(视图)。在下拉菜单中选择 "Toolbars"(工具栏)。在弹出的子菜…

聊聊对神经网络的基础理解

这是鼎叔的第一百零六篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版(机械工业出版社…

GIS中AI矢量化工具

减少矢量化中86%工作量的AI工具 最近我在X平台有注意到一个矢量化工具,AI Vectorizer ,根据实验对比,这个AI工具可以减少在矢量化过程中86%的鼠标点击数,极大地减少矢量化过程中的工作量。 AI Vectorizer 需要通过网络交互&#…

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…

高德地图SDK Android版开发 6 显示覆盖物

高德地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互动画其它属性 折线的更多属性常用属性其它属性 多边形的更多属性常用属性其它属性 Arc的更多属性Ci…

5.2、配置stp

一、常用命令罗列 1. 查看STP状态 show spanning-tree功能:显示交换机上生成树协议的当前状态,包括各个端口的状态、根桥信息、VLAN相关信息等。 2. 启用STP spanning-tree vlan [VLAN_ID]功能:在指定的VLAN上启用生成树协议(…