SpringMvc和webflux可以一起使用吗?

Can I use SpringMvc and webflux together?

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

我尝试将一个 REST API 端点迁移到响应式 webflux 并在迁移其余端点之前测试性能。但它没有用。我为他添加了路由器和处理程序,但直到我没有从依赖项中删除 spring-boot-starter-web 并禁用 @RestController 我一直得到 http 404 代码。可不可以?还是我应该将所有项目迁移到反应式方法?

如 Spring 引导参考文档中所述,Spring Boot will auto-configure a Spring MVC application if both MVC and WebFlux are available。这有几个原因:

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

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

如果您想使用 WebClient 优化多个并发远程 HTTP 调用并使用 Reactor 运算符,您可以继续使用 Spring MVC 注释控制器和 return 反应式类型为 return 值 (more on this in this Spring Boot talk).

如果您想处理纯粹的可伸缩性和延迟(因此不一定是原始吞吐量),那么您可以开始使用 spring-boot-starter-webflux 并从那里开始工作。请注意,禁止使用阻塞 API(如阻塞数据库调用),使用 FluxMono 包装它们并在单独的线程池上进行调度将在性能方面对您不利。

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