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(如阻塞数据库调用),使用 Flux
或 Mono
包装它们并在单独的线程池上进行调度将在性能方面对您不利。
最后,如果您想使用 Spring WebFlux 提供的函数式方法,那么它的性能不一定会更好。这实际上取决于您的用例以及您如何实现它。
我想在一个项目中使用 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(如阻塞数据库调用),使用 Flux
或 Mono
包装它们并在单独的线程池上进行调度将在性能方面对您不利。
最后,如果您想使用 Spring WebFlux 提供的函数式方法,那么它的性能不一定会更好。这实际上取决于您的用例以及您如何实现它。