Автоматическая повторная попытка с лентой (без zuul): не работает + неверная документация? - PullRequest
0 голосов
/ 18 ноября 2018

В последних версиях официальной документации весеннего облака Netflix (например, 2.0.2.RELEASE, последняя версия GA ) говорится:

Когда присутствует Spring Retry, RestTemplates, Feign и Zuul с балансировкой нагрузки автоматически повторяют любые неудачные запросы (при условии, что ваша конфигурация позволяет это делать).

Но это кажется неправильным в отношении использования автономной ленты (т. Е. RestTemplates с балансировкой нагрузки). Я не мог заставить это работать, и не нашел никакого рабочего примера. Более того, я обнаружил, что другие источники утверждают, что все наоборот, например:

Итак, это неверная документация или весь мир что-то упустил?

1 Ответ

0 голосов
/ 19 ноября 2018

Мы нашли ту же проблему; Zuul не будет ни повторять попытки, ни переходить при сбое на другие серверы в списке ленточных серверов, используя конфигурацию по умолчанию (Apache Http Client). Мы отследили его до этой строки кода в классе RibbonLoadBalancingHttpClient:

@Override
public RequestSpecificRetryHandler getRequestSpecificRetryHandler(
        RibbonApacheHttpRequest request, IClientConfig requestConfig) {
    return new RequestSpecificRetryHandler(false, false, RetryHandler.DEFAULT,
            requestConfig);
}

Параметры false, false, закодированные жестко, эффективно запрещают повторные попытки. Это легко исправить.

Добавьте это к классу основного приложения Zuul:

@RibbonClients(
    defaultConfiguration = {EurekaRibbonClientConfiguration.class,
        MyRibbonConfiguration.class})

Создайте класс MyRibbonConfiguration и используйте его для эмуляции метода ribbonLoadBalancingHttpClient здесь , за исключением того, что мы переопределяем и исправляем метод getRequestSpecificRetryHandler, вызывающий проблемы.

public class MyRibbonConfiguration {

  @RibbonClientName
  private String name = "client";

  @Bean
  public RibbonLoadBalancingHttpClient ribbonLoadBalancingHttpClient(
      IClientConfig config, ServerIntrospector serverIntrospector,
      ILoadBalancer loadBalancer, RetryHandler retryHandler, CloseableHttpClient httpClient) {

    RibbonLoadBalancingHttpClient client =
        new RibbonLoadBalancingHttpClient(httpClient, config, serverIntrospector) {
          @Override
          public RequestSpecificRetryHandler getRequestSpecificRetryHandler(
              RibbonApacheHttpRequest request, IClientConfig requestConfig) {
            return new RequestSpecificRetryHandler(true, true, RetryHandler.DEFAULT,
                requestConfig);
          }
        };

    client.setLoadBalancer(loadBalancer);
    client.setRetryHandler(retryHandler);

    Monitors.registerObject("Client_" + this.name, client);
    return client;
  }
}

Настройте true, true для ссылки из свойств, если хотите. После этого Зуул начнет уважать свойства ribbon.MaxAutoRetries и ribbon.MaxAutoRetriesNextServer.

Обратите внимание, что если вы используете Лента с Feign для вызовов сервера-> сервера, то эти вызовы Feign не затрагиваются, поскольку OpenFeign жестко кодирует эти два параметра в true, true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...