Внедрение Retry в Spring Cloud Application - PullRequest
0 голосов
/ 28 июня 2019

В настоящее время я пытаюсь реализовать функцию повтора в прокси-приложении Zuul, которое в настоящее время предоставляет URL-адреса непосредственно в конфигурации маршрутов.Можно ли добиться функциональности повтора, если указать 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 во время запуска.Один из URL-адресов будет выглядеть следующим образом:

https://servicea.domain/servicea

В этом примере URL-адрес представляет собой CNAME для балансировщика нагрузки.Вторая конфигурация - это маршрутизация следующим образом:

Путь к приложению Spring Cloud: /servicea/v1/someeapi

Генерируемый URL:

https:/servicea/v1/someapi

Как вы можете видеть, приложение удаляет хост и домен с URL-адреса, что приводит к сбою запросов.

Я что-то упустил в этой конфигурации?В настоящее время я не настраиваю Spring Cloud где-либо еще в приложении (кроме предоставления аннотаций @EnableZuulProxy и @EnableRetry в основном классе).

1 Ответ

0 голосов
/ 28 июня 2019

Повторение неудачных запросов Spring Cloud Netflix предлагает различные способы выполнения HTTP-запросов.Вы можете использовать RestTemplate, Ribbon или Feign с балансировкой нагрузки.Независимо от того, как вы решите создавать свои HTTP-запросы, всегда есть вероятность, что запрос может завершиться неудачей.Если запрос не выполнен, вы можете захотеть, чтобы запрос был повторен автоматически.Для этого при использовании Sping Cloud Netflix вам нужно включить Spring Retry в путь к классу вашего приложения.Когда Spring Retry присутствует, RestTemplates, Feign и Zuul с балансировкой нагрузки автоматически повторяют любые неудавшиеся запросы (при условии, что ваша конфигурация позволяет это делать).

Документ здесь: попытка весеннего облака

...