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

Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试

在微服务架构中,服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中,服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此,实现服务调用的重试机制显得尤为重要。Resilience4j是一个功能强大的库,它提供了多种容错机制,包括重试(Retry)、熔断(CircuitBreaker)、限流(RateLimiter)等。本篇文章将详细介绍如何在Spring Cloud中使用Resilience4j Retry对OpenFeign进行重试。

一、Resilience4j Retry原理 

Resilience4j的Retry模块允许在调用失败时进行自动重试。它支持以下几种特性:

  • 自定义重试次数:可以配置最大重试次数。
  • 自定义等待时间:可以配置每次重试之间的等待时间。
  • 重试条件:可以配置哪些异常类型触发重试。

Resilience4j Retry的工作流程如下:

  1. 方法调用:对目标方法进行调用。
  2. 异常捕获:如果目标方法抛出配置的异常,则捕获该异常。
  3. 重试判断:判断是否满足重试条件以及重试次数是否已达到上限。
  4. 重试等待:如果满足重试条件且重试次数未达到上限,则等待配置的时间后再次尝试调用。
  5. 降级处理:如果重试次数达到上限,依然无法成功调用,则执行降级处理逻辑。

 二、项目准备

首先,确保你的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.ymlapplication.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: 配置哪些异常类型触发重试,这里包括HttpServerErrorExceptionIOException和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进行重试

在微服务架构中&#xff0c;服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此&#xff0c;实现服务调用的重试机制显得尤为重要。Resilience4…...

【Redis 进阶】事务

Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性&#xff1a;把多个操作打包成一个整体。&#xff08;要么全都做&#xff0c;要么都不做&am…...

Linux的防火墙

一、防火墙概述 防火墙是一种计算机硬件和软件的结合&#xff0c;使internet和intranet之间建立一个安全网关&#xff08;Security Gateway&#xff09;&#xff0c;从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…...

跟张良均老师学大数据人工智能-批量集训营开班中

随着我国大数据和人工智能产业的飞速发展&#xff0c;未来社会对高素质科技人才的需求日益旺盛。为助力广大青少年提前掌握前沿技术&#xff0c;实现自我价值&#xff0c;泰迪智能科技多名优秀老师联合打造暑期大数据人工智能集训营&#xff0c;旨在培养具备创新精神和实战能力…...

2024年音频剪辑必备:五大最佳音频编辑软件精选!

在数字时代&#xff0c;音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期&#xff0c;一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接&#xff1a;https://www.foxitsoftware.cn/audio-clip/ 福昕音频…...

Native Programs(本机程序)

Native Programs System Program&#xff08;系统程序&#xff09;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 发布!新增用户自定义聚合函数

我们非常高兴地宣布&#xff1a;RisingWave 1.10 版本正式发布&#xff01;新版本为大家带来了许多重要更新&#xff0c;例如&#xff1a;新增用户自定义聚合函数 (UDAF)、支持从游标获取多个更新、支持可溢出哈希 Join、增强 CDC 连接器、新增 Sink 连接器等。一起来了解本次更…...

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议&#xff0c;‌它允许不同类型的设备之间进行通信&#xff0c;‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器&#xff08;‌PLC&#xff09;‌通信开发&#xff0c;‌现已广泛应用于工业自动化领…...

fal.ai发布超分辨率模型——AuraSR V2

今天&#xff0c;我们发布了单步 GAN 升频器的第二个版本&#xff1a; AuraSR。 我们在上个月发布了 AuraSR v1&#xff0c;社区的反响让我们深受鼓舞&#xff0c;因此我们立即开始了新版本的训练。 AuraSR 基于 Adobe Gigagan 论文&#xff0c;以 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因其出色的响应式系统&#xff0c;以及便利的功能特性&#xff0c;完全胜任大型业务系统的开发。但是&#xff0c;我们不仅要能做到&#xff0c;而且要做得更好。大型业务系统的关键就是解耦合&#xff0c;从而减缓shi山代码的生长。而ioc容器是…...

RS485 CAN SPI IIC UART RS232这些通信协议传输距离、传输速度对比给出比较顺序-笔记(面试必备)

各类通信协议&#xff08;RS485、CAN、SPI、I2C、UART、RS232&#xff09;的传输距离和传输速度各有不同&#xff0c;适用于不同的应用场景。以下是这些通信协议的传输距离和传输速度的对比及排序&#xff1a; 传输距离比较&#xff08;从长到短&#xff09; RS485 最大传输距…...

高频JMeter软件测试面试题

近期&#xff0c;有很多粉丝在催更关于Jmeter的面试题&#xff0c;索性抽空整理了一波&#xff0c;以下是一些高频JMeter面试题&#xff0c;拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样&#xff0c;它收集来自目标服务器的响应以及其他统计…...

iptables netfilter

iptables -L --line...

如何使用Python自动发送邮件?

Python 提供了强大的内置库 smtplib 和 email&#xff0c;让我们能够轻松地发送各种类型的电子邮件。本指南将带你逐步了解如何使用 Python 发送邮件&#xff0c;从简单文本邮件到包含 HTML 内容、附件和内嵌图片的复杂邮件。 1. 准备工作&#xff1a; 1.1 安装必要的库 确保…...

C#中读写INI配置文件

在作应用系统开发时&#xff0c;管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起&#xff0c;现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config&#xff0c;Asp.Net的配置文件Web.Config&#xff0…...

深入解析Spring中的@RequestMapping注解

RequestMapping是Spring框架中的一个核心注解&#xff0c;用于映射Web请求到处理器类的方法上。本文将详细介绍RequestMapping注解的用途、支持的属性以及如何在Spring MVC和Spring WebFlux中应用它。 1. 引言 在Spring框架中&#xff0c;RequestMapping是一个用于简化请求映…...

Python:lambda函数

lambda函数解释 Lambda函数&#xff0c;也被称为匿名函数&#xff0c;是Python等编程语言中用于创建简单、一次性使用的函数对象的一种快捷方式。在Python中&#xff0c;lambda函数使用lambda关键字定义&#xff0c;其后紧跟一个或多个参数&#xff08;用逗号分隔&#xff09;…...

MySQL查询语句

1. 一般查询 select * from table&#xff1b; 创建表&#xff1a;并插入数据&#xff0c;为下面的查询做例 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三次握手后当前主机与远程服务器之间协商用哪种协议版本&#xff0c;ssh有两个&#xff08;ssh1/ssh2&#xff09;一般用ssh2&#xff0c;协商完后进入到密钥交换的阶段&#xff0c;客户端会生成一个公钥和一个私钥&#xff0c;公钥用来上锁&#xff0c;私…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...