一文读懂WebClient和RestTemplate的差异
自 Spring 5 以来,WebClient已成为Spring WebFlux的一部分,并且是发出 HTTP 请求的首选方式。它是经典RestTemplate的首选替代方案,后者自 Spring 5.0 以来一直处于维护模式。
本文将讨论 Spring WebClient和RestTemplate类之间的主要区别。
1. WebClient和RestTemplate快速比较
特征 | WebClient | RestTemplate |
反应式编程 | 基于反应式原则构建并支持反应式编程。 | 同步而不是为反应式编程而设计。 |
技术 | 构建在反应式技术栈上。 | 构建在 Servlet 技术栈上。 |
线程模型 | 采用非阻塞I/O,适合处理大量并发请求。 | 使用阻塞 I/O,在高并发场景下可能会导致线程阻塞。 |
Java版本 | 需要 Java 8+ 或更高版本。支持函数式编程。 | 与 Java 6+ 或更高版本兼容。 |
错误处理 | 使用onErrorResume、onErrorReturn等运算符提供强大的错误处理。 | 错误处理通常使用 try-catch 块完成。 |
流媒体 | 支持使用Flux和Mono流式传输数据,适合反应式流式场景。 | 对流的支持有限,不太适合反应式流。 |
用例 | 最适合微服务、反应式应用以及需要高并发的场景。 | 适用于传统的整体应用程序和简单的用例。 |
依赖关系 | 需要Spring WebFlux依赖项。 | 需要Spring Web依赖。 |
未来的支持 | 与反应式编程模型保持一致,并可能会得到持续的开发和支持。 | 可能会维护更新,将来可能不会受到那么多关注。 |
2. 阻塞RestTemplate与非阻塞WebClient对比
2.1.RestTemplate
RestTemplate本质上是阻塞的,并使用 Java Servlet API 的每个请求一个线程模型。这意味着RestTemplate一旦向远程服务器发送请求,就会等待响应。默认情况下,每次RestTemplate都会创建新的,并在收到并处理响应后关闭连接。Httpconnection 创建和关闭 URL 连接是一项成本高昂的操作。为了在生产类应用程序中有效地使用RestTemplate ,我们必须使用HTTP 连接池,否则性能会快速下降。当应用程序中有大量请求时,线程和连接的数量也会按比例增加。这会给服务器资源带来负担。如果服务器速度缓慢,用户很快就会发现应用程序性能下降,甚至无响应。
请注意,RestTemplate 是线程安全的,并且可以随时在多个连接之间共享单个实例。
@Service
public class MyService {private final RestTemplate restTemplate;@Autowiredpublic MyService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public String getData() {ResponseEntity<String> responseEntity= restTemplate.getForEntity("https://api.example.com/data", String.class);String responseBody = responseEntity.getBody();return responseBody;}
}
2.2.WebClient
与RestTemplate相反,WebClient本质上是异步且非阻塞的。它遵循 Spring WebFlux 反应式框架的事件驱动架构。使用WebClient,客户端无需等待响应返回。相反,当服务器有响应时,它将使用回调方法收到通知。
当我们通过WebClient调用返回 Mono或 Flux 的API 时,API 会立即返回。而调用结果将通过 mono 或 flux 回调传递给调用端。
请注意,如果需要,我们可以通过WebClient.block()方法实现类似RestTemplate的同步处理。
@Service
public class MyService {private final WebClient webClient;@Autowiredpublic MyService(WebClient webClient) {this.webClient = webClient;}public Mono<String> getData() {return webClient.get().uri("/data").retrieve().bodyToMono(String.class).subscribe(// onSuccess callbackresult -> {System.out.println("Success: " + result);},// onError callbackerror -> {System.err.println("Error: " + error.getMessage());});}
}
3.结论
从上面可以清楚地看出, WebClient和RestTemplate之间唯一的大区别是它们的阻塞性质。RestTemplate会阻止请求线程,而WebClient不会。我们可以使用WebClient来发出同步请求,但反之则不行。RestTemplate无法发出异步请求。
虽然WebClient是未来使用的首选方式,但 RestTemplate 应该会长期保留,尽管没有添加任何新的核心功能。
在考虑使用WebClient 构建新应用程序时,我们必须记住,要构建真正的非阻塞应用程序,必须以非阻塞方式创建/使用其所有组件,即客户端、控制器、中间服务,甚至数据库。如果其中之一阻塞了请求,目的就会落空。
相关文章:

一文读懂WebClient和RestTemplate的差异
自 Spring 5 以来,WebClient已成为Spring WebFlux的一部分,并且是发出 HTTP 请求的首选方式。它是经典RestTemplate的首选替代方案,后者自 Spring 5.0 以来一直处于维护模式。 本文将讨论 Spring WebClient和RestTemplate类之间的主要区别。…...

如何使用SpringBoot处理全局异常
如何使用SpringBoot处理全局异常 使用ControllerAdvice 和 ExceptionHandler处理全局异常 参考: ControllerAdvice ResponseBody Slf4j public class ExceptionHandler {ResponseStatus(HttpStatus.OK)org.springframework.web.bind.annotation.ExceptionHandler…...

【2023CANN训练营第二季】——通过一份入门级算子开发代码了解Ascend C算子开发流程
本次博客讲解的代码是Gitee代码仓的Ascend C加法算子开发代码,代码地址为: quick-start 打开Add文件,可以看到文件结构如下: 其中add_custom.cpp是算子开发的核心文件,包括了核函数的实现,展示了如何在Asc…...

建模仿真软件 Comsol Multiphysics mac中文版软件介绍
COMSOL Multiphysics mac是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件,拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真 App等相关功能,轻松实现各个环节的流畅进行,它能够解释耦合或多物理现象。 附加产品扩展了…...

深入理解强化学习——强化学习的历史:近代强化学习的发展
分类目录:《深入理解强化学习》总目录 在《深入理解强化学习——强化学习的历史》前面的文章中我们讨论了最优控制和试错学习学习的思想,接下来,我们将讨论一些在20世纪60年代和70年代,在试错学习计算和理论研究被相对忽视的时候&…...

移动端ViT新利器!苹果提出稀疏专家混合模型Mobile V-MoEs
文章链接:https://arxiv.org/abs/2309.04354 最近,专家混合模型MoE受到了学术界和工业界的广泛关注,其能够对任意输入来激活模型参数中的一小部分来将模型大小与推理效率分离,从而实现模型的轻量化设计。目前MoE已经在自然语言处理…...

【linux系统】服务器安装Pycharm
文章目录 安装pycharm步骤1. 进入pycharm官网2. 上传到服务器3. 安装过程 摘要:pycharm是Python语言的图形化开发工具。因为如果在Linux环境下的Python shell 中直接进行编程,其无法保存与修改,在大型项目当中这是很不方便的,而py…...

便利连锁:如何增加收益?教你一招轻松搞定!
自动售货机,作为零售行业的一项颠覆性技术,正逐渐改变着我们的购物方式和商业格局。这一创新技术不仅重新定义了零售业务模式,还为企业提供了更多的机会来满足不断演变的消费者需求。 客户案例 便利连锁店 成都某便利连锁店面临一系列挑战&am…...

STM32-程序占用内存大小计算
STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码。 RO-data存储const常量和指令。 RW-data存储初始化值不为0的全局变量。 ZI-data存储未初始化的全局变量或初始化值为0的全局变量。 占用的FlashCode RO Data RW Data; 运行消…...

鱼眼图像去畸变python / c++
#鱼眼模型参考链接 本文假设去畸变后的图像与原图大小一样大。由于去畸变后的图像符合针孔投影模型,因此不同的去畸变焦距得到不同的视场大小,且物体的分辨率也不同。可以见上图,当焦距缩小为一半时,相同大小的图像(横…...

文心一言简单体验
百度正式发布文心一言,文心一言 这里的插件模式挺有意思: 测试了一下图解说明,随意上传了一张图片: 提供图解让反过来画,抓住了部分重点,但是还是和原图有比较大的差异! 百宝箱 暂未逐个体验&am…...

css正确的语法
Cascading Style Sheets (CSS) 是一种用于定义网页元素外观和样式的标记语言。以下是正确的 CSS 语法要点: 选择器 (Selector): 选择器用于指定要应用样式的 HTML 元素。例如,选择器可以是标签名、类名、ID、属性等。例如: 标签名选择器&…...

【PG】PostgresSQL角色管理
目录 角色概念 查询现有角色 列出当前角色 创建角色 删除角色 更改角色 创建角色举例 预定义角色 角色属性 登陆角色 超级用户角色 创建数据库角色 创建role角色 复制角色 创建带有密码的角色 角色成员关系 角色组概念 角色组增加成员 角色组移除成员 删除角…...

百度智能云获评Forrester中国市场人工智能/机器学习平台领导者
写在前面百度智能云AI平台,打造企业智能化转型的基础设施大模型时代,百度智能云AI平台迎来全面升级 写在前面 日前,国际权威咨询机构 Forrester 发布了最新的《The Forrester Wave™:中国市场人工智能/机器学习平台厂商评测&…...

基于java+swing+mysql实现的仓库商品管理系统
JavaSwingmysql用户信息管理系统 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统? 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统实现了两个角色层面的功能,管理员可以管理用户、仓库、商品…...

深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南 前言第一:AOP和代理模式AOP(面向切面编程):代理模式: 第二:深入分析CGLIB代理,包括其实现原理和内部机制CGLIB的实现原理…...

【无标题】读书笔记之《智能化社会:未来人们如何生活、相爱和思考》
《智能化社会:未来人们如何生活、相爱和思考》:Digital vs Human_ how well live, love, and think in the future ,由中信出版社于2017年06月出版。作者是澳大利亚的理查德沃特森(Richard Watson)。Richard Watson在伦敦帝国理工学院从事未来…...

华为云双十一服务器数据中心带宽全动态BGP和静态BGP区别
2023华为云双十一优惠活动中提供多款云服务器选择,需要注意的是:西南-贵阳一和华北-北京一数据中心是静态BGP带宽,其他数据中心配置全动态独享BGP带宽。 静态BGP和全动态BGP带宽有什么区别?全动态BGP网络线路可用性保障更高&…...

STM32 HAL库串口使用printf
STM32 HAL库串口使用printf 背景配置说明在usart.h中添加在usart.c中添加在工程中选中微库: 测试 背景 在我们使用CubeMX生成好STM32 HAL库工程之后,我们想使用printf函数来打印一些信息,配置如下: 配置说明 在usart.h中添加 …...

【VPX610】 青翼科技基于6U VPX总线架构的高性能实时信号处理平台
板卡概述 VPX610是一款基于6U VPX架构的高性能实时信号处理平台,该平台采用2片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元,采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元,具有2个FMC子卡接口,各个处理节点之…...

Parity 战略转型引热议,将如何推动波卡生态去中心化?
Polkadot 生态的区块链基础设施公司 Parity Technologies,最近宣布了一项重要的战略调整,即正在寻求在未来几个月内,将部分现有的市场职能转移给 Polkadot 生态系统内的多个去中心化团队,这将影响 Parity Technologies 未来几个月…...

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台
板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台,该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元,该板卡具有4个FMC子卡接口(其中有2个为FMC接口)&#x…...

Spring Kafka生产者实现
需求 我们需要通过Spring Kafka库,将消息推送给Kafka的topic中。这里假设Kafka的集群和用户我们都有了。这里Kafka认证采取SASL_PLAINTEXT方式接入,SASL 采用 SCRAM-SHA-256 方式加解密。 pom.xml <dependency><groupId>org.springframew…...

手把手教你入门Three.js(初识篇)
Three.js入门篇 一、Three.js和webGL的介绍二、开发和学习环境三、 三个基本概念1. 场景Scene2. 相机Camera3. 渲染器Renderer 四、三维坐标系五、材质Material六、光源1. 点光源2. 环境光3. 平行光: 七、常见几何体八、渲染器-设置设备像素比九、渲染器-锯齿属性 一、Three.js…...

Hadoop学习总结(搭建Hadoop集群(伪分布式模式))
如果前面有搭建过Hadoop集群完全分布式模式,现在搭建Hadoop伪分布式模式可以选择直接克隆完全分布式模式中的主节点(hadoop001)。以下是在搭建过完全分布式模式下的Hadoop集群的情况进行 伪分布式模式下的Hadoop功能与完全分布式模式下的Hadoop功能相同。 一、克隆…...

人性与理性共赢,真心罐头跃过增长的山海关
在北方不少地方,黄桃罐头是一种抚慰人心的力量。从大连起家,用真材实料打动人心的真心罐头,在朝着国民品牌前进的路上,需要更透彻地洞悉“人性”。 ”人的因素影响太大。我们希望可以告别个人英雄主义,用流程来保证可…...

【Redis】Docker部署Redis数据库
Docker部署Redis数据库 1. Redis介绍2. CentOS 7 安装 & Docker 配置3. 拉取Redis 镜像、创建容器3.1 配置Docker镜像源3.2 拉取Redis 镜像3.3 容器创建 1. Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用…...

【目标跟踪】多目标跟踪测距
文章目录 前言python代码(带注释)main.pysort.pykalman.pydistance.py 结语 前言 先放效果图。目标框内左上角,显示的是目标距离相机的纵向距离。目标横向距离、速度已求出,没在图片展示。这里不仅仅实现对目标检测框的跟踪&#…...

吐血整理,服务端性能测试-Docker部署MySQL/Nginx(详细步骤)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 基于Docker部署My…...

基于单片机设计的智能窗帘控制系统
一、前言 智能家居技术在近年来取得了巨大的发展,并逐渐成为人们日常生活中的一部分。智能家居系统带来了便利、舒适和高效的生活体验,拥有广泛的应用领域,其中之一就是智能窗帘控制系统。 传统窗帘需要手动操作,打开或关闭窗帘…...