20. 重试失败的请求
Spring Cloud Netflix 提供了多种发出 HTTP 请求的方式。您可以使用负载平衡的RestTemplate
,功能区或Feign。无论您选择如何创建 HTTP 请求,始终都有可能导致请求失败。当请求失败时,您可能希望自动重试该请求。为此,在使用 Sping Cloud Netflix 时,您需要在应用程序的 Classpath 中包含Spring Retry。当出现 Spring Retry 时,负载平衡RestTemplates
,Feign 和 Zuul 会自动重试所有失败的请求(假设您的配置允许这样做)。
20.1 退订策略
默认情况下,重试请求时不使用任何退避策略。如果要配置退避策略,则需要创建类型为LoadBalancedRetryFactory
的 bean,并为给定服务覆盖createBackOffPolicy
方法,如以下示例所示:
@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 属性来控制重试功能。为此,设置client.ribbon.MaxAutoRetries
,client.ribbon.MaxAutoRetriesNextServer
和client.ribbon.OkToRetryOnAllOperations
属性。有关这些属性的描述,请参见Ribbon documentation。
Warning
启用client.ribbon.OkToRetryOnAllOperations
包括重试 POST 请求,由于请求正文的缓冲,这可能会对服务器资源产生影响。
另外,您可能想在响应中返回某些状态代码时重试请求。您可以通过设置clientName.ribbon.retryableStatusCodes
属性来列出希望功能区 Client 端重试的响应代码,如以下示例所示:
clientName:
ribbon:
retryableStatusCodes: 404,502
您还可以创建类型为LoadBalancedRetryPolicy
的 bean,并实现retryableStatusCode
方法以根据状态码重试请求。
20.2.1 Zuul
您可以通过将zuul.retryable
设置为false
来关闭 Zuul 的重试功能。您还可以通过将zuul.routes.routename.retryable
设置为false
来逐个路由禁用重试功能。