我使用 webflux starter 创建了一个 Spring boot 2.0.0.M7 项目,因为我想使用所有异步和非阻塞功能 . 我添加了 server.servlet.context-path 但是如果我不添加Web启动器它也不起作用 .
webflux starter
Spring boot 2.0.0.M7
server.servlet.context-path
如果我添加两个启动器,我可以解决非阻塞功能吗?我用Gatling执行了一些压力测试,我收到了相同的分数,删除了web启动器或添加它 .
对此有何帮助?
如果将 spring-boot-starter-web 和 spring-boot-starter-webflux 都添加到应用程序中,Spring Boot会将其配置为Spring MVC应用程序 .
spring-boot-starter-web
spring-boot-starter-webflux
这是故意的,因为许多Spring MVC将获得webflux依赖,以在其MVC应用程序中利用新的 WebClient . 此外,从Spring Framework 5开始,Spring MVC知道如何在控制器级别处理Flux的一些情况 .
WebClient
您可以随时强制选择:
SpringApplication app = new SpringApplication(MyApplication.class); app.setWebApplicationType(WebApplicationType.REACTIVE); app.run(...);
在你的情况下,这不是强迫选择,而是使用WebFlux不支持的东西 .
server.servlet.context-path 配置属性是特定于Servlet的,所以它在提供这样的属性时没有任何意义 .
使用Spring的"Servlet-based"和Reactive运行时之间的运行时模型差异可能非常微妙,我鼓励您观看talk that describes those choices . 简短的回答是:如果你使用带有异步类型的Spring MVC( DeferredResult , Flux 或 SseEmitter ),事情将是异步的,但读写仍然会被阻塞 .
DeferredResult
Flux
SseEmitter
正确地进行基准测试非常困难,但您所看到的结果在某种程度上是预期的 . 运行本地服务器客户端,不涉及延迟,查看原始吞吐量 - 所有这些约束不应该支持具有并发成本的响应模型 . 如果有的话,这个基准测试表明反应堆栈已经非常优化,即使对于非理想的用例!
1 回答
如果将
spring-boot-starter-web
和spring-boot-starter-webflux
都添加到应用程序中,Spring Boot会将其配置为Spring MVC应用程序 .这是故意的,因为许多Spring MVC将获得webflux依赖,以在其MVC应用程序中利用新的
WebClient
. 此外,从Spring Framework 5开始,Spring MVC知道如何在控制器级别处理Flux的一些情况 .您可以随时强制选择:
在你的情况下,这不是强迫选择,而是使用WebFlux不支持的东西 .
server.servlet.context-path
配置属性是特定于Servlet的,所以它在提供这样的属性时没有任何意义 .使用Spring的"Servlet-based"和Reactive运行时之间的运行时模型差异可能非常微妙,我鼓励您观看talk that describes those choices . 简短的回答是:如果你使用带有异步类型的Spring MVC(
DeferredResult
,Flux
或SseEmitter
),事情将是异步的,但读写仍然会被阻塞 .正确地进行基准测试非常困难,但您所看到的结果在某种程度上是预期的 . 运行本地服务器客户端,不涉及延迟,查看原始吞吐量 - 所有这些约束不应该支持具有并发成本的响应模型 . 如果有的话,这个基准测试表明反应堆栈已经非常优化,即使对于非理想的用例!