为Spring Cloud Feign配置请求重试

以下配置基于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负载均衡重试策略工厂。

你可能感兴趣的:(为Spring Cloud Feign配置请求重试)