SpringBoot中如何优雅地使用重试

1 缘起

项目中使用了第三方的服务,

第三方服务偶尔会出现不稳定、连接不上的情况,

于是,在调用时为了保证服务的相对高可用,添加了超时连接重试,

当连接第三方服务超时时,多重试几次,比如3次,三次后仍连接不上,抛出异常,

在实际的测试过程中,重试一次即可连接到第三方服务,

提高了服务的可用性。

2 spring-retry

Spring提供了重试项目:spring-retry,用于处理项目中需要重试的方法,

spring-retry中提供了自定义参数,如重试次数、指定重试情况、重试延迟时间等,

满足不同的重试场景。

2.1 小插曲:试错过程

搜索SpringBoot如何使用重试注解时,发现需要使用spring-retry这个项目,在Maven仓库搜索了一下spring-retry,发现有多个版本,如下图,选择了最新版本2.0.4,启动项目时发现,无法运行。

环境:
Java8
SpringBoot2.4.5

xml 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>2.0.4</version>
</dependency>

异常信息如下,版本不一致,进入spring-retry项目,查看项目配置。

java: 无法访问org.springframework.retry.annotation.Backoff

错误的类文件: /D:/install/maven/apache-maven-3.8.8/my-repository/org/springframework/retry/spring-retry/2.0.4/spring-retry-2.0.4.jar!/org/springframework/retry/annotation/Backoff.class

类文件具有错误的版本 61.0, 应为 52.0

请删除该文件或确保该文件位于正确的类路径子目录中。

查看spring-retry项目的配置文件,发现java版本为17,所以,使用java8无法启动项目,

因此,需要选择spring-retry对应Java8的版本。

2.2 正确过程

2.2.1 配置依赖

不指定spring-retry版本,Maven会自动下载合适的版本,本次自动下载的版本为1.3.1。

xml 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

2.2.2 重试注解@Retryable

为方法添加@Retryable注解,即可在方法遇到异常时,重试指定次数。

常用参数如下,如有其他开发需求,可继续查看源码中的其他参数。

序号 参数 描述
1 value 触发重试的异常情况
2 maxAttempts 最大重试次数,默认重试3次
3 backoff 补偿机制,delay重试延迟时间,单位:毫秒;multiplier延迟时间比例,延迟的具体时间为delay*multiplier(multiplier>0时生效,默认multiplier为0),当multiplier为0时,延迟时间即为delay

2.2.3 添加启动注解@EnableRetry

启动类中添加开启重试注解:@EnableRetry

配置样例如下:

启动重试@EnableRetry后,Spring会全局启动重试注解@Retryable,在执行重试方法时,通过CGLIB代理方法,根据注解的元数据进行重试,EnableRetry源码如下:

org.springframework.retry.annotation.EnableRetry

2.2.4 测试重试

重试结果:

重试参数:5次,延迟:2秒,比例:2

重试间隔:

第二次:第一次~第二次:2秒

第三次:第二次~第三次:22=4秒
第四次:第三次~第四次:4
2=8秒

第五次:第四次~第五次:8*2=16秒

3 小结

(1)Spring提供重试项目:spring-retry,支持自定义参数,如重试次数、指定重试情况、重试延迟时间等,满足不同的重试场景;

(2)spring-retry生效有两处配置:启动配置@EnableRetry,重试配置:@Retryable;

(3)延迟时间:第n次~第n+1次 第n次delay*multiplier,上一次的dealy与比例的乘积;

(4)使用spring-retry时需要注意与Java版本的匹配,不同的Java版本使用不同的spring-retry版本,以及不同的重试参数。

相关推荐
风象南3 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
cg501720 小时前
Spring Boot 的配置文件
java·linux·spring boot
橘猫云计算机设计1 天前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
有一只柴犬1 天前
深入Spring AI:6大核心概念带你入门AI开发
spring boot·后端
向阳2561 天前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj1 天前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南1 天前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
CryptoPP1 天前
springboot 对接马来西亚数据源API等多个国家的数据源
spring boot·后端·python·金融·区块链
清风絮柳1 天前
52.个人健康管理系统小程序(基于springboot&vue)
vue.js·spring boot·毕业设计·前后端分离·健康管理系统·个人健康管理系统·个人健康管理小程序
forestsea1 天前
使用 Spring Boot 和 GraalVM 的原生镜像
java·spring boot·spring native·原生映像