背景
post 重试,如果项目中接口没有做幂等,就会产生脏数据!
ribbon:
ConnectTimeout: 2000 # 请求连接的超时时间: 1s
ReadTimeout: 2000 # 请求处理的超时时间: 1s
OkToRetryOnAllOperations: false # 是否对所有操作重试
MaxAutoRetriesNextServer: 0 # 同一服务不同实例的重试次数
MaxAutoRetries: 0 # 同一实例的重试次数
而上边的ribbon配置没有生效
原因
是因为没有开始spring框架的重置机制
解决
// 启动类添加
@EnableRetry //ribbon重试机制生效 1.pom文件增加spring-retry 2.增加EnableRetry注解
配置文件更新
#第一层hystrix超时时间设置
#默认情况下是线程池隔离,超时时间1000ms
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 # 熔断超时时长:10000ms
#第二层ribbon超时时间设置:设置比第一层小
#ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1);
ribbon:
ConnectTimeout: 2000 # 请求连接的超时时间: 1s
ReadTimeout: 2000 # 请求处理的超时时间: 1s
OkToRetryOnAllOperations: false # 是否对所有操作重试
MaxAutoRetriesNextServer: 0 # 同一服务不同实例的重试次数
MaxAutoRetries: 0 # 同一实例的重试次数
eager-load:
enabled: true
clients: client-app-server,job-app-server,seller-app-server,pay-server #懒加载,解决第一次请求超时的问题
pom 文件更新
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
这样,ribbon 的重试机制就可以生效了
这里得说一下 Ribbon的饥饿加载(eager-load)模式
目前测试的时候发现在服务都成功启动的时候第一次访问会有报错的情况发生,但是之后又恢复正常访问
通过查询相关文档,了解到要解决此问题那么让需要实例化的类提前创建,而不是在第一次调用的时候创建
主要是Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间,这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,很容易就会出现上面所描述的显现。
因此我们可以通过设置:
ribbon:
eager-load:
enabled: true
clients: client-app-server,job-app-server,seller-app-server,pay-server #懒加载,解决第一次请求超时的问题
参数说明:
ribbon.eager-load.enabled : 开启Ribbon的饥饿加载模式
ribbon.eager-load.clients: 指定需要饥饿加载的服务名