Kev*_*vin 6 spring spring-mvc spring-webflux
我正在寻找下面声明中粗体文本的澄清(我仅为上下文提供了完整的段落):
RestTemplate不适合在非阻塞应用程序中使用,因此Spring WebFlux应用程序应始终使用WebClient.在大多数高并发场景中,WebClient也应该是Spring MVC中的首选,并且用于编写一系列远程,相互依赖的调用.
在此处找到:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html
特别的是使用的好处WebClient
超过RestTemplate
了Spring MVC的应用程序?如何配置apache 并使用适当配置的连接和套接字配置,如何WebClient
实现更高的规模?RestTemplate
HttpClient
PoolingHttpClientConnectionManager
WebClient
是非阻塞的,RestTemplate
而是阻塞/同步的。如果将非阻塞WebFlux API与阻塞库一起使用,则实际上是将其转换为阻塞API。
可以认为RestTemplate
实际上是为每个事件创建一个新线程,而不是WebClient
创建一个任务(就像在队列上一样,这实际上是Reactor在后台为您管理的事情)。如果对每个非阻塞任务都有一个阻塞调用来支持它,那么您将很快陷入线程饥饿状态(每个实例都是这种情况RestTemplate
;请注意,委派给ConnectionManager
仍然在阻塞调用)。另一方面,当您有适当的可用资源时,任务将由反应式框架排队并被执行。
为什么将WebClient与Spring MVC一起使用
WebClient是非阻塞的!您可以使用它的所有Flux
功能(发布-订阅,反压等)。这有助于节省资源(即,您使用更少的线程和更少的内存),并且Reactor将允许您最大化使用未使用的线程。这里的问题不是Spring MVC真正的“为什么我应该使用WebClient”,而是我的应用程序中的“为什么我应该使用反应/非阻塞”框架。互联网上有很多关于这个问题的例子(这里是一个),它就是答案。
Mono
如果您要使用非反应性非阻塞构造,Flux
还可以返回Java 8CompletableFuture
。
为什么将WebClient与WebFlux一起使用
请从您在该文档中引用的页面中看到此引用:
WebClient使用与WebFlux服务器应用程序相同的编解码器,并与服务器功能的Web框架共享一个通用的基本程序包,一些通用的API和基础结构。该API公开了Reactor Flux 和Mono类型
关键是要WebClient
使用与相同的反应式非阻塞类型Flux
。这就是为什么集成如此完美并且您获得出色的任务功能的原因。例如(并且我从该文档中借用了一大段代码):
WebClient client = WebClient.create("http://example.org");
Mono<Void> result = client.post()
.uri("/persons/{id}", id)
.contentType(MediaType.APPLICATION_JSON)
.body(personMono, Person.class)
.retrieve()
.bodyToMono(Void.class);
Run Code Online (Sandbox Code Playgroud)
看看这段代码如何产生一个Mono
?这是一个反应的结构WebFlux
是建立在,这就是为什么你会与框架使用它。例如,您实际上可以在调用中以反应方式返回该值Mono
Controller
:
@PostMapping("/person")
Mono<Void> create(@RequestBody Publisher<Person> personStream) {
// ... above code could go here...
return result;
}
Run Code Online (Sandbox Code Playgroud)
这类事情是他们说您应该WebClient
与WebFlux
库一起使用的关键原因。
归档时间: |
|
查看次数: |
2754 次 |
最近记录: |