目录
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
注解定义接口,对应的mappingHandler
是 org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping
RequestMappingHandlerMapping
是HandlerMapping
的实现类
查找handler的具体方法为: AbstractHandlerMethodMapping#getHandlerInternal
2.3 处理请求(执行handler)
org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter#handle
RequestMappingHandlerAdapter
是HandlerAdapter
的实现类
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
等。
参考:
reactor3 源码分析_public: void subscribe(subscriber* s){ void callba-CSDN博客
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)