问题说明
本文用于排查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/端口、健康/启用状态。
- 目标实例直连结果及服务进程/容器状态。
- 容器名称、镜像版本、状态、退出码、健康检查结果和故障时间窗口内的容器日志,提交售后时需对敏感配置脱敏。
处理方式
- 恢复Nacos可用性和认证配置,确保Gateway及目标服务可连接Nacos。
- 统一Gateway和目标服务的地址、namespace、group和服务名。
- 修正Nacos中的注册IP和端口,使其从Gateway所在网络可达。
- 目标服务未启动或处于
starting/exited状态时,根据容器日志处理依赖、配置、资源或健康检查问题;无法确认原因时,保留现场信息并联系售后处理。 - 目标服务恢复后确认其重新注册到Nacos;不要先修改Gateway所有路由。
- 不要通过对外暴露所有内部服务端口绕过Gateway服务发现。
验证方法
- Nacos验证:目标服务在Gateway使用的namespace/group下存在健康、启用实例。
- 服务验证:
docker ps -a显示目标模块服务稳定运行,状态不再为starting、exited或持续重启。 - 直连验证:每个注册实例的IP和端口可返回应用层响应。
- Gateway验证:原失败路由不再返回503,且返回正常的业务响应或参数校验响应。
- 多路由验证:至少验证一个未受影响路由和原失败路由。
- 日志验证:完整请求周期内不再出现无可用实例、服务发现超时或注册失败。
风险与回滚
- 修改namespace、group、服务名或注册IP会影响服务发现,操作前记录变更前配置。
- 不要删除Nacos中的全部实例或批量修改其他服务注册信息。
- 配置变更异常时恢复原运行时配置,并只重启受影响服务。
补充信息
- 外部8100与Gateway8200的端口关系参见:ZCenter 部署或访问因端口未放通失败,如何排查?。
- Gateway的
/actuator/**路径被配置为404,健康检查应使用目标服务直接地址或现场明确配置的探针地址。
