Cloud-Platform 学习——Part6 WebClient异步非阻塞请求工具


参考:


多年来,Spring 框架的 RestTemplate 一直是客户端 HTTP 访问的首选解决方案,它提供同步、阻塞 API 来以简单的方式处理 HTTP 请求。
然而,随着对非阻塞、反应式编程以更少的资源处理并发的需求不断增加,特别是在微服务架构中,RestTemplate 已经显示出其局限性。从 Spring Framework 5 开始,RestTemplate 已被标记为已弃用,Spring 团队推荐 WebClient 作为其继任者。

RestTemplate 与 WebClient 区别:

  • RestTemplate
    使用了基于每个请求对应一个线程模型(thread-per-request)的 Java ServletAPl。发送请求时,RestTemplate 为每个事件(HTTP 请求)创建一个新的线程,该线程直到 Web 客户端收到响应之前,都将一直被阻塞下去。而阻塞代码带来的问题则是,每个线程都消耗了一定的内存和 CPU 周期。这些线程将耗尽线程池或占用所有可用内存。由于频繁的 CPU上下文(线程)切换,我们还会遇到性能下降的问题
  • WebClient
    不同于 RestTemplate,WebClient 是异步的,它为每个事件创建类似于“任务“,幕后,Reactive 框架对这些 “任务” 进行排队,并仅在适当的响应可用时执行它们,等待响应的同时不会阻塞正在执行的线程。只有在响应结果准备就绪时,才会发起通知。
    WebClient 是 Spring WebFlux 库的一部分。因此,我们还可以使用流畅的函数式 API 编写客户端代码,并将响应类型(Mono 和 Flux)作为声明来进行组合。

1.引入依赖

<!--WebClient-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2.使用工具发送请求

@Test
void webclientCreate(){
   
	//WebClient webClient = WebClient.builder().baseUrl(BASE_URI).build();
    WebClient webClient = WebClient.create(BASE_URI);
	//普通请求
    Mono<String> mono = webClient
            .get() //get请求
            .uri(BASE_URI + "/test/get01"
posted @ 2023-12-29 00:05  Acegzx  阅读(80)  评论(0)    收藏  举报  来源