在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官方文档介绍,在将来的版本中它可能会被弃用。
作为替代,Spring 官方已在 Spring 5 中引入了 WebClient 作为非阻塞式 Reactive HTTP 客户端。
一 基本介绍
1 什么是WebClient
- 从 Spring 5 开始,Spring 中全面引入了 Reactive 响应式编程。而 WebClient 则是 Spring WebFlux 模块提供的一个非阻塞的基于响应式编程的进行 Http 请求的客户端工具。
- 由于 WebClient 的请求模式属于异步非阻塞,能够以少量固定的线程处理高并发的 HTTP 请求。因此,从 Spring 5 开始,HTTP 服务之间的通信我们就可以考虑使用 WebClient 来取代之前的 RestTemplate。
2 WebClient 的优势
(1)与 RestTemplate 相比,WebClient 有如下优势:
- 非阻塞,Reactive 的,并支持更高的并发性和更少的硬件资源。
- 提供利用 Java 8 lambdas 的函数 API。
- 支持同步和异步方案。
- 支持从服务器向上或向下流式传输。
(2)RestTemplate 不适合在非阻塞应用程序中使用,因此 Spring WebFlux 应用程序应始终使用 WebClient。在大多数高并发场景中,WebClient 也应该是 Spring MVC 中的首选,并且用于编写一系列远程,相互依赖的调用。
3 使用配置
在pom文件里,导入一下配置即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
二 创建WebClient实例
1 使用 create() 创建
WebClient.create()
: 这是 WebClient 的静态工厂方法之一。调用 WebClient.create()
将直接创建一个默认配置的 WebClient 实例。这个实例可以立即使用,而无需进行进一步的配置。它使用默认的 WebFlux 配置和默认的 WebClientOptions。
WebClient webClient = WebClient.create();
public Order queryOrderById(Long orderId) {
// 1. 查询订单
Order order = orderMapper.findById(orderId);
// 2. 构造远程调用的 URL
String url = "http://localhost:8081/user/" + order.getUserId();
// 3. 发起远程调用,使用 WebClient 替代 RestTemplate
User user = webClient.get()
.uri(url)
.retrieve()
.bodyToMono(User.class)
.block(); // 使用 block() 方法等待结果返回,或者使用 reactive 链式编程来处理响应
// 4. 封装 user 到 order
order.setUser(user);
// 5. 返回 order
return order;
}
2 使用builder 创建(推荐)
WebClient.builder()
: 这是 WebClient 的另一个静态工厂方法。调用 WebClient.builder()
将返回一个 WebClient.Builder 对象,您可以在该对象上进行更多的配置。使用 WebClient.Builder
,您可以设置各种选项,如超时时间、连接池大小、拦截器、错误处理等。
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
三 总结
create()
方法提供了一种简单快速创建默认配置 WebClient 实例的方式,而 builder()
方法则提供了更灵活的配置选项