Spring WebFlux 执行流程和核心API介绍
Spring WebFlux 基于 Reactor 响应式框架,默认情况下使用 Netty 作为容器,Netty是NIO(同步非阻塞式IO)框架。
1、NIO 和 BIO
BIO
BIO:同步阻塞式IO,当客户端发送连接请求时服务器端就会启动一个线程进行处理,如果这个连接请求不做任何事情就会造成不必要的线程开销。
如下图:在BIO中,连接建立之后,需要接收客户端发送过来的数据,而线程等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。

NIO
NIO:同步非阻塞式IO,客户端发送的连接请求都会注册到Selector(多路复用器上),Selector轮询到连接有I/O请求时才启动一个线程进行处理。
如下图:在NIO中,当一个Socket连接建立好之后,线程并不会阻塞去接受这个连接,而是将这个请求交给Selector,Selector会不断的去遍历所有的连接,一旦有一个Socket连接建立完成,他会通知Thread,然后线程处理完数据再返回response给客户端,这个过程是不阻塞的,这样一个Thread就能处理更多的请求了。

2、Spring WebFlux 执行流程
Spring WebFlux 执行流程和 Spring MVC 相似。
Spring WebFlux 执行流程图:

Spring MVC 执行流程图:

SpringMVC 处理流程的核心控制器是 DispatcherServlet
SpringWebFlux 处理流程的核心控制器是 DispatcherHandler,负责请求的处理,DispatcherHandler实现类 WebHandler 接口
WebHandler 源码:
import reactor.core.publisher.Mono;
import org.springframework.web.server.adapter.HttpWebHandlerAdapter;
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
/**
处理 Web 请求的合同。
使用HttpWebHandlerAdapter使WebHandler适应HttpHandler 。 WebHttpHandlerBuilder提供了一种方便的方法来做到这一点,同时还可以选择配置一个或多个过滤器和/或异常处理程序。
*/
public interface WebHandler {
/**
处理 Web 服务器交换。
参数:exchange – 当前服务器交换
返回值:Mono<Void>指示请求处理何时完成
*/
Mono<Void> handle(ServerWebExchange exchange);
}
handle (ServerWebExchange exchange) 方法源码:
该方法在 org.springframework.web.reactive.DispatcherHandler类中

@Override
//ServerWebExchange:存放HTTP请求-响应交互的协定。提供对HTTP请求和响应的访问,还公开其他与服务器端处理相关的属性和功能,如请求属性。
public Mono<Void> handle(ServerWebExchange exchange) {
//handlerMappings:处理映射器,根据请求路径映射到handle
if (this.handlerMappings == null) {
//如果处理映射器为空,创建一个NotFound错误
return createNotFoundError();
}
//通过参数获得请求,如果请求是有效的 CORS 飞行前请求,则返回true
if (CorsUtils.isPreFlightRequest(exchange.getRequest())) {
//通过查找和应用与预期实际请求匹配的 CORS 配置来处理飞行前请求,返回一个Mono
return handlePreFlight(exchange);
}
return Flux.fromIterable(this.handlerMappings)
//返回该请求的handle
.concatMap(mapping -> mapping.getHandler(exchange))
//假如支持多个路径模式,使用第一个而忽略其他的
.next()
.switchIfEmpty(createNotFoundError())
//执行具体的业务方法
.flatMap(handler -> invokeHandler(exchange, handler))
//返回最终处理的结果
.flatMap(result -> handleResult(exchange, result));
}
3、核心API介绍
这两个API用于函数式编程模型实现 Spring WebFlux
RouterFunction
RouterFunction:路由函数,表示调度路由功能。
传入的请求通过 RouterFunction 路由到处理程序函数:一个接受ServerRequest并返回可选HandlerFunction 的函数。当路由函数匹配时,返回处理函数;否则为空可选。RouterFunction相当于@RequestMapping注释,但主要区别在于路由函数不仅提供数据,还提供行为。
HandlerFunction
HandlerFunction:处理函数,该函数接受Request并返回Response。HandlerFunction相当于基于注释的编程模型中@RequestMapping方法的主体。
本文介绍了SpringWebFlux的工作原理,包括其基于NIO而非BIO的特点,详细阐述了从客户端请求到服务器响应的整个流程,并解析了关键组件如DispatcherHandler的作用。
7183

被折叠的 条评论
为什么被折叠?



