Spring Cloud常用组件重试总结
Ribbon的重试配置
Ribbon的重试机制是基于Spring Retry,需要引用相关包:
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
在添加了包引用后,重试机制自动生效,相关配置如下:
ribbon:
retryableStatusCodes: 404,502
OkToRetryOnAllOperations: false
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
参数详细解:
retryableStatusCodes
默认情况下,Ribbon不会针对HTTP非正常响应状态值(如404、502等)进行重试。如果您需要对特殊的Http状态进行重试,需要配置该参数。
OkToRetryOnAllOperations
这个参数指的是是否允许所有的HTTP请求(GET,POST,PUT等)重试。默认值是false,只允许GET请求重试。对于POST等请求,请慎重使用。
MaxAutoRetries
这个参数用于配置当前实例最大重试次数,默认值为0。重试次数不包括第一次请求。
MaxAutoRetriesNextServer
这个参数指的是切换实例最大重试次数,默认值1。
如果访问当前实例异常,会再次尝试访问当前实例(次数由MaxAutoRetries决定);如果还不行,就会访问下一个实例;如果仍然不行,会把下一个实例作为当前实例并重试(次数由MaxAutoRetries决定)...依此类推,直到切换实例次数达到上限(由MaxAutoRetriesNextServer决定)。总共的重试次数计算公式:
1+MaxAutoRetries*(MaxAutoRetriesNextServer+1)+MaxAutoRetriesNextServer
Feign的重试配置
新版Feign中无缝集成了Ribbon(无论您是否真的需要Ribbon😂),所以Ribbon的重试配置在Feign中仍然有效。虽然Feign本身具备重试功能,但不建议使用,因为会和Ribbon的重试一起使用会造成混乱。
Zuul的重试配置
因为Zuul也使用了Ribbon,所以只需配置Ribbon即可:
zuul:
#全局配置是否启用重试
retryable: true
routes:
sample:
#按路由配置
retryable: false
#重试配置
ribbon:
OkToRetryOnAllOperations: false
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
上述配置中,首先通过zuul.retryable全局启用重试,当然也能针对路由配置(配置中禁用了sample路由的重试)。然后配置Ribbon的重试策略。
P.S. 别忘了引用spring-retry包。