今天测了一下Ribbon的重试跟超时机制,发现进行的全局超时配置一直不生效,配置如下:
ribbon:
#单位ms,请求连接的超时时间,默认1000
ConnectTimeout: 500
#单位ms,读取数据的超时时间,默认1000
ReadTimeout: 3000
#对所有操作请求都进行重试
#设置为true时,会对所有的请求进行重试,若为false只会对get请求进行重试
#如果是put或post等写操作,
#如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
#默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
#非GET方式请求,只有连接异常时,才会进行重试
OkToRetryOnAllOperations: true
#切换实例的重试次数,默认为1
MaxAutoRetriesNextServer: 1
#如果不配置ribbon的重试次数
#对当前实例的重试次数,默认为0
MaxAutoRetries: 2
#为true的时候会关闭懒加载
#Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,
#而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间
#这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,第一次请求很容易超时
eager-load:
enabled: true
#指定需要关闭懒加载的服务名
clients: eureka-client
测了一天后,解决方案如下:
- 解决全局配置不生效的问题
@Bean
@LoadBalanced
public RestTemplate ribbonRestTemplate() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(2000);
factory.setConnectTimeout(2000);
return new RestTemplate(factory);
}
因为Ribbon层走的一定是RestTemplate,所以我们可以直接配置这个RestTemplate的配置
- 解决重试不生效的问题:
pom中需要新增依赖:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
启动类新增注解:@EnableRetry
关于重试为什么不生效我一直没找到原因,希望有懂的大佬能不吝赐教!!!!
我的版本:
Spring Boot版本:2.1.4.RELEASE
Spring Cloud版本:Greenwich.SR1