在Spring Cloud Application中实施重试

时间:2019-06-28 02:13:05

标签: java spring spring-boot spring-cloud netflix-zuul

我目前正在尝试在Zuul代理应用程序中实现重试功能,该应用程序目前直接在路由配置下提供了url。当您直接在路由下指定网址时,是否有可能实现重试功能(如下例所示)?

zuul:
  prefix: /api
  sensitive-headers: Cookie,Set-Cookie
  routes:
    servicea:
      path: /servicea
      stripPrefix: true
      url: ${servicea.url}
    serviceb:
      path: /serviceab
      stripPrefix: true
      url: ${serviceb.url}

ribbon:
  ReadTimeout: 60000

该应用程序定向到负载平衡器(ALB)前面的外部应用程序,因此在这种情况下不需要客户端负载平衡和服务发现。

应用程序对Zuul使用以下依赖项:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  <version>2.1.2.RELEASE</version>
</dependency>

假设这是不可能的(文档似乎表明了这一点),我希望得到一些帮助,以帮助我理解如何配置应用程序以启用重试。根据我的阅读,以下配置应该可以工作:

zuul:
  prefix: /api
  sensitive-headers: Cookie,Set-Cookie
  routes:
    servicea:
      path: /servicea
      stripPrefix: true
      retryable: true
      serviceId: servicea
    serviceb:
      path: /serviceab
      stripPrefix: true
      retryable: true
      serviceId: serviceb

 servicea:
   ribbon:
     ReadTimeout: 10000
     ConnectTimeout: 10000
     NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
     listOfServers: ${servicea.url}
     stripPrefix: true
     MaxAutoRetries: 1
     OkToRetryOnAllOperations: true

 serviceb:
   ribbon:
     ReadTimeout: 10000
     ConnectTimeout: 10000
     NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
     listOfServers: ${serviceb.url}
     stripPrefix: true
     MaxAutoRetries: 1
     OkToRetryOnAllOperations: true

 ribbon:
   IsSecure: true
   eureka:
     enabled: false
   ReadTimeout: 60000

当我尝试以这种方式实现它时,我遇到了一个问题,即应用程序不包含在listOfServers属性中指定的主机名。 HTTP请求显然因此而失败(URL只是协议,上下文路径以及路径的其余部分)。

在启动过程中,配置中的URL被注入到PropertySource中。其中一个网址如下所示

https://servicea.domain/servicea

在此示例中,URL是负载均衡器的CNAME。第二种配置是通过以下方式进行路由

Spring Cloud应用程序的路径: /servicea/v1/someeapi

正在生成网址:

https:/servicea/v1/someapi

如您所见,应用程序正在从URL删除主机和域,从而导致请求失败。

我是否缺少此配置? 我目前不在应用程序的其他任何地方配置Spring Cloud(除了在主类中提供@EnableZuulProxy@EnableRetry批注之外)。

1 个答案:

答案 0 :(得分:0)

  

重试失败的请求   Spring Cloud Netflix提供了多种发出HTTP请求的方式。您可以使用负载平衡的RestTemplate,Ribbon或Feign。无论您选择如何创建HTTP请求,始终都有可能导致请求失败。当请求失败时,您可能希望自动重试该请求。为此,在使用Sping Cloud Netflix时,您需要在应用程序的类路径中包括Spring Retry。当出现Spring Retry时,负载平衡的RestTemplates,Feign和Zuul会自动重试任何失败的请求(假设您的配置允许这样做)。

文档在这里:spring cloud retry