当 Spring 团队正在考虑如何添加一个响应式编程模型的网络层,很快就发现,如果不在 Spring MVC 做很大的改动,很明显这样做是很困难的。这将涉及到分支代码来决定是否响应式地处理请求。在本质上,其结果将是把两个 web 框架打包成一个,用 if 语句来分离响应式与非响应式。
最终决定创建一个单独的响应式 web 框架,这个框架尽可能的借鉴 Spring MVC,而不是强行把响应式编程模型塞进 Spring MVC 中。Spring WebFlux 就是这个框架了。图 11.2 展示了由 Spring 5 所定义的完整的 web 开发技术栈。
图 11.2 Spring 5 通过名为 WebFlux 的新 web 框架支持响应式式 web 应用程序,WebFlux 是 Spring MVC 的兄弟,它们共享许多核心组件
在图 11.2 的左侧,可以看到 SpringMVC 技术栈,它是在 Spring 框架的 2.5 版中引入的。SpringMVC(在第 2 章和第 6 章中介绍)位于 Java Servlet API 之上,它需要一个 Servlet 容器(比如 Tomcat)来执行。
相比之下,Spring WebFlux(在右侧)与 Servlet API 没有关系,因此它构建在一个响应式 HTTP API 之上,这个方式与使用 Servlet API 提供的相同的响应式功能类似。而且由于 Spring WebFlux 没有耦合到 Servlet API,因此它不需要运行一个 Servlet 容器。相反,它可以在任何非阻塞 web 容器上运行,包括 Netty、Undertow、Tomcat、Jetty 或任何 Servlet3.1 或更高版本的容器。
图 11.2 最值得注意的是左上角的框,它表示了 Spring MVC 和 Spring WebFlux 之间常见的组件,主要是用于定义 controller 的注解。由于 Spring MVC 和 Spring WebFlux 共享相同的注解,Spring WebFlux 在许多方面与 Spring MVC 没有区别。
右上角的框表示另一种编程模型,该模型使用函数式编程范式而不是使用注解来定义 controller。我们将在第 11.2 节中详细讨论 Spring 的函数式 web 编程模型。
Spring MVC 和 Spring WebFlux 之间最显著的区别就是添加到构建中的依赖项不同。在使用 Spring WebFlux 时,需要添加 Spring Boot WebFlux starter 依赖项,而不是标准的 web starter(例如,spring-boot-starter-web)。在项目的 pom.xml 文件中,如下所示: