Статьи

Поддержка Spring Cloud Zuul — Настройка таймаутов

Spring Cloud обеспечивает поддержку Netflix Zuul — инструментария для создания пограничных сервисов с возможностями маршрутизации и фильтрации.

Поддержка Zuul Proxy подробно описана на сайте Spring Cloud. Моя цель здесь — сосредоточиться на небольшом наборе атрибутов, связанных с обработкой таймаутов при работе с прокси-сервисами.

Целевой Сервис и Шлюз

Чтобы лучше изучить таймауты, я создал образец сервиса (код доступен здесь ), который принимает настраиваемый параметр «delay» как часть тела запроса, а пример запроса / ответа выглядит примерно так:

Пример запроса с 5-секундной задержкой:

1
2
3
4
5
6
{
  "id": "1",
  "payload": "Hello",
  "delay_by": 5000,
  "throw_exception": false
}

и ожидаемый ответ:

1
2
3
4
5
{
  "id": "1",
  "received": "Hello",
  "payload": "Hello!"
}

Этот сервис зарегистрирован с идентификатором «sample-svc» в Eureka, прокси-сервер Spring Cloud Zuul поверх этого сервиса имеет следующую конфигурацию:

1
2
3
4
5
6
7
zuul:
  ignoredServices: '*'
  routes:
    samplesvc:
      path: /samplesvc/**
      stripPrefix: true
      serviceId: sample-svc

По сути, все запросы в / samplesvc / uri отправляются в службу, не имеющую неоднозначности, с именем sample-svc через Eureka.

У меня также есть интерфейс поверх шлюза, чтобы упростить тестирование с разными задержками:

ZuulGatewayUI

Тесты задержки обслуживания

Шлюз ведет себя без каких-либо проблем, связанных с тайм-аутом, когда к служебному вызову добавляется параметр с низкой задержкой, однако, если параметр задержки изменяется так низко, как, скажем, от 1 до 1,5 секунд, шлюз будет отключаться.

Причина в том, что если шлюз настроен на использование Eureka, то шлюз использует компонент ленты Netflix для фактического вызова. Кроме того, вызов ленты обернут в Hystrix, чтобы гарантировать, что вызов остается отказоустойчивым. Первый тайм-аут, который мы выберем, заключается в том, что Hystrix имеет очень низкий порог допуска задержки, и настройка параметров Hystrix должна помочь нам преодолеть первый тайм-аут.

1
2
3
4
5
6
7
hystrix:
  command:
    sample-svc:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000

Обратите внимание, что «командный ключ» Hystrix, используемый для настройки, — это имя службы, зарегистрированное в Eureka.

Это может быть слишком мелкозернистым для этого конкретного вызова Zuul, если вы хорошо настроили настройку по всем направлениям, тогда конфигурация по этим направлениям должна помочь:

1
2
3
4
5
6
7
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000

С этим изменением запрос к услуге через шлюз с задержкой до 5 секунд теперь будет проходить без проблем. Если бы мы превысили 5 секунд, мы бы получили еще один тайм-аут. Сейчас мы перешли к настройке тайм-аута ленты, которая снова может быть настроена детально для конкретного вызова службы путем настройки конфигурации, которая выглядит следующим образом:

1
2
3
sample-svc:
  ribbon:
    ReadTimeout: 15000

С обоими этими настройками тайм-аута теперь должен проходить вызов на основе шлюза

Вывод

Цель состояла не в том, чтобы показать способы установки произвольно высоких значений времени ожидания, а просто в том, чтобы показать, как установить значения, которые могут быть более подходящими для ваших приложений. Разумные тайм-ауты очень важны для обеспечения того, чтобы плохое поведение сервисов не касалось пользователей. Следует отметить, что если шлюз настроен без ленты и Eureka путем указания прямого URL-адреса для службы, то эти параметры тайм-аута вообще не имеют значения.

Если вы заинтересованы в дальнейшем изучении этого, образцы доступны здесь .

Ссылка: Поддержка Spring Cloud Zuul — Настройка тайм-аутов от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.