Spring云服务查找错误:负载平衡器没有可用的客户端服务器

我一直在玩一个由configuration服务器,发现服务器(Eureka)和带Ribbon的Feign客户端(Feign内部使用)组成的Spring云应用程序。 我有2个服务, movie-servicedaily-update-service 。 目的是在一个地方每天更新stream行的电影,新闻和天气。 我遇到的问题是movie-service Feign客户端无法从daily-update-servicefind它。 它错误地与以下内容:

 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] 

到目前为止,我的debugging显示, DomainExtractingServerList正在试图通过VIP进行查找,这是movie-service并且没有服务器。 这些服务在Eureka注册,我可以在Eureka仪表板上看到它们。

我不确定哪些代码是相关的,所以我发布了一个链接到Github项目 。 假设你已经安装了Docker和Docker Compose,启动并运行它的最简单的方法是复制项目,然后按照下面的说明操作。 这些说明适用于Mac / Linux操作系统,如果需要,可以将它们调整到Windows。 如果有人想在这里看到它,而不是查看代码,我会提供特定的代码片段。

  1. cd daily-update-microservices
  2. replace我的docker主机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}')/" 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

经过进一步调查,我发现如果eureka.client.fetchRegistry为false, eureka.client.fetchRegistry中的各种shuffle方法不会被调用,因此Applications.shuffleVirtualHostNameMap永远不会被填充。 这个映射稍后用于在Applications.getInstancesByVirtualHostName方法中查找,然后失败。

我不明白为什么客户端将被迫下载registry。 他们可能会select每次进行networking旅行,或者在必要时获得三angular洲。

我已经在Github上为此打开了一个问题 。 将等待他们的回应。