ribbon:
MaxAutoRetriesNextServer: 3 #更换实例的次数
MaxAutoRetries: 2 #当前实例重试的次数,失败之后更换下个实例
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
//默认俩个变量都是-1,不会启动重试
f.setConnectTimeout(1000);
f.setReadTimeout(1000);
return new RestTemplate(f);
}
假设B服务调用A服务(A1:8080,A2:8088),在A服务接口Thread.sleep(5000) 也就是说 A服务接口永远超时,那么重试的情况是这样的
假设刚进来是A1,由于超时所以开始重试,因为MaxAutoRetries=2,所以此时对A1追加重试两次,重试情况: A1A1A1
由于一直超时所以切换到请求A2 (切换实例第一轮)
A2超时,然后还是因为MaxAutoRetries=2,所以继续对A2追加重试两次 重试情况:A1A1A1 A2A2A2
由于一直超时所以切换到请求A1 (切换实例第二轮)
A1超时,然后还是因为MaxAutoRetries=2,所以继续对A1追加重试两次 重试情况:A1A1A1 A2A2A2 A1A1A1
由于一直超时所以切换到请求A2 (切换实例第三轮)
A2超时,然后还是因为MaxAutoRetries=2,所以继续对A2追加重试两次 重试情况:A1A1A1 A2A2A2 A1A1A1 A2A2A2
所以最终会请求 (2 + 1) * (3 + 1 ) = 12 次,最终重试情况: A1A1A1 A2A2A2 A1A1A1 A2A2A2(不算第一次的调用)