以下配置基于spring boot版本1.4.5.RELEASE,spring cloud版本采用Camden.SR6。
参照ribbon工程下面配置请求重试的思路,在feign工程的application.xml文件中,我们同样加上如下配置:
# 重试机制
spring.cloud.loadbalancer.retry.enabled = true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 10000
compute-service.ribbon.ConnectTimeout = 250
compute-service.ribbon.ReadTimeout = 1000
# 对所有操作请求都进行重试
compute-service.ribbon.OkToRetryOnAllOperations = true
# 切换实例的重试次数
compute-service.ribbon.MaxAutoRetriesNextServer = 2
# 对当前实例的重试次数
compute-service.ribbon.MaxAutoRetries = 1
然后经过本地测试,发现重试机制已经生效。
为何不用像ribbon工程那样,在pom文件引入spring-retry的依赖?
同样,观察FeignRibbonClientAutoConfiguration类的源码,我们看到有这样两个方法:
@Bean
@Primary
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
public CachingSpringLoadBalancerFactory cachingLBClientFactory(
SpringClientFactory factory) {
return new CachingSpringLoadBalancerFactory(factory);
}
@Bean
@Primary
@ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")
public CachingSpringLoadBalancerFactory retryabeCachingLBClientFactory(
SpringClientFactory factory, LoadBalancedRetryPolicyFactory retryPolicyFactory) {
return new CachingSpringLoadBalancerFactory(factory, retryPolicyFactory, true);
}
可见,在不存在RetryTemplate的依赖的情况下,返回了CachingSpringLoadBalancerFactory对象。
跟踪CachingSpringLoadBalancerFactory类的源码,看到如下构造函数:
public CachingSpringLoadBalancerFactory(SpringClientFactory factory) {
this.factory = factory;
this.loadBalancedRetryPolicyFactory = new RibbonLoadBalancedRetryPolicyFactory(factory);
}
可以看到,在构造函数里,获得了有效的ribbon负载均衡重试策略工厂。
另外,如果在pom文件引入spring-retry的依赖、即存在RetryTemplate的依赖的情况下,最终仍能获得一个有效的ribbon负载均衡重试策略工厂。