Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试
在微服务架构中,服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中,服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此,实现服务调用的重试机制显得尤为重要。Resilience4j是一个功能强大的库,它提供了多种容错机制,包括重试(Retry)、熔断(CircuitBreaker)、限流(RateLimiter)等。本篇文章将详细介绍如何在Spring Cloud中使用Resilience4j Retry对OpenFeign进行重试。
一、Resilience4j Retry原理
Resilience4j的Retry模块允许在调用失败时进行自动重试。它支持以下几种特性:
- 自定义重试次数:可以配置最大重试次数。
- 自定义等待时间:可以配置每次重试之间的等待时间。
- 重试条件:可以配置哪些异常类型触发重试。
Resilience4j Retry的工作流程如下:
- 方法调用:对目标方法进行调用。
- 异常捕获:如果目标方法抛出配置的异常,则捕获该异常。
- 重试判断:判断是否满足重试条件以及重试次数是否已达到上限。
- 重试等待:如果满足重试条件且重试次数未达到上限,则等待配置的时间后再次尝试调用。
- 降级处理:如果重试次数达到上限,依然无法成功调用,则执行降级处理逻辑。
二、项目准备
首先,确保你的Spring Cloud项目中已经引入了必要的依赖,包括Spring Cloud OpenFeign和Resilience4j。
1. 引入依赖
在pom.xml中添加以下依赖:
<!--resilience4j-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<!-- 由于resilience4j需要AOP的包,所以必须导入AOP包 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启用Feign Clients
确保你的Spring Boot应用程序主类上或者配置类上有@EnableFeignClients注解:
@Configuration
@EnableFeignClients(basePackages = "com.springcloud.sample.service")
@Import(FeignClientsConfiguration.class)
public class FeignConfiguration {/*** Set the Feign specific log level to log client REST requests.*/@Beanfeign.Logger.Level feignLoggerLevel() {return feign.Logger.Level.BASIC;}
}
三、配置Resilience4j Retry
在你的application.yml或application.properties文件中配置Resilience4j的Retry策略。例如:
resilience4j.retry:configs:default:maxRetryAttempts: 3waitDuration: 2sretryExceptions:- org.springframework.web.client.HttpServerErrorException- java.io.IOException- feign.FeignException
解释:
maxRetryAttempts: 最大重试次数,这里设置为3次。waitDuration: 每次重试之间的等待时间,这里设置为2秒。retryExceptions: 配置哪些异常类型触发重试,这里包括HttpServerErrorException、IOException和FeignException。
四、创建Feign客户端接口
创建一个Feign客户端接口来定义服务间的调用。例如:
@FeignClient("pay-service")
public interface PayService {@GetMapping("/pay/{id}")String payOrder(@PathVariable("id") Integer id);}
五、使用Retry注解
在调用Feign客户端的方法上添加@Retry注解,并创建一个fallback方法,用于定义服务调用失败后的降级处理逻辑。例如:
@RestController
public class OrderController {private static final Logger log = LoggerFactory.getLogger(OrderController.class);@Autowiredprivate PayService payService;@GetMapping("/order/{id}")@Retry(name = "paymentService", fallbackMethod = "fallback")public String order(@PathVariable("id") Integer id){log.info("Request Pay For Order id: {}", id);//通过open feign远程调用支付服务return payService.payOrder(id);}//fallback就是服务降级后的兜底处理方法public String fallback(Integer id,Throwable t) {log.info("Pay Service invoke failed for order ID: {}", id);log.error("Error: {}", t.getMessage());return "Pay Service Was Busy Now. Please try again later!";}
}
通过上述步骤,当payOrder方法调用失败时,Resilience4j的Retry机制将自动进行重试。如果重试次数超过配置的最大重试次数,Fallback类中的降级逻辑将会被执行。
六、测试
我我们通过关闭目标服务(pay-service)来测试重试机制是否正常工作。在目标服务不可用的情况下,请求/order/1接口,应该会看到系统进行多次重试,然后返回降级信息。
1. 在浏览器中访问order接口
http://localhost:8082/order/1

在访问以上地址后,浏览器并没有立刻返回结果,应该正在进行重试。因为我们已经关闭了目标服务,在等待几秒之后,浏览器返回了降级后的结果。如下:

2. 在控制台中验证是否重试过

从上面的log中我们可以看出,一共请求了3次,和我们配置的maxRetryAttempts:3 一致,每次请求间隔2s,是我们在配置文件中指定的。并且,在最后一次重试任然失败后,走到了降级的方法 fallback中去,返回默认的降级结果。和我们预期的一样,retry能够正常工作。并且在retryExceptions中我们可以选择下游返回哪些异常时进行重试,我们在进行业务逻辑处理时可以灵活应用。
七、总结
通过上述配置和代码示例,我们在Spring Cloud项目中成功集成了Resilience4j的Retry机制,为OpenFeign的服务调用提供了自动重试功能。Resilience4j提供的灵活配置使得我们可以根据实际需求,精细控制重试策略,从而提高系统的可靠性和稳定性。
希望这篇文章能帮助你更好地理解和使用Resilience4j Retry对OpenFeign进行重试。如果你有任何问题或建议,欢迎在评论区留言交流。
相关文章:
Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试
在微服务架构中,服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中,服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此,实现服务调用的重试机制显得尤为重要。Resilience4…...
【Redis 进阶】事务
Redis 的事务和 MySQL 的事务概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性:把多个操作打包成一个整体。(要么全都做,要么都不做&am…...
Linux的防火墙
一、防火墙概述 防火墙是一种计算机硬件和软件的结合,使internet和intranet之间建立一个安全网关(Security Gateway),从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…...
跟张良均老师学大数据人工智能-批量集训营开班中
随着我国大数据和人工智能产业的飞速发展,未来社会对高素质科技人才的需求日益旺盛。为助力广大青少年提前掌握前沿技术,实现自我价值,泰迪智能科技多名优秀老师联合打造暑期大数据人工智能集训营,旨在培养具备创新精神和实战能力…...
2024年音频剪辑必备:五大最佳音频编辑软件精选!
在数字时代,音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期,一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接:https://www.foxitsoftware.cn/audio-clip/ 福昕音频…...
Native Programs(本机程序)
Native Programs System Program(系统程序)Config ProgramStake ProgramVote ProgramAddress Lookup Table ProgramBPF LoaderEd25519 ProgramSecp256k1 Program Solana contains a small handful of native programs that are part of the validator im…...
RisingWave 1.10 发布!新增用户自定义聚合函数
我们非常高兴地宣布:RisingWave 1.10 版本正式发布!新版本为大家带来了许多重要更新,例如:新增用户自定义聚合函数 (UDAF)、支持从游标获取多个更新、支持可溢出哈希 Join、增强 CDC 连接器、新增 Sink 连接器等。一起来了解本次更…...
Modbus通讯协议
Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议,它允许不同类型的设备之间进行通信,以便进行数据交换和控制。Modbus协议最初为可编程逻辑控制器(PLC)通信开发,现已广泛应用于工业自动化领…...
fal.ai发布超分辨率模型——AuraSR V2
今天,我们发布了单步 GAN 升频器的第二个版本: AuraSR。 我们在上个月发布了 AuraSR v1,社区的反响让我们深受鼓舞,因此我们立即开始了新版本的训练。 AuraSR 基于 Adobe Gigagan 论文,以 lucidrain 的实现为起点。Gi…...
SYD88xx代码复位不成功和解决办法
原来的复位代码如下: void ota_manage(void){#ifdef _OTA_if(ota_state){switch(ota_state){case 1 : #if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("start FwErase\r\n");#endifCmdFwErase();#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)db…...
加油,为Vue3提供一个可媲美Angular的ioc容器
为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统,以及便利的功能特性,完全胜任大型业务系统的开发。但是,我们不仅要能做到,而且要做得更好。大型业务系统的关键就是解耦合,从而减缓shi山代码的生长。而ioc容器是…...
RS485 CAN SPI IIC UART RS232这些通信协议传输距离、传输速度对比给出比较顺序-笔记(面试必备)
各类通信协议(RS485、CAN、SPI、I2C、UART、RS232)的传输距离和传输速度各有不同,适用于不同的应用场景。以下是这些通信协议的传输距离和传输速度的对比及排序: 传输距离比较(从长到短) RS485 最大传输距…...
高频JMeter软件测试面试题
近期,有很多粉丝在催更关于Jmeter的面试题,索性抽空整理了一波,以下是一些高频JMeter面试题,拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样,它收集来自目标服务器的响应以及其他统计…...
iptables netfilter
iptables -L --line...
如何使用Python自动发送邮件?
Python 提供了强大的内置库 smtplib 和 email,让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件,从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。 1. 准备工作: 1.1 安装必要的库 确保…...
C#中读写INI配置文件
在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config,Asp.Net的配置文件Web.Config࿰…...
深入解析Spring中的@RequestMapping注解
RequestMapping是Spring框架中的一个核心注解,用于映射Web请求到处理器类的方法上。本文将详细介绍RequestMapping注解的用途、支持的属性以及如何在Spring MVC和Spring WebFlux中应用它。 1. 引言 在Spring框架中,RequestMapping是一个用于简化请求映…...
Python:lambda函数
lambda函数解释 Lambda函数,也被称为匿名函数,是Python等编程语言中用于创建简单、一次性使用的函数对象的一种快捷方式。在Python中,lambda函数使用lambda关键字定义,其后紧跟一个或多个参数(用逗号分隔)…...
MySQL查询语句
1. 一般查询 select * from table; 创建表:并插入数据,为下面的查询做例 create table info ( id int primary key, name varchar(10), score decimal(5,2), address varchar(20), hobbid int(5));insert into info values(1,liuyi,80,bei…...
远程连接服务
1.SSH协议握手流程 TCP三次握手后当前主机与远程服务器之间协商用哪种协议版本,ssh有两个(ssh1/ssh2)一般用ssh2,协商完后进入到密钥交换的阶段,客户端会生成一个公钥和一个私钥,公钥用来上锁,私…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
