我可以同时使用SpringMvc和webflux吗?

时间:2018-12-21 10:24:14

标签: java spring-boot reactive-programming spring-webflux project-reactor

我想在一个项目中使用两种方法(反应性和标准方法)。

我尝试将一个REST API端点迁移到反应式Webflux并测试性能,然后再迁移其余的。但这没有用。我为他添加了路由器和处理程序,但是直到我没有从依赖项中删除spring-boot-starter-web并禁用@RestController为止,我一直都得到http 404代码。有没有可能?还是应该将所有项目迁移到被动方法?

1 个答案:

答案 0 :(得分:10)

如Spring Boot参考文档Spring Boot will auto-configure a Spring MVC application if both MVC and WebFlux are available中所述。造成这种情况的原因有很多:

  • Spring MVC无法在Netty上运行
  • 两个基础架构都将竞争同一工作(例如,提供静态资源,映射等)
  • 在同一个容器中混合两个运行时模型不是一个好主意,并且可能会表现不佳或根本无法工作

根据您要实现的目标,可能有几种方法可以解决此问题。

如果您想使用WebClient来优化多个并发的远程HTTP调用并使用Reactor运算符,则可以继续使用带有Spring MVC注释的控制器,并将返回类型作为返回值返回(more on this in this Spring Boot talk )。

如果您想使用纯可伸缩性和延迟(因此不一定需要原始吞吐量),则可以开始使用spring-boot-starter-webflux并从那里开始工作。请注意,禁止使用阻塞API(例如阻塞数据库调用),而用FluxMono包装这些API并安排在单独的线程池上工作将对性能不利。

最后,如果您想使用Spring WebFlux提供的功能方法,那么它不一定会表现更好。这实际上取决于您的用例以及实现方式。