Zuul, кажется, переписывает маршруты после вызова REST

Я столкнулся со странным поведением нашего Zuul-Proxy в нашем Microservice-Project. Моя установка состоит из Discovery-Service (Eureka), API-Gateway (Zuul) и двух микросервисов «A» и «B». После запуска установки через "localhost: 10000 / routes" отображаются следующие маршруты:

{
  "/api-gateway/**": "api-gateway",
  "/a-service/**": "a-service",
  "/b-service/**": "b-service"
}

Моя конфигурация Zuul выглядит так:

zuul:
  ignored-services: ''
  add-proxy-headers: true
  sensitiveHeaders: 'Cookie,Set-Cookie'

Теперь я получаю доступ к службам через шлюз и делаю несколько вызовов REST:

http://localhost:10000/a-service/sayHello -> ОК

http://localhost:10000/b-service/sayBye -> ОК

http://localhost:10000/a-service/sayHello -> ОШИБКА 404

Я вижу, что последний запрос по ошибке направлен в службу B, хотя я использую маршрут «/ a-service / **». Как такое могло случиться? Второй REST-вызов службы B как-то переписал маршрутизацию?

Однако «localhost: 10000 / routes» по-прежнему возвращает то же, что и выше. Это также работает с вызовом служб в обратном порядке B-A-B -> 404 и ошибочно направленным на службу A.

Вы можете загрузить минимальный проект с 4 компонентами, которые позволят вам легко воспроизвести это поведение здесь: https://github.com/Netflix/zuul/files/827817/MinimalZuulRouteBugProject.zip

Спасибо за любую информацию по этому вопросу.


person Skeffington    schedule 08.03.2017    source источник


Ответы (1)


Ответ от spencergibb @github:

Это задокументированная проблема здесь http://cloud.spring.io/spring-cloud-static/Camden.SR5/#_customizing_the_ribbon_client

FooConfiguration должен быть @Configuration, но позаботьтесь о том, чтобы он не находился в @ComponentScan для основного контекста приложения, иначе он будет использоваться всеми @RibbonClients. Если вы используете @ComponentScan (или @SpringBootApplication), вам необходимо предпринять шаги, чтобы избежать его включения (например, поместить его в отдельный неперекрывающийся пакет или указать пакеты для явного сканирования в @ComponentScan).

В вашем случае RibbonConfigAvailability обнаруживается сканированием компонентов и распределяется между всеми ленточными клиентами (что плохо). Либо удалите @Configuration (он не должен быть аннотирован как таковой, это то, как я тестировал), либо исключите его из сканирования компонентов.

Неправильный код:

@Configuration //THIS ANNOTATION IS THE ERROR    
public class RibbonConfigAvailability {

    @Bean
    public IRule ribbonRule() {
        return new AvailabilityFilteringRule();
    }

}
person Skeffington    schedule 08.03.2017