Имитация приоритета клиентом URL-адресов в yaml над Eureka

У меня есть приложение Spring Boot, которое служит клиентом Eureka. Приложению необходимо вызвать другую микрослужбу через REST, и я хочу сделать этот вызов с помощью Feign. Проблема, с которой я столкнулся, заключается в том, что мое приложение пытается найти имя службы в Eureka, когда оно определено только в файле yaml моих приложений.

Прошу прощения за трудность объяснения. Надеюсь, следующие фрагменты кода помогут прояснить ситуацию.

Имитация клиента:

@FeignClient("foo")
@Component
public interface FooServiceProxy{
    @RequestMapping(value = "/balance", method = RequestMethod.POST, produces = "application/json")
    ServiceResponse execute(ServiceRequest serviceRequest);
}

В моем контроллере, который вызывает этого клиента Feign, FooServiceProxy определяется с помощью @AutoWired:

@Autowired
private FooServiceProxy fooServiceProxy;

Мой файл yaml выглядит следующим образом:

spring:
    application:
        name: app-name

server:
port: 8080

foo:
    ribbon:
        listOfServers: http://hostname:8081/balance

eureka:
  client:
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://eurekasrver:8761/eureka/

Моя проблема в том, что во время выполнения возникает следующая ошибка: java.lang.RuntimeException: com.netflix.client.ClientException: балансировщик нагрузки не имеет доступного сервера для клиента: foo

Интересно, что если я удалю аннотацию @EnableEurekaClient из приложения, все заработает. Я считаю, что понимаю проблему, заключающуюся в том, что вместо того, чтобы искать сервер для foo в моем файле yaml, поскольку приложение является клиентом Eureka, Feign идет прямо в Eureka для поиска IP-адреса сервера, а затем терпит неудачу, поскольку его нельзя найти. Несмотря на кажущееся понимание проблемы, я не смог найти решение в Интернете или придумать его сам.

Любая помощь будет оценена по достоинству. Спасибо!


person dFrancisco    schedule 19.07.2017    source источник


Ответы (1)


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

Spring Cloud использует @RibbonClient для настройки типов, используемых лентой, например списка серверов. Если у вас есть эврика в пути к классам, по умолчанию он использует список серверов эврики (следовательно, вам нужен флаг для отключения эврики). Комментарий от spencergibb https://github.com/spring-cloud/spring-cloud-netflix/issues/564

Вы можете попробовать либо, добавив конфигурацию NIWSServerListClassName:

`someservice.ribbon: 
   NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList  
   listOfServers: server1:80`

Или попробуйте решение, предложенное в этой проблеме: https://github.com/spring-cloud/spring-cloud-netflix/issues/564

person arcticless    schedule 13.02.2018