ribbon重试

2022/8/8 ribbonspringjava

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创建,每一个请求创建一个该对象

  • 记录当前执行 sameServernextServer 次数(初始值为 0
  • 判断是否能 retrySameServerretryNextServer (默认仅仅 GET 方法能重试)

registerThrowable

# 4、ClientHttpRequestFactory解析

说明:本工厂类为 RestTemplate http客户端工厂类,默认实现 SimpleClientHttpRequestFactory ,HTTP客户端组件使用 JDK URLConnection

ClientHttpRequestFactory 创建请求对象
SimpleClientHttpRequestFactory(默认) HttpURLConnection(JDK)
HttpComponentsClientHttpRequestFactory HttpClient(apache httpclient)
Netty4ClientHttpRequestFactory NioEventLoopGroup(netty)
OkHttp3ClientHttpRequestFactory OkHttpClient(okhttp)
RibbonClientHttpRequestFactory RestClient(ribbon-httpclient)
  • RestTemplate 默认实现 SimpleClientHttpRequestFactory ,需要配置 connectTimeoutreadTimeout
  • 想使用 HttpComponentsClientHttpRequestFactoryOkHttp3ClientHttpRequestFactory 需自己创建,可以模拟 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"

RetryTemplate

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