乐趣区

Spring-Cloud-参考文档重试失败的请求

重试失败的请求

Spring Cloud Netflix 提供了多种方式来发出 HTTP 请求,你可以使用负载均衡的RestTemplate、Ribbon 或 Feign。无论你如何选择创建 HTTP 请求,总是有可能请求失败,请求失败时,你可能希望自动重试请求,要在使用 Sping Cloud Netflix 时这样做,你需要在应用程序的类路径中包含 Spring Retry。当存在 Spring Retry 时,负载均衡的RestTemplates、Feign 和 Zuul 会自动重试任何失败的请求(假设你的配置允许这样做)。

退避策略

默认情况下,重试请求时不使用退避策略,如果要配置退避策略,则需要创建类型为 LoadBalancedRetryFactory 的 bean 并覆盖给定服务的 createBackOffPolicy 方法,如以下示例所示:

@Configuration
public class MyConfiguration {
    @Bean
    LoadBalancedRetryFactory retryFactory() {return new LoadBalancedRetryFactory() {
            @Override
            public BackOffPolicy createBackOffPolicy(String service) {return new ExponentialBackOffPolicy();
            }
        };
    }
}

配置

将 Ribbon 与 Spring Retry 一起使用时,可以通过配置某些 Ribbon 属性来控制重试功能,为此,请设置 client.ribbon.MaxAutoRetriesclient.ribbon.MaxAutoRetriesNextServerclient.ribbon.OkToRetryOnAllOperations属性,有关这些属性的说明,请参阅 Ribbon 文档。

启用 client.ribbon.OkToRetryOnAllOperations 包括重试 POST 请求,由于请求 body 的缓冲,POST 请求会对服务器的资源产生影响。

此外,你可能希望在响应中返回某些状态码时重试请求,你可以通过设置 clientName.ribbon.retryableStatusCodes 属性列出你希望 Ribbon 客户端重试的响应码,如以下示例所示:

clientName:
  ribbon:
    retryableStatusCodes: 404,502

你还可以创建类型为 LoadBalancedRetryPolicy 的 bean,并实现 retryableStatusCode 方法以在给定状态码的情况下重试请求。

Zuul

你可以通过将 zuul.retryable 设置为 false 来关闭 Zuul 的重试功能,你还可以通过将 zuul.routes.routename.retryable 设置为 false 来逐个路由地禁用重试功能。


上一篇:使用 Sidecar 支持多语言

退出移动版