文档目录

问题说明

本文用于排查Gateway本身可以访问,但访问Portal、VM或其他业务API时返回503、无可用服务实例或LoadBalancer服务发现失败的问题。该场景重点检查Nacos注册发现,不重复处理外部8100端口本身的连通性问题。

现象

  • Gateway端口可连接,但访问/portal/...、/vm/...或其他业务路由返回HTTP 503。
  • 错误信息包含“No servers available”、no available service instance、LoadBalancer或服务发现超时。
  • 目标服务进程看似运行,但在Nacos中不存在、处于不健康/禁用状态,或注册IP和端口不可访问。
  • Gateway与目标服务使用不同Nacos地址、命名空间或服务名,导致目标服务对Gateway不可见。

适用环境

  • 产品:ZCenter
  • 版本:5.1.0
  • 组件:Spring Cloud Gateway、Spring Cloud LoadBalancer、Nacos及目标业务服务
  • 部署形态:单节点、多节点或容器部署

可能原因

  • Nacos不可访问、认证失败或目标服务未注册。
  • 目标业务服务未启动、处于starting或exited状态,导致Nacos中没有可用实例。
  • Gateway和目标服务的Nacos地址、命名空间、分组不一致。
  • 服务注册名与Gateway路由期望的服务名不一致,例如Gateway的/portal/**路由对应app-portal。
  • 注册实例的IP、端口错误,或容器内注册了其他网络命名空间不可达的地址。
  • 实例虽然存在,但健康状态为false、enabled为false或已过期。
  • 请求路径不正确;Gateway会去除第一段路径后再转发,例如/portal/v4/pub/login转发为目标服务的/v4/pub/login。

排查步骤

路由映射参考

Gateway路径Nacos服务名
/portal/**app-portal
/base/**app-base
/vm/**app-vm
/rds/**app-rds
/oss/**app-oss
/container/**app-container
/security/**app-security

1. 确认是否为服务发现故障

  • 命令:
  curl -i --max-time 10 http://<gateway-host>:8200/portal/v4/pub/login
  • 预期结果:返回参数校验或认证类应用响应,说明路由和目标服务基本可达。
  • 异常处理:如果是503并包含服务实例相关信息,继续检查Nacos;如果是TCP拒绝或超时,先按端口和进程问题排查。
  • 注意:Gateway配置会对/actuator/**返回404,不能把Gateway的Actuator 404直接判定为Nacos故障。

2. 确认失败路径对应的服务名

  • 检查项:根据Gateway配置将请求路径映射到Nacos服务名,并确认第一段路径会被StripPrefix移除。
  • 示例:/portal/v4/pub/login应查找app-portal,目标服务实际接收/v4/pub/login。
  • 异常处理:路径前缀或服务名不匹配时修正调用路径或部署配置,不要修改Nacos实例来适配错误路径。

3. 检查目标模块服务是否启动

  • 命令:
  docker ps -a
  docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
  • 检查项:根据失败路径确认对应模块容器,例如app-portal对应Portal,app-vm对应VM服务;重点查看容器状态和重启次数。
  • 预期结果:对应服务容器处于Up或稳定运行状态,未持续重启,且服务已监听预期端口。
  • 异常处理:
  • 容器状态为starting:等待其完成启动后重新检查;如果长时间保持starting,查看容器健康检查配置和启动日志。
  • 容器状态为exited:查看退出码和日志,确认是否由数据库、Redis、RabbitMQ、Nacos、配置错误或资源不足导致服务未启动。
  • 如果服务未启动、持续starting或exited,不要继续修改Nacos实例;需要进一步判断服务启动失败的具体原因,必要时联系售后处理。
  • 进一步检查命令:
  docker inspect <container-name>
  docker logs --since 2h <container-name>

4. 检查Gateway和目标服务的有效Nacos配置

  • 检查项:Nacos地址、用户名、密码、namespace、group、服务名、注册IP和端口。
  • 预期结果:Gateway和目标服务连接同一Nacos服务端,并使用一致的命名空间和分组;目标服务服务名与路由表一致。
  • 异常处理:重点检查多主机/容器中使用localhost的情况,localhost可能指向当前容器而不是Nacos主机;修正运行时配置后按部署规范重启受影响服务。

5. 查询Nacos实例

  • 只读查询示例:
  curl -G --max-time 10 \
    'http://<nacos-host>:8848/nacos/v1/ns/instance/list' \
    --data-urlencode 'serviceName=app-portal' \
    --data-urlencode 'namespaceId=<effective-namespace>' \
    --data-urlencode 'groupName=DEFAULT_GROUP' \
    --data-urlencode 'healthy=true' \
    --data-urlencode 'enabled=true'
  • 预期结果:返回至少一个健康且启用的实例,IP和端口为实际可访问地址。
  • 异常处理:返回空列表时检查服务是否注册到相同namespace/group;实例不健康时查看目标服务启动日志和Nacos心跳;API格式不兼容时使用现场Nacos控制台等价只读查询。

6. 直接测试目标实例

  • 命令:
  curl -i --max-time 10 http://<instance-ip>:<instance-port>/v4/pub/login
  • 预期结果:目标实例返回应用层响应。
  • 异常处理:实例直连失败时检查目标服务监听地址、注册端口、容器网络和防火墙;实例直连成功而Gateway仍503时,回到namespace、group、服务名和Gateway有效配置检查。

7. 检查日志和实例稳定性

  • Gateway日志建议搜索:Nacos、LoadBalancer、No servers available、no available service instance、Connection refused、timeout。
  • 目标服务日志建议搜索:register、registered、namespace、serviceName、启动失败和端口绑定错误。
  • 预期结果:目标服务完成注册,Gateway不再报告无可用实例。
  • 异常处理:注册后很快消失时检查实例心跳、服务进程是否反复重启和健康检查状态。

8. 收集支持信息

  • 失败请求URL、HTTP状态码、请求时间和Gateway日志。
  • Gateway与目标服务的有效Nacos配置,密码脱敏。
  • Nacos namespace、group、服务名、实例IP/端口、健康/启用状态。
  • 目标实例直连结果及服务进程/容器状态。
  • 容器名称、镜像版本、状态、退出码、健康检查结果和故障时间窗口内的容器日志,提交售后时需对敏感配置脱敏。

处理方式

  1. 恢复Nacos可用性和认证配置,确保Gateway及目标服务可连接Nacos。
  2. 统一Gateway和目标服务的地址、namespace、group和服务名。
  3. 修正Nacos中的注册IP和端口,使其从Gateway所在网络可达。
  4. 目标服务未启动或处于starting/exited状态时,根据容器日志处理依赖、配置、资源或健康检查问题;无法确认原因时,保留现场信息并联系售后处理。
  5. 目标服务恢复后确认其重新注册到Nacos;不要先修改Gateway所有路由。
  6. 不要通过对外暴露所有内部服务端口绕过Gateway服务发现。

验证方法

  • Nacos验证:目标服务在Gateway使用的namespace/group下存在健康、启用实例。
  • 服务验证:docker ps -a显示目标模块服务稳定运行,状态不再为starting、exited或持续重启。
  • 直连验证:每个注册实例的IP和端口可返回应用层响应。
  • Gateway验证:原失败路由不再返回503,且返回正常的业务响应或参数校验响应。
  • 多路由验证:至少验证一个未受影响路由和原失败路由。
  • 日志验证:完整请求周期内不再出现无可用实例、服务发现超时或注册失败。

风险与回滚

  • 修改namespace、group、服务名或注册IP会影响服务发现,操作前记录变更前配置。
  • 不要删除Nacos中的全部实例或批量修改其他服务注册信息。
  • 配置变更异常时恢复原运行时配置,并只重启受影响服务。

补充信息

Gateway返回503且提示无可用服务实例,如何排查? | 故障排查 · KB | ZStack 资源中心