文档:https://docs.spring.io/spring-framework/reference/web/webflux.html
Spring WebFlux 简介
Spring Framework中最初包含的Web框架Spring Web MVC是专为Servlet API和Servlet容器而构建的。响应式堆栈Web框架Spring WebFlux是在版本5.0后添加的。它完全非阻塞,支持Reactive Streams背压,并在诸如Netty、Undertow和Servlet容器等服务器上运行。
这两个Web框架的名称都反映了它们的源模块(spring-webmvc和spring-webflux),并且在Spring Framework中并存。每个模块都是可选的。应用程序可以使用其中一个模块,或者在某些情况下,同时使用两个模块,例如将Spring MVC控制器与响应式的WebClient结合使用。
章节概要
- Overview
- Reactive Core
DispatcherHandler
- Annotated Controllers
- Functional Endpoints
- URI Links
- CORS
- Error Responses
- Web Security
- HTTP Caching
- View Technologies
- WebFlux Config
- HTTP/2
Overview概览
Spring WebFlux的创建原因是什么?
部分答案是需要一个非阻塞的Web堆栈,以处理具有少量线程的并发,并且能够利用更少的硬件资源进行扩展。Servlet非阻塞I/O脱离了Servlet API的其余部分,其中合同是同步的(Filter、Servlet)或阻塞的(getParameter、getPart)。这是新的通用API的动机,可以作为任何非阻塞运行时的基础。这一点非常重要,因为像Netty这样的服务器在异步、非阻塞领域已经得到了很好的建立。
答案的另一部分是函数式编程。就像Java 5中注解的添加创造了机会一样(比如注解的REST控制器或单元测试),Java 8中的lambda表达式的添加为Java中的函数式API创造了机会。这对于非阻塞应用程序和继续式API(由CompletableFuture和ReactiveX广泛使用)来说是一种福音,它们允许异步逻辑的声明式组合。在编程模型级别,Java 8使Spring WebFlux能够在注解控制器旁边提供功能性Web端点。
定义“Reactive”
我们提到了“非阻塞”和“函数式”,但“reactive”是什么意思呢?
术语“reactive”指的是建立在对变化做出反应的编程模型上,网络组件对I/O事件做出反应,UI控制器对鼠标事件做出反应,等等。从这个意义上讲,非阻塞是反应式的,因为我们现在不是被阻塞住了,而是处于根据操作完成或数据可用时收到通知并做出反应的模式。
另一个与“reactive”相关的重要机制是非阻塞背压(non-blocking back pressure)。在同步、命令式代码中,阻塞调用作为一种自然形式的背压(back pressure),迫使调用者等待。在非阻塞代码中,控制事件的速率变得很重要,以防止快速生产者压倒目的地。
反应式流是一个小规范(也在Java 9中采用),它定义了带有背压的异步组件之间的交互。例如,一个数据存储库(充当发布者)可以生成数据,然后HTTP服务器(充当订阅者)可以将数据写入响应。反应式流的主要目的是让订阅者控制发布者产生数据的速度。
常见问题:如果发布者无法减速怎么办?
反应式流的目的仅在于建立机制和边界。如果发布者无法减速,它必须决定是缓冲、丢弃还是失败。