一、针对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
本文暂时没有评论,来添加一个吧(●'◡'●)