标签:Retryer Feign 异常 Spring 重试 源码 com
配置
默认是重试策略为Retryer.NEVER_RETRY
方式一
@Configuration
@EnableFeignClients("com.laker.zuul.feign")
public class FeignConfig {
@Configuration
public class FooConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
@Bean
public Retryer feignRetryer() {
//最大请求次数为5,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为1s,
return new Retryer.Default();
}
}
方式二
feign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
源码分析
Feign自带的重试机制
首先,在Spring Cloud OpenFeign中,入口为FeignClient
,源码如下:
FeignClient
所有属性性中,只有configuration
看着跟重试有点关系,再看到javadoc
提示的@see FeignClientsConfiguration for the defaults
,该配置为Feign
的默认配置,源码如下:
FeignClientsConfiguration
终于见到Retryer
本尊,可以看到,当容器中缺少实现Retryer
接口的Bean
时则自动生成实例并注入(@ConditionalOnMissingBean
的功劳),这里注入的是Retryer.NEVER_RETRY
,一个不进行重试的Retryer
实现类。实现为:
Retryer
Retryer
有2个方法,重点放在continueOrPropagate(RetryableException e)
上,从方法签名上看,要么等待下一次重试,要么将异常Propagate(传播)出去,通俗点就是抛异常。
大家应该都知道,Feign
底层使用的是动态代理,才能实现如此简单易用的使用体验。这里主要讲一个类:SynchronousMethodHandler
,该类动态代理的主要类,所以它的属性跟Feign
的参数很相似,主要源码如下:
SynchronousMethodHandler and Feign
在invoke(Object[] argv)
方法中,当捕获RetryableException
异常时,会调用Retryer
的continueOrPropagate
方法,根据执行结果,该重试的重试,该抛异常的抛异常。
而根据NERVER_RETRY
的源码,就是直接抛异常,不进行重试。
参考:
- https://www.jianshu.com/p/c863556f8de1
标签:Retryer,Feign,异常,Spring,重试,源码,com 来源: https://blog.csdn.net/abu935009066/article/details/117566511
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。