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

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)

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值