20. 重试失败的请求
Spring Cloud Netflix 提供了多种方式来发出 HTTP 请求。您可以使用负载平衡的RestTemplate
,Ribbon 或 Feign。无论您如何选择创建 HTTP 请求,总是有可能请求失败。请求失败时,您可能希望自动重试请求。要在使用 Sping Cloud Netflix 时这样做,您需要在 application 的 classpath 中包含Spring 重试。当 Spring Retry 存在时,load-balanced RestTemplates
, Feign 和 Zuul 会自动重试任何失败的请求(假设您的 configuration 允许这样做)。
20.1 BackOff Policies
默认情况下,重试请求时不使用退避 policy。如果要配置退避 policy,则需要创建LoadBalancedRetryFactory
类型的 bean 并覆盖给定服务的createBackOffPolicy
方法,如以下 example 所示:
@Configuration
public class MyConfiguration {
@Bean
LoadBalancedRetryFactory retryFactory() {
return new LoadBalancedRetryFactory() {
@Override
public BackOffPolicy createBackOffPolicy(String service) {
return new ExponentialBackOffPolicy();
}
};
}
}
20.2 Configuration
将 Ribbon 与 Spring Retry 一起使用时,可以通过配置某些 Ribbon properties 来控制重试功能。为此,请设置client.ribbon.MaxAutoRetries
,client.ribbon.MaxAutoRetriesNextServer
和client.ribbon.OkToRetryOnAllOperations
properties。有关这些 properties 的说明,请参阅Ribbon 文档。
启用
client.ribbon.OkToRetryOnAllOperations
包括重试 POST 请求,由于请求正文的缓冲,POST 请求会对服务器的资源产生影响。
此外,您可能希望在响应中返回某些状态代码时重试请求。您可以通过设置clientName.ribbon.retryableStatusCodes
property 列出希望 Ribbon client 重试的响应代码,如下面的示例所示:
clientName:
ribbon:
retryableStatusCodes: 404,502
您还可以创建LoadBalancedRetryPolicy
类型的 bean 并实现retryableStatusCode
方法以在给定状态 code 的情况下重试请求。
20.2.1 Zuul
您可以通过将zuul.retryable
设置为false
来关闭 Zuul 的重试功能。您还可以通过将zuul.routes.routename.retryable
设置为false
来在 route-by-route 基础上禁用重试功能。