说明
服务调用者 连接 服务提供者 超时后,或者,服务调用者 成功连接 服务提供者 但 读取超时后,会触发 重新发请求
注意: 本文内容,是 单独使用Ribbon,而 不使用Feign
应用场景
配合重试使用
服务提供者响应慢,需要增大连接超时、读超时的时长
全局配置
开启重试机制
默认是关闭的。注意,官方文档中的配置参数少了enabled:
spring:
cloud:
loadbalancer:
retry:
enabled: true
亲测,不配置此项也可以
重试配置
ribbon:
restclient:
enabled: false
OkToRetryOnAllOperations: false
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
ReadTimeout: 5000
ConnectTimeout: 2000
解释:
enabled:true表示启用配置。单独使用Ribbon,不用Feign,必须加该配置,默认值:false
ConnectTimeout:指的是建立连接所用的时间,默认值:5000毫秒
ReadTimeout:建立连接后,从服务器读取资源(远程服务器返回内容,如:html、json)所用的时间。默认值:2000毫秒
OkToRetryOnAllOperations:默认false,一般设置为false 或 不配置此项
- false:只有 get请求,读超时(ReadTimeout)后,进行重试
- true:所有请求,读超时(ReadTimeout)后,都会进行重试
MaxAutoRetries:对当前实例的重试次数,不包括首次调用,默认为0
MaxAutoRetriesNextServer:重试负载均衡其他的实例最大重试次数,不包括首次调用,默认1
OkToRetryOnAllOperations 推荐 设置false
详细参见:https://www.cnblogs.com/zhangjianbin/p/7228628.html
如果 OkToRetryOnAllOperations 设置为 true,那么 读超时(ReadTimeout)后,所有请求都会进行重试,即:当发送 post、put请求,read 超时后,重试 会引发问题
在restful中,post 一般是 保存 操作,问题如下:
服务提供者 确实接收到 服务调用者 的 post 请求,即:确实执行 保存 操作
但是,服务提供者 返回响应时,由于 网络抖动,导致 服务调用者 没有接收到 该响应
那么 服务调用者 将会 触发 重试机制,服务调用者 再次向 服务提供者 发post 请求,服务提供者 接收请求后,会再次执行 保存 操作,那么就 保存 2 条记录
除非 服务提供者 实现了 接口幂等性
OkToRetryOnAllOperations 为true,亲测不可用
将 OkToRetryOnAllOperations 设置为 true,仍然只有 get 请求会重试,其他请求仍不会重试
亲测不可用,不知道为什么
使用 openfeign 是好使的(openfeign底层使用ribbon)
例子
ribbon:
restclient:
enabled: true
OkToRetryOnAllOperations: false #对所有操作请求都进行重试,默认false
ReadTimeout: 5000 #负载均衡超时时间,默认值5000
ConnectTimeout: 3000 #ribbon请求连接的超时时间,默认值2000
MaxAutoRetries: 1 #对当前实例的重试次数,默认0
MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1
对于 get请求,read超时后,将重复发送4次
局部设置
针对调用某个 服务提供者,进行配置
NOTICE-SERVICE: # eureka中的服务id
ribbon:
OkToRetryOnAllOperations: false
ReadTimeout: 5000
ConnectTimeout: 2000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
服务id,eureka中的服务id,如下图:
感谢:
https://blog.csdn.net/Deronn/article/details/103127711
