当前位置: 首页 > news >正文

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

目录

  • 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.lryc.cn/news/427042.html

相关文章:

  • ipad作为扩展屏的最简单方式
  • 【卡码网Python基础课 17.判断集合成员】
  • 生物研究新范式!AI语言模型在生物研究中的应用
  • python语言day08 属性装饰器和property函数 异常关键字 约束
  • day01JS-数据类型-01
  • MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74)
  • git的下载与安装(Windows)
  • 腾讯云AI代码助手 —— 编程新体验,智能编码新纪元
  • 使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API
  • 高阶数据结构——B树
  • Vue2中watch与Vue3中watch对比和踩坑
  • 在Java程序中执行Linux命令
  • 微信小程序在不同移动设备上的差异导致原因
  • 快速体验fastllm安装部署并支持AMD ROCm推理加速
  • 报错:java: javacTask: 源发行版 8 需要目标发行版 1.8
  • 【数据结构篇】~单链表(附源码)
  • 旋转图像(LeetCode)
  • 入门 - vue中v-model的实现原理和完整用法详解
  • 【区块链+金融服务】港融区域股权服务平台 | FISCO BCOS应用案例
  • Nginx反向代理和前后端分离项目打包部署
  • Spring 中ApplicationContext
  • python之时间 datetime、date、time、timedelta、dateutil
  • 【机器学习第11章——特征选择与稀疏学习】
  • LeetCode-day43-3137. K 周期字符串需要的最少操作次数
  • 基于springboot的智能家居系统
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(七)
  • C:每日一练:单身狗(2.0版本)
  • 打破接口壁垒:适配器模式让系统无缝对接
  • U-Boot 命令使用
  • 谷歌的高级指令有哪些