弃用RestTemplate,RestClient真香!
在Spring框架的发展历程中,RestTemplate作为发起HTTP请求的同步API,曾经扮演着举足轻重的角色。然而,随着技术的不断进步和微服务架构的普及,RestTemplate的局限性逐渐显现,尤其是在处理高并发和异步请求时。因此,Spring框架引入了RestClient,作为RestTemplate的现代化替代方案,其流畅且同步的API设计、可测试性以及对服务发现负载均衡的支持,都使得RestClient成为了新的宠儿。
RestTemplate的局限性
-
阻塞性质:RestTemplate是一个阻塞、同步客户端,执行请求的线程会阻塞直到操作完成。这种模型在重负载下可能导致线程池耗尽,增加延迟,限制了系统的可扩展性。
-
缺乏反应式编程支持:在基于云的生态系统中,反应式编程日益受到重视,因为它使系统更具响应性、弹性和伸缩性。然而,RestTemplate不支持反应式编程,无法满足现代系统对高性能和低延迟的需求。
-
过时的API:RestTemplate是Spring 3中引入的,虽然功能强大,但拥有过多的重载方法,使得API显得臃肿。随着Spring框架的不断演进,更现代、更简洁的API成为了开发者的新追求。
RestClient的崛起
从Spring Framework 6.1和Spring Boot 3.2开始,RestClient正式登上历史舞台。它基于底层的HTTP客户端库(如JDK HttpClient、Apache HttpComponents等)工作,提供了像WebClient一样更现代、流畅的API设计,同时保留了RestTemplate的功能。
-
现代化API:RestClient的API设计更加简洁、流畅,避免了RestTemplate中过多的重载方法。这使得代码更加易读、易维护。
-
可测试性:RestClient在设计时就考虑了可测试性,使得在单元测试中模拟HTTP交互变得更加容易。这有助于开发者编写更健壮、更可靠的代码。
-
服务发现负载均衡:从Spring Cloud 4.1.0开始,RestClient就支持服务发现的负载均衡。这意味着在使用RestClient进行远程调用时,可以自动根据服务名进行负载均衡,提高了系统的可用性和稳定性。
-
无需额外依赖:与WebClient相比,RestClient不需要额外的spring-boot-starter-webflux依赖。这使得在项目中引入RestClient更加简单、方便。
RestClient的使用示例
RestClient的使用非常简单,可以通过create()方法或builder()方法来初始化RestClient Bean。以下是一个简单的使用示例:
@Value("${pack.remote.address:http://www.pack.com}")
private String baseURI;@Bean
public RestClient restClient() {return RestClient.create(baseURI);
}// 或者使用builder()方法来设置更复杂的选项
@Bean
public RestClient restClient(CloseableHttpClient httpClient) {return RestClient.builder().baseUrl(baseURI).requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)).build();
}// 发送GET请求
List<User> list = restClient.get().uri("/users").accept(MediaType.APPLICATION_JSON).retrieve().bodyToList(User.class);// 发送POST请求
User user = new User(666L, "张三", 22);
restClient.post().uri("/users").contentType(MediaType.APPLICATION_JSON).body(user).retrieve().toBodilessEntity();
总结
随着Spring框架的不断演进,RestClient作为RestTemplate的现代化替代方案,以其简洁、流畅、可测试以及支持服务发现负载均衡等特性,赢得了开发者的青睐。在未来的Spring Boot项目中,RestClient将成为发起HTTP请求的首选方案。对于那些还在使用RestTemplate的开发者来说,是时候拥抱RestClient,享受它带来的真香体验了!
相关文章:
弃用RestTemplate,RestClient真香!
在Spring框架的发展历程中,RestTemplate作为发起HTTP请求的同步API,曾经扮演着举足轻重的角色。然而,随着技术的不断进步和微服务架构的普及,RestTemplate的局限性逐渐显现,尤其是在处理高并发和异步请求时。因此&…...
electron-vite_10electron-updater软件更新
网很多electron-updater更新文章,这里只简单写一下演示代码; 为什么选择 electron-updater插件可以自动更新应用程序,同时支持多个平台;比官方要强; 官方的autoUpdater仅支持macOS 和 Windows 自动更新; 注意是自动,直接更新那种; 脚手架中是…...
React native之全局变量存储AsyncStorage
AsyncStorage是React native中对变量,对象进行全局存储,读取的异步使用对象。以key值进行存储。但是只能存储字符串数据,想存储对象,可把对象JSON进行序列化存储,读取的时候再转成JSON对象。 AsyncStorage.getItem()-…...

获取vue实例
需要注意的是,无论通过哪种方式获取元素,如果元素为 vue 组件,则需要在子组件中使用 defineExpose 进行暴露。 在父组件中,我们静态绑定 childRef: 在子组件中,我们需要通过defineExpose函数,手…...
基于Python实现电影推荐系统
电影推荐系统 标签:Tensorflow、矩阵分解、Surprise、PySpark 1、用Tensorflow实现矩阵分解 1.1、定义one_batch模块 import numpy as np import pandas as pddef read_and_process(filename, sep ::):col_names [user, item, rate, timestamp]df pd.read_cs…...

