当前位置: 首页 > news >正文

Spring Boot 中 WebClient 的实践详解

在现代微服务架构中,服务之间的通信至关重要。Spring Boot 提供了 WebClient,作为 RestTemplate 的替代方案,用于执行非阻塞式的 HTTP 请求。本文将详细讲解 WebClient 的实践,包括配置、使用场景以及常见的优化策略,帮助你在项目中更高效地使用 WebClient。

一、什么是 WebClient?
WebClient 是 Spring WebFlux 提供的非阻塞式 HTTP 客户端,它支持同步和异步的调用方式,适合高并发场景下的服务通信。与传统的 RestTemplate 相比,WebClient 的特点包括:

  • 非阻塞式 I/O:更高的性能,适合处理大量请求。
  • 强大的功能:支持流式处理、拦截器、请求超时等高级功能。
  • 灵活性:支持多种编码方式和请求类型。

二、引入依赖
在使用 WebClient 之前,需要确保你的 Spring Boot 项目已包含相关依赖。以下是常见的 Maven 依赖:

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

三、配置 WebClient
1、基本配置
WebClient 可以通过静态方法 WebClient.create() 创建,也可以通过 WebClient.Builder 定制。

以下是一个最基本的配置:

import org.springframework.web.reactive.function.client.WebClient;@Configuration
public class WebClientConfig {@Beanpublic WebClient webClient() {return WebClient.create("https://api.example.com");}
}

