我使用webflux starter创建了一个Spring boot 2.0.0.M7项目,因为我想使用所有的异步和非阻塞功能。我添加了server.servlet.context-path,但如果我不添加web starter,它就不起作用。
如果我同时添加两个启动器,我的非阻塞功能会出现问题吗?我使用Gatling执行了一些压力测试,我收到了相同的分数,删除或添加了web starter。
对此有什么帮助吗?
发布于 2017-12-15 23:57:27
如果您在应用程序中同时添加了spring-boot-starter-web和spring-boot-starter-webflux,Spring Boot会将其配置为Spring MVC应用程序。
这是有意的,因为许多Spring MVC将获得webflux依赖,以便在他们的MVC应用程序中利用新的WebClient。此外,从Spring Framework5开始,Spring MVC知道如何在控制器级使用Flux处理一些情况。
你可以像这样强制你的选择:
SpringApplication app = new SpringApplication(MyApplication.class);
app.setWebApplicationType(WebApplicationType.REACTIVE);
app.run(...);在您的例子中,这不是强制选择,而是使用WebFlux不支持的东西。
Servlet配置属性是特定于server.servlet.context-path的,因此它不适用于WebFlux。目前,Spring Boot不支持war部署,也不支持WebFlux应用程序的多web上下文。因此,提供这样的房产是没有意义的。
“基于Servlet”和使用Spring的响应式运行时之间的运行时模型差异可能非常微妙,我建议您查看talk that describes those choices。简短的答案是:如果你使用带有异步类型(DeferredResult、Flux或SseEmitter)的Spring MVC,事情将是异步的,但读和写仍然是阻塞的。
正确的基准测试是相当困难的,但您看到的结果在某种程度上是意料之中的。在本地运行server+client,不涉及延迟,查看原始吞吐量-所有这些限制都不应该有利于具有并发成本的反应式模型。如果说有什么不同的话,那就是这个基准测试表明反应式堆栈已经相当优化了,即使对于不理想的用例也是如此!
https://stackoverflow.com/questions/47834681
复制相似问题