RestTemplate与WebClient在基于Servlet的web-mvc应用程序中的优势

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实现更高的规模?RestTemplateHttpClientPoolingHttpClientConnectionManager

Dov*_*vmo 5

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 FluxMono类型

关键是要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建立在,这就是为什么你会与框架使用它。例如,您实际上可以调用中以反应方式返回该值MonoController

@PostMapping("/person")
Mono<Void> create(@RequestBody Publisher<Person> personStream) {
     // ... above code could go here...
     return result; 
}
Run Code Online (Sandbox Code Playgroud)

这类事情是他们说您应该WebClientWebFlux库一起使用的关键原因。

  • 我已经更新了上面的问题,引用片段中的粗体文本是我唯一需要澄清的内容,我已经了解阻塞与非阻塞以及为什么 WebClient 应该与 WebFlux 一起使用。@Dovmo (3认同)
  • 我实际上知道所有这些,但是我的问题解决了,为什么他们建议您将WebClient与Spring Web MVC一起使用,Spring Web MVC是较旧的阻塞/每个请求线程框架。在我不知道的情况下,WebClient是否有一些好处? (2认同)