spring ribbon 重试原理及配置
# ribbon重试
# 1、依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
# 2、自动配置
# 2.1 LoadBalancerAutoConfiguration
位置:spring-cloud-common
引入:RetryLoadBalancerInterceptor
注意:本自动配置类,创建 、LoadBalancerInterceptorRetryLoadBalancerInterceptor 拦截器
# 2.2 RibbonAutoConfiguration
位置:spring-cloud-nextflix-ribbon
引入:RibbonLoadBalancedRetryFactory
# 3、RibbonLoadBalancedRetryPolicy解析
说明:由RibbonLoadBalancedRetryFactory创建,每一个请求创建一个该对象
- 记录当前执行
sameServer、nextServer次数(初始值为0) - 判断是否能
retrySameServer、retryNextServer(默认仅仅GET方法能重试)

# 4、ClientHttpRequestFactory解析
说明:本工厂类为 RestTemplate http客户端工厂类,默认实现 SimpleClientHttpRequestFactory ,HTTP客户端组件使用 JDK URLConnection
| ClientHttpRequestFactory | 创建请求对象 |
|---|---|
| SimpleClientHttpRequestFactory(默认) | HttpURLConnection(JDK) |
| HttpComponentsClientHttpRequestFactory | HttpClient(apache httpclient) |
| OkHttp3ClientHttpRequestFactory | OkHttpClient(okhttp) |
| RibbonClientHttpRequestFactory | RestClient(ribbon-httpclient) |
- RestTemplate 默认实现
SimpleClientHttpRequestFactory,需要配置connectTimeout、readTimeout - 想使用
HttpComponentsClientHttpRequestFactory、OkHttp3ClientHttpRequestFactory需自己创建,可以模拟RibbonClientHttpRequestFactory实现 - 想使用
RibbonClientHttpRequestFactory,需配置ribbon.restclient.enabled = true
// SimpleClientHttpRequestFactory 集成原理
@Configuration
public class RibbonConfiguration {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
clientHttpRequestFactory.setReadTimeout(1000);
clientHttpRequestFactory.setConnectTimeout(1000);
restTemplate.setRequestFactory(clientHttpRequestFactory);
return restTemplate;
}
}
注意:默认配置需要设置超时时间才能触发重试机制
# 5、RetryLoadBalancerInterceptor解析
说明:创建 RetryTemplate ,将 http 调用封装为 RetryCallback<T, E> 对象,在 RetryTemplate 中捕获执行异常,根据异常执行重试。触发重试机制有:异常;返回响应码
ribbon.MaxAutoRetries = 0 # sameServer重试最大次数
ribbon.MaxAutoRetriesNextServer = 1 # nextServer重试最大次数
ribbon.OkToRetryOnAllOperations = false # 是否所有http方法都能重试,默认GET
ribbon.retryableStatusCodes = # 哪些HttpStatusCode能重试,使用逗号分隔,"404,405"

注意:调用次数为 (MaxAutoRetries + 1) * (MaxAutoRetriesNextServer + 1)