1 个 Spring Boot 应用程序中的 Spring mvc 和 webflux

Posted

技术标签:

【中文标题】1 个 Spring Boot 应用程序中的 Spring mvc 和 webflux【英文标题】:Spring mvc and webflux in 1 spring boot application 【发布时间】:2018-10-31 06:31:16 【问题描述】:

我从 Spring Boot 文档中得到以下说明:

在应用程序中同时添加 spring-boot-starter-web 和 spring-boot-starter-webflux 模块会导致 Spring Boot 自动配置 Spring MVC,而不是 WebFlux。之所以选择这种行为,是因为许多 Spring 开发人员将 spring-boot-starter-webflux 添加到他们的 Spring MVC 应用程序以使用响应式 WebClient。您仍然可以通过将所选应用程序类型设置为 SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE) 来强制执行您的选择

我的问题是:

如果我的应用程序同时包含 MVC 服务和 webflux 服务怎么办? 是否支持?

例如:

我可能有一些基于 MVC 的现有管理服务。现在我想添加一些带有 webflux 风格的新服务。

【问题讨论】:

【参考方案1】:

不,不支持。 Spring MVC 和 Spring WebFlux 具有不同的运行时模型,并且不支持相同的服务器(例如,Spring WebFlux 可以与 Netty 一起运行,Spring MVC 不能)。

此外,Spring MVC 和 Spring WebFlux 是完整的 Web 框架,这意味着每个框架都有自己的基础架构,它们以某种方式复制另一个。将两者部署在同一个应用中会使映射请求变得困难(哪些请求应该去哪里?)。

【讨论】:

这是否意味着如果我排除 netty starter 并使用 tomcat starter,我的旧版基于 servlet 的管理员将无法正常工作?我曾经使用 org.springframework.boot.web.servlet.ServletContextInitializer 动态注册一些遗留 servlet。我想如果我使用 WebApplicationType.REACTIVE,它不会被触发。有没有办法绕过这个,让我的旧 servlet 与新添加的 webflux 服务一起工作?或者我必须将这些 servlet 重写为 webflux 样式? 如果您同时拥有 webflux 和 MVC 启动器,则 Spring Boot 将选择 MVC。如果您还有 Tomcat 启动器,那么您的 MVC 应用程序应该可以按预期工作;但不会考虑您的 WebFlux 端点。 哦,你的反应真快!非常感谢!你能重新审视我的编辑评论并提出一些建议吗?情况是我有一些遗留的管理控制台是用纯 servlet + xsl 编写的,从你的回复来看,我似乎不能将它与 webflux 服务一起使用,对吧? 从技术上讲,可能有一种方法可以将 Spring MVC 和 Spring WebFlux 混合在同一个容器中,但是你会失去两者的所有运行时优势。如果您想利用 WebFlux 非阻塞异步 I/O 运行时,您需要重写您的 servlet/过滤器以使用 Servlet 3.1 非阻塞 I/O,这非常困难。所以简而言之,不要混合使用 MVC 和 WebFlux。 知道了!非常感谢!痛点是一些内部用户可能会选择 MVC,而其中一些可能会选择 WebFlux。我当前的管理员启动器是基于 MVC/Servlet 的,我想将它重用于 2 种样式。根据你的回答,这似乎是不可能的。有没有办法在没有 2 个单独的启动器/代码库的情况下实现这一目标?

以上是关于1 个 Spring Boot 应用程序中的 Spring mvc 和 webflux的主要内容,如果未能解决你的问题,请参考以下文章

spring boot和mvc区别

使用 IDE 运行 Spring-boot 的 main

将 Spring Batch Admin 与另一个 JPA 持久性集成到 Spring Boot Web 应用程序中

Spring Boot 和 SAML 2.0

在 Spring Boot 的 application.properties 中使用 Maven 属性

Spring Boot2(002):手动创建第1个SpringBoot2简单应用——“HelloWorld” web 工程