计算机系统应用教程网站

网站首页 > 技术文章 正文

Feign和RestTemplate服务请求重试方案

btikc 2024-09-10 12:03:21 技术文章 12 ℃ 0 评论

一、针对Feign重试

Feign自带Retry,默认是关闭状态。

首先定义FeignRetryConfig类

public class FeignRetryConfig {

    /**
     * 自定义重试机制
     *
     * @return
     */
    @Bean
    public Retryer feignRetry() {
        // 参数分别代表:初始间隔时间为多少ms、重试最大间隔时间为多少ms、最大重试次数  注:下次间隔时间1.5倍递增,下一次间隔时间计算公式:period * Math.pow(1.5, attempt - 1)
        return new Retryer.Default(100L, TimeUnit.SECONDS.toMillis(1L), 5);
    }
}

实现Feign重试机制有两种方式:

1.全局方案

在自定义类FeignRetryConfig上加注解@Configuration

2.局部方案

@FeignClient注解增加 configuration = FeignRetryConfig.class

@FeignClient(name ="",url = "",configuration = FeignRetryConfig.class

建议选用局部方案,因为全局方案如果配置不当,会因为幂等请求带来数据问题。所以建议尽可能是需要做重试的地方单独控制。

二、针对RestTemplate重试

1.引入JAR

 <dependency>
      <groupId>org.springframework.retry</groupId>
      <artifactId>spring-retry</artifactId>
 </dependency>

2.在Spring Boot 应用入口启动类,也就是配置类的上面加上@EnableRetry注解,表示让重试机制生效

3.将注解放在方法上@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 100, multiplier = 1.5))

采坑:

1.重试机制无效

方法内部调用, Retryable方法只有直接通过代理对象调用时才会生效,通过其他方法间接调用不生效(所有基于AOP的注解都一样)

使用@Retryable不能使用try catch捕获异常

一、基于JDK动态代理时,只代理接口中的方法,所以需要注意以下事项

@Retryable或者@Recover修饰的方法一定要在接口中声明

@Retryable可以修饰在接口的方法声明上,也可以修饰在方法实现上

二、基于CGLIB动态代理时,可以代理目标类所有可继承方法

@Retryable或者@Recover修饰的方法必须可以被继承(不能用final,private修饰) @Retryable与@Recover直接修饰在方法实现上


参考:

http://www.itclj.com/blog/59940a4081c06e672f942ae1

https://github.com/spring-projects/spring-retry

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表