网络请求客户端WebClient的使用

在 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() 方法则提供了更灵活的配置选项

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Kafka 消费者进程中使用 WebClient 发起网络请求,您可以使用 Spring Framework 中的 WebClient 库来完成。WebClient 是一种异步、非阻塞的 HTTP 客户端,可以与任何 HTTP 服务进行交互,并支持许多功能,例如基本身份验证、Cookie 管理和文件上传等。 以下是一些使用 Spring WebClient 发起网络请求的示例代码: 首先,您需要添加以下 Maven 依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` 然后,您可以使用 WebClient 创建一个 GET 请求: ``` WebClient client = WebClient.create(); client.get() .uri("http://example.com") .retrieve() .bodyToMono(String.class) .subscribe(System.out::println); ``` 此代码将向 http://example.com 发送一个 GET 请求,并将响应主体转换为字符串。当收到响应时,它将在控制台上打印响应。 如果您需要向服务器发送 POST 请求并传递一些数据,您可以使用以下代码: ``` Mono<Void> result = WebClient.create() .post() .uri("http://example.com") .contentType(MediaType.APPLICATION_JSON) .body(BodyInserters.fromValue("{\"name\": \"John\", \"age\": 30}")) .retrieve() .bodyToMono(Void.class); result.block(); ``` 这个例子将使用 JSON 格式的数据向 http://example.com 发送一个 POST 请求。在这种情况下,我们使用了 BodyInserters.fromValue() 方法将数据转换为 JSON 格式,并将 Content-Type 头设置为 application/json。在这个例子中,我们不关心响应体,所以我们将响应体转换为 Void 类型。 需要注意的是,在 Kafka 消费者进程中使用 WebClient 发起网络请求可能会阻塞消费者线程,因此建议使用异步的方式来处理网络请求,以确保消费者线程的及时释放。 ### 回答2: 在Kafka消费者进程中使用WebClient发起网络请求可以通过以下步骤实现: 1. 引入相关依赖:首先,需要在项目的构建文件(如pom.xml或build.gradle)中添加对WebFlux和WebClient的依赖。例如,对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <dependencies> <!-- 其他依赖项 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- 其他依赖项 --> </dependencies> ``` 2. 创建WebClient实例:在消费者进程的代码中,首先需要创建一个WebClient实例。可以使用WebClient.builder()方法来创建一个WebClient.Builder对象,并使用不同的配置方法来设置需要的特性,例如超时时间、连接池等。 ```java WebClient webClient = WebClient.builder() .baseUrl("http://example.com") // 设置请求的基本URL .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // 设置请求头 .build(); ``` 3. 发起网络请求:一旦WebClient实例创建好,就可以使用其提供的方法来发起网络请求。常用的方法包括get()、post()、put()、delete()等。根据具体需求,可以设置请求的URL、请求体、请求参数等信息,并通过调用exchange()或retrieve()方法来执行请求并获取响应。 ```java Mono<String> response = webClient.get() .uri("/api/endpoint") // 设置请求的相对URL .retrieve() // 发起请求并获取响应 .bodyToMono(String.class); // 将响应体解析为字符串 response.subscribe(res -> { // 处理响应结果 System.out.println(res); }, err -> { // 处理请求失败的情况 err.printStackTrace(); }); ``` 通过上述步骤,我们就可以在Kafka消费者进程中使用WebClient发起网络请求,并处理返回结果或错误。根据实际需求,还可以配置更多WebClient的特性,例如添加拦截器、设置代理等,以满足不同的业务需求。 ### 回答3: Kafka消费者进程可以通过使用WebClient类,实现通过发起网络请求来进行交互。 首先,我们需要在Kafka消费者的代码中引入WebClient类的相关依赖库。可以使用Maven或者Gradle将以下依赖添加到项目中: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` 然后,在Kafka消费者进程中创建一个WebClient实例,用于发起网络请求。可以通过WebClient.builder()方法来创建实例,并设置相关的请求配置。例如: ```java WebClient webClient = WebClient.builder() .baseUrl("http://example.com") // 设置请求的基础URL .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // 设置请求头 .build(); ``` 接下来,可以使用WebClient实例来发起网络请求。例如,使用GET方法请求一个URL,并读取响应内容: ```java webClient.get() .uri("/api/getData") // 设置请求的URI .retrieve() // 发起请求并获取响应 .bodyToMono(String.class) // 将响应转换为字符串 .subscribe(response -> { System.out.println(response); // 打印响应内容 }); ``` 使用POST方法发送包含请求体的请求: ```java webClient.post() .uri("/api/submitData") // 设置请求的URI .bodyValue(requestData) // 设置请求体数据 .retrieve() // 发起请求并获取响应 .bodyToMono(String.class) // 将响应转换为字符串 .subscribe(response -> { System.out.println(response); // 打印响应内容 }); ``` 需要注意的是,WebClient是一种基于响应式编程的客户端工具,所以使用它时需要注意异步操作和订阅响应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知意..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值