🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓
- GitHub - apihug/apihug.com: All abou the Apihug
- apihug.com: 有爱,有温度,有质量,有信任
- ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace
The Next Generation API Development Platform - ApiHug

前面关于 Reactoropen in new window 和 Reactor-Nettyopen in new window 我们都看过了, 那么 Spring WebFlux 响应式又是如何实现?
支持Spring 5+的Spring Boot 2+ 来说,新加入的响应式技术栈是其主打核心特性。具体来说,Spring Boot 2支持的响应式技术栈包括如下:
- Spring Framework 5提供的非阻塞web框架Spring Webflux;
- 遵循响应式流规范的兄弟项目
Reactor; - 支持异步I/O的Netty、Undertow等框架,以及基于Servlet 3.1+的容器(如Tomcat 8.0.23+和Jetty 9.0.4+);
- 支持响应式的数据访问
Spring Data Reactive Repositories;比如R2dbc - 支持响应式的安全访问控制
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 核心库中为支持响应式编程:
- 服务器端
HttpHandler: 一个对于HTTP请求的略偏底层的协定; 规范了Tomcat, Jetty, Netty, Undertow, Servlet3.1等服务器。 旨在对于不同的Web服务器提供更加抽象统一的接口。WebHandler: 基于HttpHandler,并提供稍微高级一些,且更加常用的Web通用API,使代码编写更加容易; 并构建更加具体的编程模型。 由多个部分组成"责任链式"的处理模式(和Netty的链式处理思想一样)。
- 客户端:
ClientHttpConnector - 编码
codec, 反序列化/序列化 Http Request/Response;
#HttpHandler
一个对于HTTP请求的略偏底层的协定; 规范了Tomcat, Jetty, Netty, Undertow, Servlet3.1等服务器。 旨在对于不同的Web服务器提供更加抽象统一的接口。
public interface HttpHandler {
/**
* Handle the given request and w
Spring WebFlux 响应式编程模型解析

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

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