【linux】进程理解
🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.进程的基本概念进程的组成部分进程的特性进程的状态 02.PCBPCB的组成部分task_structtask_struct 的主要组成部分 03.进程属性查看进程 04.通过系统调用创建进程-fork初识工作…...
文件IO练习1
题目一: 1、使用fread和fwrite完成两个文件的拷贝,要求源文件和目标文件由外界输入 实现代码: #define LEN_BUF 256int main(int argc, const char *argv[]) {if(argc ! 3){fprintf(stderr,"程序入参输入有误\n");return -1;}FILE…...
c++ std::future 和 std::promise 的实现工作原理简介
为了便于理解 std::future 和 std::promise 的实现工作原理,我们可以创建一个简化的版本。这包括共享状态、Promise 设置值、Future 获取值的核心机制。我们的示例代码将实现 SimplePromise 和 SimpleFuture 两个类,二者通过一个共享状态实现线程间的通信…...

MATLAB(Octave)混电动力能耗评估
🎯要点 处理电动和混动汽车能耗的后向和前向算法模型(simulink),以及图形函数、后处理函数等实现。构建储能元数据信息:电池标称特性、电池标识符等以及静止、恒定电流和恒定电压等特征阶段。使用电流脉冲或要识别的等效电路模型类型配置阻抗…...

opencv学习:人脸识别器特征提取BPHFaceRecognizer_create算法的使用
BPHFaceRecognizer_create算法 在OpenCV中,cv2.face.LBPHFaceRecognizer_create()函数用于创建一个局部二值模式直方图(Local Binary Patterns Histograms,简称LBPH)人脸识别器。LBPH是一种用于人脸识别的特征提取方法࿰…...

HTML+CSS总结【量大管饱】
文章目录 前言HTML总结语义化标签常用标签H5新的语义元素H5的媒体标签\<embed> 元素(少用)\<object>元素(少用)\<audio>\<video> 元素包含关系iframe元素嵌入flash内容常用表单inputselect CSS总结权重样…...
Android开发之Broadcast Receive(广播机制)其实开发如此简单
什么是BroadcastReceiver BroadcastReceiver(广播接收器)用于响应来自其他应用程序或者系统的广播消息。这些消息有时被称为事件或者意图。本质上来讲BroadcastReceiver是一个全局的监听器,隶属于Android四大组件之一。 使用场景 1、 不同…...

Chromium 中chrome.cookies扩展接口c++实现分析
chrome.cookies 使用 chrome.cookies API 查询和修改 Cookie,并在 Cookie 发生更改时收到通知。 更多参考官网定义:chrome.cookies | API | Chrome for Developers (google.cn) 本文以加载一个清理cookies功能扩展为例 https://github.com/Google…...

excel筛选多个单元格内容
通常情况下,excel单元格筛选时,只筛选一个条件,如果要筛选多个条件,可以如下操作: 字符串中间用空格分隔就行。...
Instant 和 Duration 类(进行时间处理)
Instant Instant 类是 Java 8 中引入的,用于表示一个具体的时间点,它基于 UTC(协调世界时)时区。以下是 Instant 类的一些常用方法及其简要说明: now():获取当前的 Instant 对象,表示当前时间…...

Java每日面试题(Spring)(day19)
目录 Spring的优点什么是Spring AOP?AOP有哪些实现方式?JDK动态代理和CGLIB动态代理的区别?Spring AOP相关术语Spring通知有哪些类型?什么是Spring IOC?Spring中Bean的作用域有哪些?Spring中的Bean什么时候…...

【多线程】线程池(上)
文章目录 线程池基本概念线程池的优点线程池的特点 创建线程池自定义线程池线程池的工作原理线程池源码分析内置线程池newFixedThreadPoolSingleThreadExecutornewCachedThreadPoolScheduledThreadPool 线程池的核心线程是否会被回收?拒绝策略ThreadPoolExecutor.AbortPolicyT…...
ansible 语句+jinjia2+roles
文章目录 1、when语句1、判断表达式1、比较运算符2、逻辑运算符3、根据rc的返回值判断task任务是否执行成功5、通过条件判断路径是否存在6、in 2、when和其他关键字1、block关键字2、rescue关键字3、always关键字 3、ansible循环语句1、基于列表循环(whith_items)2、基于字典循…...
【Docker项目实战】使用Docker部署HumHub社交网络平台
【Docker项目实战】使用Docker部署HumHub社交网络平台 一、HumHub介绍1.1 HumHub简介1.2 HumHub特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载HumHub镜…...

“医者仁术”再进化,AI让乳腺癌筛查迎难而上
世卫组织最新数据显示,我国肿瘤疾病仍然呈上升趋势,肿瘤防控形势依然比较严峻。尤其是像乳腺癌等发病率较高的疾病,早诊断和早治疗意义重大,能够有效降低病死率。 另一方面,中国地域广阔且发展不平衡,各地…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...