API请求重试的8种方法,你用哪种?( 二 )

代码里,我们使用retryTemplate.execute()方法来执行需要重试的代码块 。在RetryCallback的doWithRetry()方法中,可以编写需要重试的逻辑 。如果方法执行失败,RetryTemplate会根据配置的重试策略和重试间隔策略进行重试 。
Spring Retry是一个提供重试机制的库,可以方便地在Spring项目中使用 。使用@Retryable注解标记需要重试的方法,如果方法抛出异常则会自动重试 。
@Retryable(value = https://www.isolves.com/it/cxkf/bk/2023-11-10/Exception.class, maxAttempts = 3)public void request(){// 请求接口的代码}Spring Retry提供了多种重试策略和重试间隔策略 , 我们可以根据具体的业务需求选择合适的策略:

  • 重试策略:
    • SimpleRetryPolicy:指定最大重试次数 。
    • TimeoutRetryPolicy:指定最大重试时间 。
    • AlwaysRetryPolicy:无条件进行重试 。
  • 重试间隔策略:
    • FixedBackOffPolicy:固定间隔重试 。
    • ExponentialBackOffPolicy:指数递增间隔重试 。
    • UniformRandomBackOffPolicy:随机间隔重试 。
通过配置不同的重试策略和重试间隔策略,可以灵活地控制重试行为 。Spring Retry还提供了自定义重试策略和重试间隔策略,可以通过实现RetryPolicy 接口和BackOffPolicy 接口,分别实现自定义的重试策略和重试间隔策略 。
使用注解调用除了显式使用RetryTemplate调用,Spring Retry还提供了注解方式来触发重试 。
  1. 配置重试切面:
@Configuration@EnableRetrypublic class RetryConfig {// 配置其他的Bean}代码里,我们使用@Configuration注解将类标记为配置类,使用@EnableRetry注解启用重试功能 。
  1. 使用@Retryable注解标记需要重试的方法:
@Retryable(maxAttempts = 3)public void request() {// 请求接口的代码}我们使用@Retryable注解标记了request()方法,指定了最大重试次数为3次 。
  1. 调用被标记的方法:
@Autowiredprivate HttpService httpService;httpService.request();在SpringBoot项目里使用更加地简单,使用@EnableRetry注解启用Spring Retry功能 , 并在需要进行重试的方法上添加@Retryable注解 。
示例代码:
@SpringBootApplication@EnableRetry // 启用Spring Retry功能public class MyApplication {public static void mAIn(String[] args) {SpringApplication.run(MyApplication.class, args);}}@Servicepublic class MyService {@Retryable(value = https://www.isolves.com/it/cxkf/bk/2023-11-10/{MyException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))public void doSomething() {// 需要进行重试的方法逻辑}}代码里,@EnableRetry注解启用了Spring Retry功能,@Retryable注解标记了需要进行重试的方法 , 并指定了重试的异常类型、最大重试次数和重试间隔 。
其中,@Backoff注解用于指定重试间隔策略,delay属性表示每次重试之间的间隔时间 。在这个例子中,每次重试之间的间隔时间为1秒 。
需要注意的是,@Retryable注解只能标记在public方法上 。如果需要在非public方法上使用重试功能 , 可以使用代理模式实现 。
另外,如果需要在重试过程中进行一些特定的操作,比如记录日志、发送消息等,可以在重试方法中使用RetryContext参数,它提供了一些有用的方法来获取重试的上下文信息 。例如:
@Servicepublic class MyService {@Retryable(value = https://www.isolves.com/it/cxkf/bk/2023-11-10/{MyException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))public void doSomething(RetryContext context) {// 获取重试次数int retryCount = context.getRetryCount();// 获取上一次异常Throwable lastThrowable = context.getLastThrowable();// 记录日志、发送消息等操作// ...// 需要进行重试的方法逻辑}}5.使用Resilience4j库Resilience4j是一个轻量级的,易于使用的容错库,提供了重试、熔断、限流等多种机制 。
<dependency><groupId>io.Github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.7.0</version></dependency>我们来看下Resilience4j的使用,Resilience4j也支持代码显式调用和注解配置调用 。
通过代码显式调用
  1. 创建创建一个RetryRegistry对象:首先,需要创建一个RetryRegistry对象,用于管理Retry实例 。可以使用RetryRegistry.ofDefaults()方法创建一个默认的RetryRegistry对象 。


    推荐阅读