Spring WebFlux 执行流程和核心API介绍

本文介绍了SpringWebFlux的工作原理,包括其基于NIO而非BIO的特点,详细阐述了从客户端请求到服务器响应的整个流程,并解析了关键组件如DispatcherHandler的作用。

Spring WebFlux 执行流程和核心API介绍

Spring WebFlux 基于 Reactor 响应式框架,默认情况下使用 Netty 作为容器,Netty是NIO(同步非阻塞式IO)框架。

1、NIO 和 BIO

BIO

BIO:同步阻塞式IO,当客户端发送连接请求时服务器端就会启动一个线程进行处理,如果这个连接请求不做任何事情就会造成不必要的线程开销。

如下图:在BIO中,连接建立之后,需要接收客户端发送过来的数据,而线程等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。

img

NIO

NIO:同步非阻塞式IO,客户端发送的连接请求都会注册到Selector(多路复用器上),Selector轮询到连接有I/O请求时才启动一个线程进行处理。

如下图:在NIO中,当一个Socket连接建立好之后,线程并不会阻塞去接受这个连接,而是将这个请求交给Selector,Selector会不断的去遍历所有的连接,一旦有一个Socket连接建立完成,他会通知Thread,然后线程处理完数据再返回response给客户端,这个过程是不阻塞的,这样一个Thread就能处理更多的请求了。

img

2、Spring WebFlux 执行流程

Spring WebFlux 执行流程和 Spring MVC 相似。

Spring MVC 执行流程可以参考这里

Spring WebFlux 执行流程图:

img

Spring MVC 执行流程图:

img

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方法的主体。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里顾—程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值