Spring Boot 启动时报错:NacosException: Client not connected, current status: STARTING 排查与解决

发布于 8 天前  35 次阅读



1. 问题背景

在一次部署 Spring Boot 应用时,应用启动过程中报错:

NacosException: Client not connected, current status: STARTING

应用启动失败,完整堆栈显示问题发生在 Spring Cloud Alibaba 进行服务注册的过程中,调用了 Nacos 客户端 NacosServiceRegistry.register() 方法时,客户端连接状态依然处于 STARTING


2. 环境信息

  • JDK:1.8.0_401
  • Spring Boot:2.6.13
  • Spring Cloud:2021.0.8
  • Spring Cloud Alibaba:2021.0.6.2
  • Nacos 服务端:2.3.2

3. 初步排查

根据 Nacos 官网文档,Nacos 2.x 相较 1.x 增加了 9848、9849 两个 RPC 通信端口:

  • 9848:gRPC 请求端口
  • 9849:gRPC 响应端口

如果服务端防火墙没有放行,或者 Docker 中没有映射出来,客户端可能无法完成注册。

因此第一步我检查了:

  1. 服务器防火墙是否放行了 8848、9848、9849 端口;
  2. Docker 部署环境中端口是否映射到宿主机。

结论:端口配置无误,防火墙也已放行,问题依旧。


4. 关键线索

在启动 Nacos 服务端时,日志中出现了两条警告:

2025-08-08 21:36:21,621 WARN InetAddress.getLocalHost().getHostName() took 10044 milliseconds to respond. Please verify your network configuration.

2025-08-08 21:36:31,664 WARN ManagementFactory.getRuntimeMXBean().getName() took 10042 milliseconds to respond. This may be due to slow host name resolution. Please verify your network configuration.

这意味着:

  • 获取主机名 InetAddress.getLocalHost().getHostName() 耗时 10 秒以上
  • 获取 JVM 运行时信息 ManagementFactory.getRuntimeMXBean().getName() 也同样耗时

这两个操作在 Nacos 服务端和客户端启动时都会被调用,如果主机名解析很慢,就会导致 Nacos 连接迟迟无法建立,客户端状态一直卡在 STARTING


5. 深入分析

Nacos 客户端启动时,会执行以下步骤:

  1. 获取本机 HostName 和 IP
  2. 建立与 Nacos 服务端的 gRPC 连接(9848/9849)
  3. 向服务端注册实例

如果第一步耗时过长(比如 10 秒),客户端与服务端的握手延迟就会很大,甚至超时。

造成主机名解析慢的常见原因:

  • 主机名未配置本地解析,系统只能去 DNS 查询
  • DNS 服务器不可用或延迟高
  • 反向 DNS 查询超时

我的环境执行:

hostname

输出:

jx-tzpsapplication.novalocal

这是云环境(如 OpenStack)常见的主机名格式,但在 DNS 中并没有对应解析记录。


6. 解决方案

给主机名添加本地解析映射,避免 DNS 查询:

编辑 /etc/hosts

vi /etc/hosts

添加一行(127.0.0.1 或本机内网 IP 均可):

127.0.0.1   jx-tzpsapplication.novalocal jx-tzpsapplication

保存后,无需重启系统,只需重启应用。


7. 验证

修改 /etc/hosts 后,重新测试:

time hostname
time ping -c 1 jx-tzpsapplication.novalocal

结果均为毫秒级返回。

再次启动 Spring Boot 应用,Nacos 客户端能够在极短时间内完成连接与注册,Client not connected, current status: STARTING 错误消失。


8. 总结

这个问题表面看是 Nacos 2.x 端口防火墙版本兼容,实际上是 主机名解析延迟 导致 Nacos 连接超时。

经验总结

  • Nacos 客户端启动慢,不一定是端口问题,先观察启动日志是否有主机名解析耗时警告
  • 在云主机、Docker、K8s 环境中,建议显式配置 /etc/hosts 避免 DNS 解析依赖外部网络
  • Nacos 2.x 的 RPC 端口必须放行,但即便端口没问题,主机名解析慢同样会让注册失败

如果你也遇到类似 Client not connected, current status: STARTING 的问题,不妨先确认主机名解析速度,很多时候这是被忽略的关键瓶颈。


个人博客,用于记录工作日常的问题。