Nacos Client not connected / STARTING / Timeout 排障实录

1. 问题现象

应用启动报错,核心异常包括:

  • ErrCode:-401, ErrMsg:Client not connected, current status:STARTING
  • java.util.concurrent.TimeoutException
  • Server check fail, please check server x.x.x.x ,port 9848 is available
  • 后续还出现过 port 9080 is available

应用启动链路中断在 Nacos 自动注册阶段:

  • NacosServiceRegistry.register(...)
  • AbstractAutoServiceRegistration.start(...)

2. 根因结论

这次问题不是业务代码问题,核心是 Nacos 连接配置 + 网络端口可达性

  1. application-local.yamlserver-addr 一度被写成非法值(包含 http:// 和多余文本),导致客户端连接异常。
  2. 即使 HTTP 端口可访问,Nacos 2.x 服务注册/发现依赖 gRPC 端口,若不通会报 STARTINGTimeout
  3. 防火墙/安全组未放行对应端口时,本地到 Nacos 的 TcpTestSucceeded=False
  4. 当日志提示校验 9080 时,说明当前生效的 Nacos 主端口不是 8848(可能被环境变量/启动参数覆盖为 8080,因此 gRPC 端口变成 9080)。

3. 关键知识点(Nacos 2.x)

  • 主通信端口通常是 8848
  • gRPC 端口通常是 9848(主端口 + 1000)
  • 另一个相关端口常见为 9849

如果主端口被改为 8080,则会看到客户端尝试 9080

4. 这次实际修复步骤

步骤 1:修正应用配置

文件:src/main/resources/application-local.yaml

server-addr 修正为标准格式:

spring:
  cloud:
    nacos:
      server-addr: xxxx:8848

注意:

  • 必须是 host:port
  • 不要写 http://
  • 不要夹杂任何额外文本

步骤 2:在客户端机器验证连通性(Windows)

Test-NetConnection xxxx -Port 8848
Test-NetConnection xxxx -Port 9848

如果返回 TcpTestSucceeded : False,说明网络路径未打通。

步骤 3:在 Nacos 服务器确认服务监听

ss -lntp | egrep '8848|9848|9849'

本次结果显示服务器监听正常:8848/9848/9849 都在监听。

步骤 4:放行云安全组 + 系统防火墙

需要放行 TCP 端口:

  • 8848
  • 9848
  • 9849(建议)

firewalld 示例:

firewall-cmd --permanent --add-port=8848/tcp
firewall-cmd --permanent --add-port=9848/tcp
firewall-cmd --permanent --add-port=9849/tcp
firewall-cmd --reload
firewall-cmd --list-ports

步骤 5:再次验证并重启应用

88489848 测试都为 TcpTestSucceeded : True 后,应用启动恢复正常。

5. 为什么会出现“8848 正常但仍注册失败”

因为 curl http://127.0.0.1:8848/... 仅证明了 HTTP 接口可用;
而 Spring Cloud Alibaba 的注册过程需要 Nacos gRPC 通道,如果 9848 不通,仍会失败。

6. 遇到 9080 报错时怎么处理

出现 please check ... port 9080 时,不是“多开一个随机端口”,而是要排查谁覆盖了 Nacos 主端口:

  • 配置文件
  • 环境变量:SPRING_CLOUD_NACOS_SERVER_ADDR / NACOS_SERVER_ADDR
  • JVM 参数:-Dspring.cloud.nacos.server-addr=...
  • 启动参数:--spring.cloud.nacos.server-addr=...

可临时强制指定验证:

java -jar app.jar --spring.cloud.nacos.server-addr=xxxx:8848

7. 最终结论

本次问题通过“修正 server-addr + 放行防火墙端口”解决,应用已成功启动。

可复用的最小排障顺序:

  1. 先看 server-addr 是否为纯 host:port
  2. 客户端测 8848/9848
  3. 服务端查监听 8848/9848/9849
  4. 放行安全组与防火墙
  5. 排查配置覆盖(尤其出现 9080 时)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