Spring Cloud service Look up error: Load balancer does not have available server for client
Spring Cloud service Look up error: Load balancer does not have available server for client
我一直在玩一个 Spring 云应用程序,它由一个配置服务器、一个发现服务器 (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.run(HystrixInvocationHandler.java:54) ~[feign-hystrix-8.12.1.jar:8.12.1]
daily_update_service_1 | at com.netflix.hystrix.HystrixCommand.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.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
daily_update_service_1 | at com.netflix.loadbalancer.reactive.LoadBalancerCommand.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
到目前为止,我的调试显示 DomainExtractingServerList 正在尝试通过 VIP 进行查找,这是 movie-service
并且没有服务器。这些服务已在 Eureka 中注册,我可以在 Eureka 仪表板上看到它们。
我不确定代码的哪些部分是相关的,所以我将 link 发布到 Github project。假设您已经安装了 Docker 和 Docker Compose,启动它和 运行 的最简单方法是克隆项目,然后按照以下说明进行操作。这些说明适用于 Mac/Linux OS,如有必要,请将其调整为 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
经过进一步调查,我发现如果 eureka.client.fetchRegistry
为假,则不会调用 com.netflix.discovery.shared.Applications
中的各种随机播放方法,因此永远不会填充 Applications.shuffleVirtualHostNameMap
。该映射稍后用于在方法 Applications.getInstancesByVirtualHostName
中查找,然后失败。
我不明白为什么客户端会被迫下载注册表。他们可以选择每次都进行网络旅行或在必要时获得增量。
我为此开了一个issue on Github。将等待他们的回应。
我一直在玩一个 Spring 云应用程序,它由一个配置服务器、一个发现服务器 (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.run(HystrixInvocationHandler.java:54) ~[feign-hystrix-8.12.1.jar:8.12.1]
daily_update_service_1 | at com.netflix.hystrix.HystrixCommand.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.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
daily_update_service_1 | at com.netflix.loadbalancer.reactive.LoadBalancerCommand.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.1.0.jar:2.1.0]
到目前为止,我的调试显示 DomainExtractingServerList 正在尝试通过 VIP 进行查找,这是 movie-service
并且没有服务器。这些服务已在 Eureka 中注册,我可以在 Eureka 仪表板上看到它们。
我不确定代码的哪些部分是相关的,所以我将 link 发布到 Github project。假设您已经安装了 Docker 和 Docker Compose,启动它和 运行 的最简单方法是克隆项目,然后按照以下说明进行操作。这些说明适用于 Mac/Linux OS,如有必要,请将其调整为 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
经过进一步调查,我发现如果 eureka.client.fetchRegistry
为假,则不会调用 com.netflix.discovery.shared.Applications
中的各种随机播放方法,因此永远不会填充 Applications.shuffleVirtualHostNameMap
。该映射稍后用于在方法 Applications.getInstancesByVirtualHostName
中查找,然后失败。
我不明白为什么客户端会被迫下载注册表。他们可以选择每次都进行网络旅行或在必要时获得增量。
我为此开了一个issue on Github。将等待他们的回应。