Spring WebFlux 执行流程和核心API介绍
1、NIO 和 BIO2、Spring WebFlux 执行流程3、核心API介绍
Spring WebFlux 执行流程和核心API介绍Spring WebFlux 基于 Reactor 响应式框架,默认情况下使用 Netty 作为容器,Netty是NIO(同步非阻塞式IO)框架。
1、NIO 和 BIOBIO
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 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;
public interface WebHandler {
Mono handle(ServerWebExchange exchange);
}
handle (ServerWebExchange exchange) 方法源码:
该方法在 org.springframework.web.reactive.DispatcherHandler类中
@Override //ServerWebExchange:存放HTTP请求-响应交互的协定。提供对HTTP请求和响应的访问,还公开其他与服务器端处理相关的属性和功能,如请求属性。 public Mono3、核心API介绍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)); }
RouterFunction
RouterFunction:路由函数,表示调度路由功能。
传入的请求通过 RouterFunction 路由到处理程序函数:一个接受ServerRequest并返回可选HandlerFunction 的函数。当路由函数匹配时,返回处理函数;否则为空可选。RouterFunction相当于@RequestMapping注释,但主要区别在于路由函数不仅提供数据,还提供行为。
HandlerFunction
HandlerFunction:处理函数,该函数接受Request并返回Response。HandlerFunction相当于基于注释的编程模型中@RequestMapping方法的主体。



