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