Резервные методы на сервере Zuul в облаке Spring

Я новичок в Spring Cloud Netflix и у меня есть несколько вопросов по этому поводу.
Я использую API-шлюз вместе с Hystrix, работающим на пограничном сервере Zuul, и хотел бы убедиться, правильно ли я понимаю следующее поведение:

Я убиваю микросервис, работающий "за" API-шлюзом, и вынуждаю hystrix открыть цепь. После этого (около 10 секунд) я отправляю запрос в неработающий микросервис и получаю ошибку TIMEOUT. Однако, когда я отправляю много (десятки) запросов за очень короткое время (до 1 секунды), я получаю сообщение об ошибке SHORTCIRCUIT OPEN.
Я был удивлен, почему я получаю сообщение об ошибке TIMEOUT, хотя цепь разомкнута, и поэтому Hystrix должен включиться, чтобы избежать таких сбоев. Но я предполагаю, что причина в том, что если время с момента последнего запроса> circuitBreaker.sleepWindowInMilliseconds, то API-шлюз снова пытается подключиться к микросервису, чтобы проверить, жив он ли, но, таким образом, -> TIMEOUT. Это также объясняет, почему я получил ошибку SHORTCIRCUIT OPEN по многим запросам за короткое время.

Следующее, что я получаю сообщение об ошибке "TIMEOUT" или "SHORTCIRCUIT":

HystrixRuntimeException: Microservice (timed-out | short-circuited) and no fallback available

Как я могу указать запасной вариант на сервере zuul (это может быть одинаковым для всех маршрутов), чтобы избежать этого исключения?
Что я пробовал до сих пор:

  • В соответствии с этим я установил стратегию изоляции выполнения в THREAD, чтобы избежать тайм-аута:

    hystrix: command.default.execution.isolation.strategy: THREAD

но после просмотра hystrix.stream я получил propertyValue_executionIsolationStrategy":"SEMAPHORE"

  • Кажется, есть подсказка для решения на github, написав пользовательскую RibbonCommand и переопределив getFallback(), но после просмотра интерфейса RibbonCommand. Я обнаружил, что ни RibbonCommand, ни его суперинтерфейсы не определяют такой метод.

Моя служба шлюза API:

@SpringBootApplication
@EnableSidecar // This annotation includes @EnableCircuitBreaker, @EnableDiscoveryClient, and @EnableZuulProxy
@EnableHystrixDashboard
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}

application.yml

server:
  port: 10000
sidecar:
  port: 8000
endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
zuul:
  routes:
    microservice:
      path: /microservice/**

hystrix:
  command.default.execution.isolation.strategy: THREAD

debug: true

1 ответ

Последний выпуск поддерживает откат на уровне Zuul. Это делается путем расширения ZuulFallbackProvider. Пожалуйста, посетите следующую ссылку для примера: https://github.com/spring-cloud-samples/zuul-server/blob/master/src/main/java/zuulserver/ZuulServerApplication.java

Сам по себе резервный запуск не выполняется для определенных типов конфигураций маршрута (например, если у вас есть конфигурация на основе URL)

"Эти простые URL-маршруты не выполняются как HystrixCommand, и вы не можете сбалансировать несколько URL-адресов с помощью ленты".

Другие вопросы по тегам