Spring WebFlux 核心流程-响应式编程-024

Spring WebFlux 响应式编程模型解析
本文深入探讨了Spring WebFlux相对于SpringMVC的并发模型,介绍了WebFlux如何利用Reactor库实现非阻塞、支持回压机制的异步流处理。内容涵盖WebFlux的并发模型、核心组件如HttpHandler、WebHandler以及编码解码器的使用,并对比了SpringMVC的Servlet并发模型。此外,还提到了Netty服务器线程模型、过滤器、CORS处理、异常处理和编码解码等关键概念。

 🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓

  1. GitHub - apihug/apihug.com: All abou the Apihug   
  2. apihug.com: 有爱,有温度,有质量,有信任
  3. ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace

   The Next Generation API Development Platform - ApiHug 

api-hug-contact

前面关于 Reactoropen in new window 和 Reactor-Nettyopen in new window 我们都看过了, 那么 Spring WebFlux 响应式又是如何实现?

支持Spring 5+的Spring Boot 2+ 来说,新加入的响应式技术栈是其主打核心特性。具体来说,Spring Boot 2支持的响应式技术栈包括如下:

  1. Spring Framework 5提供的非阻塞web框架Spring Webflux;
  2. 遵循响应式流规范的兄弟项目 Reactor
  3. 支持异步I/O的Netty、Undertow等框架,以及基于Servlet 3.1+的容器(如Tomcat 8.0.23+和Jetty 9.0.4+);
  4. 支持响应式的数据访问Spring Data Reactive Repositories;比如 R2dbc
  5. 支持响应式的安全访问控制Spring Security Reactive

#WebFlux对比SpringMVC并发模型

#SpringMVC基于的Servlet并发模型

servlet由servlet container进行生命周期管理。container启动时构造servlet对象并调用servlet init()进行初始化;container关闭时调用servlet destory()销毁servlet;container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()。

 

处理请求的时候同步操作,一个请求对应一个线程来处理,并发上升,线程数量就会上涨(上线文切换,内存消耗大)影响请求的处理时间。现代系统多数都是IO密集的,同步处理让线程大部分时间都浪费在了IO等待上面。虽然Servlet3.0后提供了异步请求处理与非阻塞IO支持,但是使用它会远离Servlet API的其余部分,比如其规范是同步的(Filter, Servlet)或阻塞的(getParameter,getPart),而且其对响应的写入仍然是阻塞的。

#WebFlux并发模型

WebFlux模型主要依赖响应式编程库Reactor,Reactor 有两种模型,Flux 和 Mono,提供了非阻塞、支持回压机制的异步流处理能力。WebFlux API接收普通Publisher作为输入,在内部使其适配Reactor类型,使用它并返回Flux或Mono作为输出。

WebFlux 使用Netty作为默认的web服务器,其依赖于非阻塞IO,并且每次写入都不需要额外的线程进行支持。

也可以使用Tomcat、Jetty容器,不同与SpringMVC依赖于Servlet阻塞IO,并允许应用程序在需要时直接使用Servlet API,WebFlux依赖于Servlet 3.1非阻塞IO。使用Undertow作为服务器时,WebFlux直接使用Undertow API而不使用Servlet API。

当WebFlux运行在Netty服务器上,其线程模型如下:

NettyServer的Boss Group线程池内的事件循环会接收这个请求,然后把完成TCP三次握手的连接channel交给Worker Group中的某一个事件循环线程来进行处理(该事件处理线程会调用对应的controller进行处理)。所以WebFlux的handler执行是使用Netty的IO线程进行执行的,所以需要注意如果handler的执行比较耗时,会把IO线程耗尽导致不能再处理其他请求,可以通过Reactor的publishOn操作符切换到其他线程池中执行。

#Core

WebServer 的创建被代理给: ReactorHttpHandlerAdapter 他是链接 Spring MVC HttpHandler 到 Reactor-Netty 桥梁。

Spring WebFlux - Reactive Coreopen in new window, 有详细描述。

模块 spring-web 核心库中为支持响应式编程:

  1. 服务器端
    1. HttpHandler: 一个对于HTTP请求的略偏底层的协定; 规范了Tomcat, Jetty, Netty, Undertow, Servlet3.1等服务器。 旨在对于不同的Web服务器提供更加抽象统一的接口。
    2. WebHandler: 基于HttpHandler,并提供稍微高级一些,且更加常用的Web通用API,使代码编写更加容易; 并构建更加具体的编程模型。 由多个部分组成"责任链式"的处理模式(和Netty的链式处理思想一样)。
  2. 客户端: ClientHttpConnector
  3. 编码 codec, 反序列化/序列化 Http Request/Response;

#HttpHandler

一个对于HTTP请求的略偏底层的协定; 规范了Tomcat, Jetty, Netty, Undertow, Servlet3.1等服务器。 旨在对于不同的Web服务器提供更加抽象统一的接口。

public interface HttpHandler {

	/**
	 * Handle the given request and w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ApiHug

God Bless U

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

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

打赏作者

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

抵扣说明:

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

余额充值