2016-06-10 2 views
1

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

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

Следующая вещь, что, как я получаю «Timeout» или ошибка «Короткое замыкание» Я получил:

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

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

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

    Hystrix: command.default.execution.isolation.strategy: НИТКИ

, но после того, как смотреть на 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-адресов лентой».

+0

Вы должны подумать о том, чтобы поместить номер версии, чтобы помочь правильному пользователю изменить версию/версию, которая решает их проблему. – scicalculator

+0

Удивительно, сколько вещей я пропускаю в официальной весенней документации.Не удалось выяснить, почему мои резервные методы не вызывались для отказа от маршрутов url. +1 – Bal

Смежные вопросы