spring ribbon 重试原理及配置
# ribbon重试
# 1、依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
# 2、自动配置
# 2.1 LoadBalancerAutoConfiguration
位置:spring-cloud-common
引入:RetryLoadBalancerInterceptor
注意:本自动配置类,创建 、LoadBalancerInterceptor
RetryLoadBalancerInterceptor
拦截器
# 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)