Резервные методы на сервере 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-адресов с помощью ленты".