Spring Cloud Netflix 提供了各种HTTP请求的方式。
你可以使用负载均衡的RestTemplate, Ribbon, 或者 Feign。
无论你选择如何创建HTTP请求,都存在请求失败的可能性。
当一个请求失败时,你可能想它自动地去重试。
当使用Sping Cloud Netflix时,这么做,你需要在应用的classpath引入Spring Retry。
当存在Spring Retry,负载均衡的RestTemplates, Feign, 和 Zuul,会自动地重试失败的请求(假设你的配置允许这样做)。
1、补偿策略
默认情况下,请求重试禁用补偿策略。
如果你想配置一个补偿策略,你需要创建一个LoadBalancedRetryFactory类型的bean,并且覆盖service的createBackOffPolicy 方法,像下面例子所示:
@Configuration
public class MyConfiguration {
@Bean
LoadBalancedRetryFactory retryFactory() {
return new LoadBalancedRetryFactory() {
@Override
public BackOffPolicy createBackOffPolicy(String service) {
return new ExponentialBackOffPolicy();
}
};
}
}
2、配置
当你在Ribbon使用Spring Retry 时,你可以控制重试功能,通过配置某些的Ribbon属性。
这样做:设置client.ribbon.MaxAutoRetries, client.ribbon.MaxAutoRetriesNextServer, 和 client.ribbon.OkToRetryOnAllOperations 属性。
这些属性如何设置具体查看Ribbon文档的描述。
提醒:
启用client.ribbon.OkToRetryOnAllOperations 包括POST请求重试,由于请求体缓冲,这对服务器的资源可能产生影响
此外,你可能想重试请求时在响应中返回某些状态码。你可以设置clientName.ribbon.retryableStatusCodes属性 列出你想在Ribbon客户端重试时返回的的响应码。像下面例子所示:
clientName:
ribbon:
retryableStatusCodes: 404,502
你还可以创建一个LoadBalancedRetryPolicy 类型的bean,并且实现retryableStatusCode方法,返回请求重试的状态码。
3、Zuul
你可以关掉重试功能,通过设置
zuul.retryable=false
你还可以禁用重试功能,通过设置
zuul.routes.routename.retryable=false