2、高级配置
为了增强 WebClient 的灵活性,可以使用 WebClient.Builder 来配置全局属性,比如超时设置、全局拦截器等:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;@Configuration
public class WebClientConfig {@Beanpublic WebClient webClient(WebClient.Builder builder) {return builder.baseUrl("https://api.example.com").defaultHeader("Authorization", "Bearer your-token").exchangeStrategies(ExchangeStrategies.builder().codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(16 * 1024 * 1024)) // 设置最大内存限制为16MB.build()).build();}
}

四、WebClient 的使用场景
1、发起 GET 请求
以下示例展示了如何使用 WebClient 发起一个简单的 GET 请求:

import org.springframework.web.reactive.function.client.WebClient;@Service
public class ApiService {private final WebClient webClient;public ApiService(WebClient webClient) {this.webClient = webClient;}public String fetchData() {return webClient.get().uri("/data").retrieve().bodyToMono(String.class).block(); // 同步方式获取结果}
}

2、发起 POST 请求
对于 POST 请求,可以发送 JSON 数据:

import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;@Service
public class ApiService {private final WebClient webClient;public ApiService(WebClient webClient) {this.webClient = webClient;}public String postData(Object requestData) {return webClient.post().uri("/submit").body(Mono.just(requestData), Object.class).retrieve().bodyToMono(String.class).block();}
}

五、优化和最佳实践
1、超时设置
为避免长时间等待,建议为 WebClient 配置超时时间:

import java.time.Duration;@Bean
public WebClient webClientWithTimeout(WebClient.Builder builder) {return builder.baseUrl("https://api.example.com").defaultHeaders(headers -> headers.set("Authorization", "Bearer token")).build().mutate().responseTimeout(Duration.ofSeconds(5)) // 设置响应超时时间.build();
}

2、 使用拦截器
拦截器可以用于日志记录或添加全局参数:

@Bean
public WebClient.Builder webClientBuilder() {return WebClient.builder().filter((request, next) -> {System.out.println("Request: " + request.url());return next.exchange(request);});
}

3、异步调用
WebClient 原生支持异步编程,适合处理高并发请求场景:

public Mono<String> fetchDataAsync() {return webClient.get().uri("/data").retrieve().bodyToMono(String.class);
}

六、错误处理
1、使用 onStatus 处理 HTTP 错误
WebClient 提供了灵活的错误处理机制:

import org.springframework.web.reactive.function.client.WebClientResponseException;public String fetchWithErrorHandling() {return webClient.get().uri("/data").retrieve().onStatus(status -> status.is4xxClientError(),response -> Mono.error(new RuntimeException("Client error!"))).onStatus(status -> status.is5xxServerError(),response -> Mono.error(new RuntimeException("Server error!"))).bodyToMono(String.class).block();
}

2、捕获异常
可以通过 doOnError 捕获并处理异常:

public Mono<String> fetchWithExceptionHandling() {return webClient.get().uri("/data").retrieve().bodyToMono(String.class).doOnError(e -> {if (e instanceof WebClientResponseException) {WebClientResponseException ex = (WebClientResponseException) e;System.err.println("Error response: " + ex.getResponseBodyAsString());}});
}

结语
WebClient 是一个功能强大且灵活的 HTTP 客户端,适合在高并发场景下替代 RestTemplate 使用。在实际项目中,通过合理的配置和优化,可以显著提高服务间通信的效率和可靠性。

相关文章:

Spring Boot 中 WebClient 的实践详解

在现代微服务架构中&#xff0c;服务之间的通信至关重要。Spring Boot 提供了 WebClient&#xff0c;作为 RestTemplate 的替代方案&#xff0c;用于执行非阻塞式的 HTTP 请求。本文将详细讲解 WebClient 的实践&#xff0c;包括配置、使用场景以及常见的优化策略&#xff0c;帮…...

在GITHUB上传本地文件指南(详细图文版)

这份笔记简述了如何在GITHUB上上传文件夹的详细策略。 既是对自己未来的一个参考&#xff0c;又希望能给各位读者带来帮助。 详细步骤 打开目标文件夹&#xff08;想要上传的文件夹&#xff09; 右击点击git bash打开 GitHub创立新的仓库后&#xff0c;点击右上方CODE绿色按…...

【大模型系列篇】LLaMA-Factory大模型微调实践 - 从零开始

前一次我们使用了NVIDIA TensorRT-LLM 大模型推理框架对智谱chatglm3-6b模型格式进行了转换和量化压缩&#xff0c;并成功部署了推理服务&#xff0c;有兴趣的同学可以翻阅《NVIDIA TensorRT-LLM 大模型推理框架实践》&#xff0c;今天我们来实践如何通过LLaMA-Factory对大模型…...

30天学会Go--第7天 GO语言 Redis 学习与实践

30天学会Go–第7天 GO语言 Redis 学习与实践 文章目录 30天学会Go--第7天 GO语言 Redis 学习与实践前言一、Redis 基础知识1.1 Redis 的核心特性1.2 Redis 常见使用场景 二、安装 Redis2.1 在 Linux 上安装2.2 在 Windows 上安装2.3 使用 Docker 安装 Redis 三、Redis 常用命令…...

java 使用JSqlParser和CCJSqlParser 解析sql

maven <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.9</version> </dependency>解析SQL String sql "select aa,bb from b"; Statement statementCCJSq…...

基于spring boot的高校专业实习管理系统的设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 设计题目&#xff1a;基于spring boot的高校专业实习管理系统的设计与实现 摘 要 随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开…...

OpenCV相机标定与3D重建(11)机器人世界手眼标定函数calibrateRobotWorldHandEye()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算机器人世界/手眼标定&#xff1a; w T b _{}^{w}\textrm{T}_b w​Tb​ 和 c T g _{}^{c}\textrm{T}_g c​Tg​。 cv::calibrateRobotWorldHa…...

计算机网络ENSP课设--三层架构企业网络

本课程设计搭建一个小型互联网&#xff0c;并模拟Internet的典型Web服务过程。通过此次课程设计&#xff0c;可以进一步理解Internet的工作原理和协议过程&#xff0c;并提高综合知识的运用能力和分析能力。具体目标包括&#xff1a; &#xff08;1&#xff09;掌握网络拓扑的…...

【openwrt】openwrt-21.02 基于IP地址使用ipset实现策略路由操作说明

openwrt版本信息 DISTRIB_ID=OpenWrt DISTRIB_RELEASE=21.02-SNAPSHOT DISTRIB_REVISION=r0-6bf6af1d5 DISTRIB_TARGET=mediatek/mt7981 DISTRIB_ARCH=aarch64_cortex-a53 DISTRIB_DESCRIPTION=OpenWrt 21.02-SNAPSHOT r0-6bf6af1d5 DISTRIB_TAINTS=no-all busybox override …...

Git:常用命令

一、查看当前分支 git branch 二、查看所有分支 git branch -a 三、切换到远程分支 git checkout origin/分支名 示例&#xff1a;git checkout origin/dev 四、拉取远程分支代码 git pull origin 分支名 示例&#xff1a;git pull origin dev 五、常用指令 查看暂存区…...

【2025最新版】搭建个人博客教程

【2025最新版】搭建个人博客教程 –小记&#xff1a; 在搭建我的这个博客之前我在CSDN也发布过一些文章&#xff0c;目前应该也是几千粉丝了&#xff0c;但是看到别人都是用自己博客写的就感觉自己很LOW&#xff0c;所以就想自己来搭建一个属于自己的个人博客。当然搭建博客的…...

微信小程序实现联动删除输入验证码框

以下是json代码 {"component": true,"usingComponents": {} }以下是wxml代码 <van-popup show"{{ show }}" bind:close"onClose" custom-class"extract"><image src"../../images/extract/icon1.png"…...

数据库中decimal、float 和 double区别

在计算机科学中&#xff0c;decimal、float 和 double 是用于表示和处理数值的不同数据类型。 - decimal 是一种精确的十进制浮点数表示&#xff0c;通常用于需要高精度计算的场景&#xff0c;比如财务应用。它能够精确表示小数&#xff0c;并且不会出现浮点数运算误差。 - flo…...

网络编程01

1. 概念 通过网络&#xff0c;让两个主机之间能够进行通信&#xff0c;基于这样的通信完成一定的功能 只要满足进程不同即可&#xff0c;即使是同一个主机&#xff0c;只要是不同的进程&#xff0c;基于网络完成编程 进行网络编程时&#xff0c;需要操作系统提供一组API&…...

el-dialog修改其样式不生效加deep也没用

场景 el-dialog标签直接写在了template下。 解决方法 在template中先写一层div&#xff0c;包裹住el-dialog。...

三天精通一算法之快速排序

力扣链接912. 排序数组 - 力扣&#xff08;LeetCode&#xff09;注意这题快排不能用递归&#xff0c;否则堆会爆 快速排序&#xff08;Quicksort&#xff09;是一种高效的排序算法&#xff0c;通常使用分治法来将一个列表分成较小的子列表&#xff0c;然后递归地排序这些子列表…...

互联网、物联网的相关标准

互联网的相关标准 网络通信协议&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型&#xff0c;客户端发送请求给服务器&#xff0c;服务器返回响应。HTTPS&a…...

Linux题库及答案

填空题 1. 建立用户账号的命令是__useradd________。 2. 修改账号密码的命令是__passwd________。 3. 更改用户密码过期信息的命令是__chage________。 4. 创建一个新组的命令是___groupadd_______。 5. 用于在不注销的情况下切换到系统中的另一个用户的命令是___su_…...

Android 镜像模式和扩展模式区别探讨-Android14

Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...

深度学习笔记之BERT(五)TinyBERT

深度学习笔记之TinyBERT 引言回顾&#xff1a;DistilBERT模型TinyBERT模型结构TinyBERT模型策略Transformer层蒸馏嵌入层蒸馏预测层蒸馏 TinyBERT模型的训练效果展示 引言 上一节介绍了 DistilBERT \text{DistilBERT} DistilBERT模型&#xff0c;本节将继续介绍优化性更强的知…...

【时间序列预测】基于PyTorch实现CNN_BiLSTM算法

文章目录 1. CNN与BiLSTM2. 完整代码实现3. 代码结构解读3.1 CNN Layer3.2 BiLSTM Layer3.3 Output Layer3.4 forward Layer 4. 应用场景5. 总结 本文将详细介绍如何使用Pytorch实现一个结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&am…...

联想Y7000 2024版本笔记本 RTX4060安装ubuntu22.04双系统及深度学习环境配置

目录 1..制作启动盘 2.Windows 磁盘分区,删除原来ubuntu的启动项 3.四个设置 4.安装ubuntu 5.ubuntu系统配置 1..制作启动盘 先下载镜像文件,注意版本对应。Rufus - 轻松创建 USB 启动盘 用rufus制作时,需要注意选择正确的分区类型和系统类型。不然安装的系统会有问题…...

VuePress学习

1.介绍 VuePress 由两部分组成&#xff1a;第一部分是一个极简静态网站生成器 (opens new window)&#xff0c;它包含由 Vue 驱动的主题系统和插件 API&#xff0c;另一个部分是为书写技术文档而优化的默认主题&#xff0c;它的诞生初衷是为了支持 Vue 及其子项目的文档需求。…...

一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程

一、现象 okhttp调用某个服务&#xff0c;如果第二次访问间隔上一次访问时间超过60s&#xff0c;返回错误&#xff1a;"unexpected end of stream"。 二、最终定位原因&#xff1a; 空闲连接如果超过60秒&#xff0c;服务端会主动关闭连接。此时客户端恰巧访问了这…...

SQL最佳实践:避免使用COUNT=0

如果你遇到类似下面的 SQL 查询&#xff1a; SELECT * FROM customer c WHERE 0 (SELECT COUNT(*)FROM orders oWHERE o.customer_id c.customer_id);意味着有人没有遵循 SQL 最佳实践。该语句的作用是查找没有下过订单的客户&#xff0c;其中子查询使用了 COUNT 函数统计客…...

PG与ORACLE的差距

首先必须是XID 64&#xff0c;一个在极端环境下会FREEZE的数据库无论如何都无法承担关键业务系统的重任的&#xff0c;我们可以通过各种配置&#xff0c;提升硬件的性能&#xff0c;通过各种IT管控措施来尽可能避免在核心系统上面临FREEZE的风险&#xff0c;不过并不是每个企业…...

树莓派3B+驱动开发(2)- LED驱动(传统模式)

github主页&#xff1a;https://github.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/RaspberryPiDriver 本项目硬件地址&#xff1a;https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban 欢迎交流 笔记说明 如我在驱动开发总览中说的那样&…...

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发&#xff0c;搭建开发环境是第一步&#xff0c;网上下载PhpStorm和PhpStudy软件&#xff0c;怎样安装和激活就不详细说了&#xff0c;我们重点来看一看怎样搭配这两个开发环境。 前提&#xff1a;现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...

分析比对vuex和store模式

在 Vue 中&#xff0c;Vuex 和 store 模式 是两个不同的概念&#xff0c;它们紧密相关&#xff0c;主要用于管理应用的状态。下面我会详细介绍这两个概念&#xff0c;并通过例子帮助你更好地理解。 1. Vuex 是什么&#xff1f; Vuex 是 Vue.js 的一个状态管理库&#xff0c;用…...

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…...

东莞网站建设_东莞网页设计/自己如何注册网站

B2C(Business to Customer)。B2C中的B是Business&#xff0c;意思是企业&#xff0c;2则是to的谐音&#xff0c;C是Customer&#xff0c;意思是消费者&#xff0c;所以B2C是企业对消费者的电子商务模式。这种形式的电子商务一般以网络零售业为主&#xff0c;主要借助于Internet…...

网站运营与维护是什么/b2b平台有哪几个

hikvision-control实现hikvision网络摄像机的登录、云台旋转控制、实时图片截取功能。库文件安装将src-dll文件夹中的文件拷贝到系统的库文件目录&#xff0c;主意文件名称不要进行修改。windows7&#xff0c;windows server目录如下&#xff1a;C:\Windows\System32当然你也可…...

成都装修公司网站建设/我的百度购物订单

前言近一周学习了CSS的用法&#xff0c;在此对一周所学进行总结。语法常用的CSS语法大致可分为四种,&#xff1a;选择器{属性名: 属性值 /*注释*/}&#xff0c;如div{background: red;}2. charset&#xff0c;用于设置样式表中的字符编码&#xff0c;必须放在第一行&#xff0c…...

莆田做网站建设/优化设计方法

jsp初学者必备知识一、bs模式&#xff0c;cs模式的概念&#xff1a;二、web应用程序是什么三、如何将开发的web项目部署到服务器总结前言 ##刚开始学习jsp应该有点困难吧&#xff0c;掌握这几个基础知识就会好了很多哦&#xff1a;bs模式&#xff0c;cs模式的概念&#xff0c…...

做房产推广那个网站好/全国疫情实时动态

配置文件 ​ Redis 的配置文件位于 Redis 安装目录下&#xff0c;文件名为 redis.conf(Windows 名为 redis.windows.conf)。 你可以通过 config命令查看或设置配置项。 获取配置 语法&#xff1a; config get xxx ​ 这里的xxx就是配置文件的东西&#xff0c;如查配置文件…...

广东万高建设网站/哪家建设公司网站

您将在本节继续团队介绍页面的制作,为另一个团队成员制作动画展示效果。首先使用键盘上的快捷键,复制当前幻灯片。 选择此处的椭圆图片。 在视图比例滑杆上点击,缩小幻灯片的显示比例。 按下键盘上的shift键。 在按下该键的同时,点击此处以同时选择多个对象。 向左侧拖…...