Zuul部署到GCP报Load balancer无可用服务错误如何解决?
问题根因
该报错的核心触发原因是:Spring Cloud Zuul默认集成了Ribbon负载均衡组件,当路由规则中存在serviceId配置项时,Ribbon会默认从Eureka服务注册中心拉取对应服务的实例列表,你当前场景没有部署Eureka,所以Ribbon无法找到可用的服务节点,抛出对应异常。
另外你当前的YAML路由配置也存在格式错误,routes下需要先定义自定义路由名称,再配置该路由的serviceId/path/url属性。
解决方案(无需Eureka场景)
你可以从以下两个方案中选择适配你的场景:
方案一:简化配置,直接用URL固定转发(禁用Ribbon)
如果你只需要固定转发到指定目标地址,不需要负载均衡能力,可以直接调整Zuul配置,去掉serviceId配置项,仅保留path和url即可,此时Zuul会直接走HTTP客户端转发,不触发Ribbon逻辑。
修改后的配置如下:
zuul: ignoredPatterns: - /custom/** host: connect-timeout-millis: 4000 socket-timeout-millis: 4000 sensitiveHeaders: routes: rhines-route: # 自定义路由名称,可随意命名 path: /** url: ${GATEWAY_RHINES_ROUTE:http://localhost:8090} # 禁用Ribbon与Eureka的集成 ribbon: eureka: enabled: false
如果你的目标地址是GCP中K8s的Svc地址custom-index.rhines-dev.svc.cluster.local,直接把环境变量GATEWAY_RHINES_ROUTE配置为http://custom-index.rhines-dev.svc.cluster.local即可。
方案二:保留Ribbon能力,手动配置服务实例列表
如果你需要用到Ribbon的负载均衡、重试等能力,不需要Eureka的话,可以手动给指定serviceId配置实例地址:
zuul: ignoredPatterns: - /custom/** host: connect-timeout-millis: 4000 socket-timeout-millis: 4000 sensitiveHeaders: routes: rhines-route: path: /** serviceId: rhines # 禁用Eureka ribbon: eureka: enabled: false # 给serviceId为rhines的服务配置实例列表 rhines: ribbon: listOfServers: ${GATEWAY_RHINES_ROUTE:http://localhost:8090} # 可按需配置其他Ribbon参数,比如重试次数、超时时间等
额外校验点
如果修改配置后还是报错,可以排查以下两项:
- 确认GCP部署环境中,Zuul所在的Pod/VM可以正常解析并访问
custom-index.rhines-dev.svc.cluster.local,可以进入容器执行curl命令测试连通性 - 检查依赖版本兼容性,你当前使用的2.2.9.RELEASE版本的Zuul对应Spring Cloud Hoxton.SR12,需要和Spring Boot 2.3.x/2.4.x版本适配
内容的提问来源于stack exchange,提问作者Mike3355
相关产品推荐
相关产品推荐

