SpringCloud重试机制与各组件的重试总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SpringCloud重试机制与各组件的重试总结SpringCloud重试机制配置
⾸先声明⼀点,这⾥的重试并不是报错以后的重试,⽽是负载均衡客户端发现远程请求实例不可到达后,去重试其他实例。

@Bean
@LoadBalanced
RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setReadTimeout(5000);
httpRequestFactory.setConnectTimeout(5000);
return new RestTemplate(httpRequestFactory);
}
feign重试机制
feign默认是通过⾃⼰包下的Retryer进⾏重试配置,默认是5次
package feign;
import static java.util.concurrent.TimeUnit.SECONDS;
/**
* Cloned for each invocation to {@link Client#execute(Request, feign.Request.Options)}.
* Implementations may keep state to determine if retry operations should continue or not.
*/
public interface Retryer extends Cloneable {
/**
* if retry is permitted, return (possibly after sleeping). Otherwise propagate the exception.
*/
void continueOrPropagate(RetryableException e);
Retryer clone();
public static class Default implements Retryer {
private final int maxAttempts;
private final long period;
private final long maxPeriod;
int attempt;
long sleptForMillis;
public Default() {
this(100, SECONDS.toMillis(1), 5);
}
public Default(long period, long maxPeriod, int maxAttempts) {
this.period = period;
this.maxPeriod = maxPeriod;
this.maxAttempts = maxAttempts;
this.attempt = 1;
}
feign取消重试
@Bean
Retryer feignRetryer() {
return Retryer.NEVER_RETRY;
}
feign请求超时设置
@Bean
Request.Options requestOptions(ConfigurableEnvironment env){
int ribbonReadTimeout = env.getProperty("ribbon.ReadTimeout", int.class, 6000);
int ribbonConnectionTimeout = env.getProperty("ribbon.ConnectTimeout", int.class, 3000);
return new Request.Options(ribbonConnectionTimeout, ribbonReadTimeout);
}
Spring Cloud中各组件的重试
最近挺多童鞋问我如何配置Spring Cloud xxx组件的重试。

本篇进⾏⼀个总结。

Spring Cloud中的重试机制应该说是⽐较混乱的,不同的版本有⼀定区别,实现也不⼤⼀样,好在Spring Cloud Camden之后已经基本稳定下来,Dalston中⼜进⾏了⼀些改进,详情暂且不表。

下⾯我们来详细探讨。

笔者使⽤的版本是 Spring Cloud Dalston SR4 ,同样适应于Edgware 以及更⾼版本,对于Dalston 此前的版本,本⽂不做讨论,⼤家可⾃⾏研究。

Ribbon+RestTemplate的重试
对于整合了Ribbon的RestTemplate,例如⼀个RestTemplate添加了@LoadBalanced 注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(1000);
simpleClientHttpRequestFactory.setReadTimeout(1000);
return new RestTemplate(simpleClientHttpRequestFactory);
}
在此基础上,使⽤如下配置,即可实现重试:
spring:
cloud:
loadbalancer:
retry:
enabled: true
ribbon:
# 同⼀实例最⼤重试次数,不包括⾸次调⽤
MaxAutoRetries: 1
# 重试其他实例的最⼤重试次数,不包括⾸次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进⾏重试
OkToRetryOnAllOperations: false
Feign的重试
Feign本⾝也具备重试能⼒,在早期的Spring Cloud中,Feign使⽤的是feign.Retryer.Default#Default(),重试5次。

但Feign整合了Ribbon,Ribbon也有重试的能⼒,此时,就可能会导致⾏为的混乱。

Spring Cloud意识到了此问题,因此做了改进,将Feign的重试改为feign.Retryer#NEVER_RETRY,如需使⽤Feign的重试,只需使⽤Ribbon的重试配置即可。

因此,对于Camden以及以后的版本,Feign的重试可使⽤如下属性进⾏配置:
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: false
Zuul的重试
配置:
zuul:
# 开启Zuul的重试
retryable: true
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: false
上⾯我们使⽤zuul.retryable=true 对Zuul全局开启了重试,事实上,也可对指定路由开启/关闭重试:
zuul.routes.<routename>.retryable=true
局部配置优先级更⾼。

基于HTTP响应码重试
clientName:
ribbon:
retryableStatusCodes: 404,502
注意点:
Hystrix的超时时间必须⼤于超时的时间,否则,⼀旦Hystrix超时,就没办法继续重试了。

⼀般来说,不建议将ribbon.OkToRetryOnAllOperations 设为true。

因为⼀旦启⽤该配置,则表⽰重试任何操作,包括POST请求,⽽由于缓存了请求体,此时可能会影响服务器的资源。

总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

相关文档
最新文档