[译]Spring WebFlux vs Spring MVC

Spring MVC还是WebFlux?本文对比两种框架的适用场景,帮助你根据实际需求做出正确选择。

🕰️ 版本说明:本文写于 2019 年,基于 Spring 5 时代的 Spring MVC 与 WebFlux(Java 8、Servlet 3.1+)。技术演进较快,请结合你实际使用的版本阅读。

spring mvc and webflux venn

  • 如果你的Spring MVC应用运行良好,则不需要改变。命令式编程是编写、理解、调试代码最轻松的方式。你可以选择的库也最丰富,因为从历史上看,大多数库都是阻塞的。
  • 如果你已经在选用非阻塞 Web 技术栈,Spring WebFlux 提供与同类方案相同的执行模型优势,并可以在服务器(Netty、Tomcat、Jetty、Undertow 及 Servlet 3.1+ 容器)、编程模型(注解控制器与函数式端点)和响应式库(Reactor、RxJava 或其他)之间自由选择。
  • 如果你对轻量的函数式 web 框架感兴趣,并希望使用Java 8 lambdas或者Kotlin,则可以选择Spring WebFlux。对于需求不太复杂的小型应用程序或微服务来说,这也是一个不错的选择,因为它们可以从更大的透明性(transparency)和控制中获益。
  • 在微服务体系架构中,可以混合使用基于 Spring MVC 或 Spring WebFlux 控制器的应用,或使用 Spring WebFlux 函数式端点(functional endpoints)的应用。在两个框架中都支持相同的基于注释的编程模型,这使得重用知识更容易,同时也为正确的工作选择了正确的工具。
  • 评估的一个简单方法是检查应用的依赖项。 如果你要使用阻塞持久性APIs (JPA、JDBC)或网络APIs,那么 Spring MVC 至少是常见架构的最佳选择。在技术上,Reactor和RxJava都可以在单独的线程上执行阻塞调用,但这时就无法充分利用非阻塞网络栈。
  • 如果你的Spring MVC应用程序需要远程调用别的服务,请尝试reactive WebClient。你可以直接从Spring MVC控制器方法返回反应类型(Reactor、RxJava或其他)。每次调用的延迟或调用之间的相互依赖性越大,好处就越显著。Spring MVC控制器也可以调用其他响应性组件。
  • 如果你有一个大型团队,请记住向非阻塞、函数式和声明式编程转变的陡峭学习曲线。一种不需要完全切换的实用方法是使用响应式的WebClient。除此之外,从小处着手,衡量收益。我们认为,对于广泛的应用程序,这种转变是不必要的。如果你不确定要寻找什么好处,可以从学习非阻塞I/O的工作原理(例如,在单线程Node.js上的并发性)及其效果开始。

原文地址:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web-reactive.html