当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SpringCloud服务查找错误:负载均衡器没有可用于客户端的服务器》经验,为你挑选了1个好方法。

我一直在玩一个Spring Cloud应用程序,它包含一个配置服务器,一个发现服务器(Eureka)和一个带有Ribbon的Feign客户端(由Feign内部使用).我有2个服务,a movie-service和a daily-update-service.目的是在一个地方提供热门电影,新闻和天气的每日更新.我遇到的问题是movie-serviceFeign客户端无法找到它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进行调整.如果有人想在这里看到它而不是查看代码,我将提供特定的代码片段.

    cd daily-update-microservices.

    用你的替换我的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}')/"

    ./gradlew clean buildDockerImage

    docker-compose -f daily-update-service/docker-compose.yml up.

    一旦服务出现,做一个 curl -v http://$(echo $DOCKER_HOST | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'):10000/dailyupdate/movies/popular

Abhijit Sark.. 5

经过进一步调查,我发现如果eureka.client.fetchRegistry为false,com.netflix.discovery.shared.Applications则不调用各种shuffle方法,因此Applications.shuffleVirtualHostNameMap从不填充.此映射稍后用于查找Applications.getInstancesByVirtualHostName失败的方法.

我不明白为什么客户会被迫下载注册表.他们可能选择每次进行网络旅行或在必要时获得增量.

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



1> Abhijit Sark..:

经过进一步调查,我发现如果eureka.client.fetchRegistry为false,com.netflix.discovery.shared.Applications则不调用各种shuffle方法,因此Applications.shuffleVirtualHostNameMap从不填充.此映射稍后用于查找Applications.getInstancesByVirtualHostName失败的方法.

我不明白为什么客户会被迫下载注册表.他们可能选择每次进行网络旅行或在必要时获得增量.

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有