Служба Spring Cloud Ошибка поиска: у балансировщика нагрузки нет доступного сервера для клиента

Я играл с приложением Spring Cloud, состоящим из сервера конфигурации, сервера обнаружения (Eureka) и клиента Feign с лентой (внутренне используемого Feign). У меня есть 2 службы, movie-service и daily-update-service. Цель состоит в том, чтобы обеспечить ежедневное обновление популярных фильмов, новостей и погоды в одном месте. У меня проблема в том, что клиент movie-service Feign не может найти его в daily-update-service. Выдает ошибку со следующим:

Caused by: java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: movie-service
daily_update_service_1 |    at org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:59) ~[spring-cloud-netflix-core-1.1.0.M4.jar:1.1.0.M4]
daily_update_service_1 |    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:95) ~[feign-core-8.12.1.jar:8.12.1]
daily_update_service_1 |    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:74) ~[feign-core-8.12.1.jar:8.12.1]
daily_update_service_1 |    at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:54) ~[feign-hystrix-8.12.1.jar:8.12.1]
daily_update_service_1 |    at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:294) ~[hystrix-core-1.4.21.jar:1.4.21]
daily_update_service_1 |    ... 21 common frames omitted
daily_update_service_1 | Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: movie-service
daily_update_service_1 |    at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:468) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
daily_update_service_1 |    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
daily_update_service_1 |    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]

Моя отладка показывает, что DomainExtractingServerList пытаюсь выполнить поиск с помощью VIP, который movie-service, но серверов нет. Службы зарегистрированы в Eureka, и я вижу их на панели управления Eureka.

Я не уверен, какие фрагменты кода актуальны, поэтому публикую ссылку на проект Github. Предполагая, что у вас установлены Docker и Docker Compose, самый простой способ запустить его — клонировать проект, а затем следовать следующим инструкциям. Эти инструкции предназначены для ОС Mac/Linux, при необходимости адаптируйте их для Windows. Я предоставлю конкретные фрагменты кода, если кто-то захочет увидеть их здесь, а не искать в коде.

  1. cd daily-update-microservices.
  2. Замените все вхождения моего IP-адреса узла докера своим. Вы можете использовать эту команду: grep -rl '192.168.99.107' . | xargs perl -pi -e "s/192\.168\.99\.107/$(echo $DOCKER_HOST | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')/"
  3. Беги ./gradlew clean buildDockerImage
  4. Выполнить docker-compose -f daily-update-service/docker-compose.yml up.
  5. Как только сервисы появятся, сделайте curl -v http://$(echo $DOCKER_HOST | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'):10000/dailyupdate/movies/popular

person Abhijit Sarkar    schedule 28.12.2015    source источник


Ответы (1)


При дальнейшем исследовании я обнаружил, что если eureka.client.fetchRegistry ложно, различные методы перетасовки в com.netflix.discovery.shared.Applications не вызываются, и, следовательно, Applications.shuffleVirtualHostNameMap никогда не заполняется. Эта карта используется позже для поиска в методе Applications.getInstancesByVirtualHostName, который затем терпит неудачу.

Я не понимаю, почему клиент должен загружать реестр. Они могут каждый раз совершать путешествие по сети или получать дельту, когда это необходимо.

Для этого я открыл проблему на Github. Будет ждать их ответа.

person Abhijit Sarkar    schedule 29.12.2015
comment
Вопрос закрыт. Цитата пользователя spencergibb по вашей проблеме на Github: › извлечение реестра — это то, как eureka может сообщить ленте (loadbalancer) о › том, какие серверы доступны. - person Max G; 12.08.2016
comment
Я перешел по ссылке на выпуск на Github. Мне не хватало зависимости Eureka в pom - person Laxman; 02.04.2017