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

Posted

技术标签:

【中文标题】Spring Cloud 服务查找错误:负载均衡器没有可供客户端使用的服务器【英文标题】:Spring Cloud service Look up error: Load balancer does not have available server for client 【发布时间】:2016-04-02 16:41:35 【问题描述】:

我一直在玩一个 Spring Cloud 应用程序,它由一个配置服务器、一个发现服务器 (Eureka) 和一个带有 Ribbon 的 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 project 的链接。假设您已安装 Docker 和 Docker Compose,启动并运行它的最简单方法是克隆项目,然后按照以下说明进行操作。这些说明适用于 Mac/Linux 操作系统,如有必要,请根据 Windows 进行调整。如果有人想在这里查看而不是查看代码,我将提供特定的代码 sn-ps。

    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

【问题讨论】:

【参考方案1】:

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

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

我为此开了一个issue on Github。将等待他们的回应。

【讨论】:

问题已关闭。在 Github 上引用用户“spencergibb”关于您的问题:> 获取注册表是 eureka 如何告诉功能区(负载均衡器)> 哪些服务器可用。 我点击了issue on Github 上的链接。我在 pom 中缺少 Eureka 依赖项

以上是关于Spring Cloud 服务查找错误:负载均衡器没有可供客户端使用的服务器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring Cloud 构建微服务系统:客户端负载均衡(Ribbon)

Spring Cloud Ribbon——客户端负载均衡

最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇

最新版Spring Cloud Alibaba微服务架构-Ribbon负载均衡篇

第四章 客户端负载均衡:Spring Cloud Ribbon

spring cloud 之 客户端负载均衡 Ribbon