当前位置: 首页 > 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;本节将继续介绍优化性更强的知…...

IO 多路复用、网络协议与爬虫抓包介绍

文章目录 一、IO多路复用 二、网络数据包处理的细节 三、应用层协议 1.单元信息表示方式 1.1行文本 1.2html 1.3xml 1.4json 1.5protobuf 2.现成协议 2.1HTTP协议 四、代理 五、抓包 六、爬虫 一、IO多路复用 一个线程一时连接管理着多个socket 通过操作系统全局…...

别再只盯着GNSS了!用移远EC20模组实现基站定位的完整配置流程(含免费Token申请)

移远EC20模组基站定位实战&#xff1a;从零配置到室内场景精准落地 在物联网设备定位领域&#xff0c;GNSS卫星定位长期占据主导地位&#xff0c;但鲜为人知的是&#xff0c;像移远EC20这样的LTE模组还隐藏着一个被低估的功能——基站定位。当你的智能水表安装在地下室、共享设…...

Linux 内核模块编程入门

Linux 内核模块编程入门 内核模块的重要性 作为科技创业者&#xff0c;我深刻理解内核模块在系统开发中的灵活性和强大功能。内核模块允许我们在不重新编译整个内核的情况下&#xff0c;动态地添加或移除功能。这种机制不仅加快了开发迭代速度&#xff0c;还为产品定制化提供了…...

小白也能搞定!用Docker和Halo 2.10搭建个人博客,再也不用担心公网访问问题

零基础玩转DockerHalo 2.10&#xff1a;打造高颜值个人博客全攻略 在数字内容创作爆发的时代&#xff0c;拥有一个专属博客空间已成为个人品牌建设的标配。但传统建站方案往往面临技术门槛高、维护成本大等痛点。本文将带你用Docker容器技术和Halo 2.10开源系统&#xff0c;30…...

aircrack-ng使用教程

aircrack-ng是一款用于无线网络安全评估的工具套件&#xff0c;主要用于破解WEP和WPA/WPA2-PSK加密的无线网络密码。它通过分析捕获的数据包&#xff0c;利用密码破解技术来获取网络密钥&#xff0c;是网络安全测试和渗透测试中常用的工具之一。该工具支持多种攻击模式和优化选…...

用Docker三分钟搞定Hive伪分布式环境(附本地开发调试技巧)

用Docker三分钟搞定Hive伪分布式环境&#xff08;附本地开发调试技巧&#xff09; 在数据分析和处理领域&#xff0c;Hive作为基于Hadoop的数据仓库工具&#xff0c;因其能够处理海量数据并提供类SQL查询能力而广受欢迎。然而&#xff0c;传统的Hive环境搭建往往需要配置复杂的…...

深入剖析大数据领域数据分片的优缺点

深入剖析大数据领域数据分片的优缺点 关键词&#xff1a;数据分片、大数据架构、分片策略、水平扩展、分布式系统 摘要&#xff1a;在大数据时代&#xff0c;单台服务器已无法承载海量数据的存储与计算需求&#xff0c;数据分片&#xff08;Sharding&#xff09;作为分布式系统…...

OpenClaw对接Qwen3-32B-Chat私有镜像:RTX4090D本地部署全流程

OpenClaw对接Qwen3-32B-Chat私有镜像&#xff1a;RTX4090D本地部署全流程 1. 为什么选择本地私有化部署&#xff1f; 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理周报时&#xff0c;发现公有云API的响应延迟和隐私顾虑成了瓶颈。直到在星图镜像广场发现Qwen3-32…...

如何快速下载Google Drive受保护PDF:终极免费解决方案指南

如何快速下载Google Drive受保护PDF&#xff1a;终极免费解决方案指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 你是否经常遇到Google Drive中那些"仅查看"权限的PDF文件&am…...

Windows音频捕获新方案:实现进程级精准录音的技术实践

Windows音频捕获新方案&#xff1a;实现进程级精准录音的技术实践 【免费下载链接】win-capture-audio An OBS plugin that allows capture of independant application audio streams on Windows, in a similar fashion to OBSs game capture and Discords application stream…...