1. 问题现象
在服务启动过程中,出现以下异常:
1.1. Nacos 配置读取异常
[Nacos Config] config[dataId=show-prod.yaml, group=DEFAULT_GROUP] is empty
1.2. 客户端报错
Client not connected, current status: STARTING
1.3. curl 验证结果
curl /nacos/v1/cs/configs → 403 Forbidden
2. 问题影响
- 部分配置(如
show-prod.yaml)读取为空 - 导致系统配置不完整
- 应用启动失败或运行异常
3. 排查过程
3.1. 初步怀疑方向
排查过以下可能性:
- ❌ 配置文件不存在
- ❌ namespace 错误
- ❌ group 不一致
- ❌ 配置内容为空
- ❌ Spring 配置加载问题
- ❌ JDK / jar 差异
👉 均排除
3.2. 通过 curl 验证 Nacos
3.2.1. 登录接口正常
POST /nacos/v1/auth/login
✔ 能获取 accessToken
3.2.2. 配置接口异常
GET /nacos/v1/cs/configs → 403
👉 初步判断:鉴权或访问异常
3.3. 关键日志定位
应用日志:
Client not connected, current status: STARTING
👉 说明:
Nacos 客户端未成功建立连接
3.4. 网络连通性验证(关键步骤)
测试 Nacos gRPC 端口:
telnet 192.168.0.220 10825
返回:
No route to host
4. 根因分析(最终结论)
4.1. 根因
应用服务器无法访问 Nacos gRPC 端口(10825)
4.2. 原理说明(关键)
Nacos 2.x 使用双通道:
|-----------|------|-------|
| 功能 | 协议 | 端口 |
| 登录/HTTP接口 | HTTP | 9825 |
| 配置监听/同步 | gRPC | 10825 |
4.3. 问题链路
4.4. 为什么会出现"部分成功,部分失败"
- 部分配置在初始化阶段通过 HTTP 获取(可能成功)
- 部分配置依赖 gRPC 监听机制(失败)
👉 导致:
同一应用:
部分配置 success
部分配置 empty
5. 解决方案
5.1. 方案一:开放 gRPC 端口(推荐)
5.1.1. 服务器防火墙放行
firewall-cmd --add-port=10825/tcp --permanent
firewall-cmd --reload
5.1.2. 云服务器安全组放行
开放:
端口:10825
协议:TCP
来源:应用服务器IP
5.2. 方案二:验证端口监听
在 Nacos 服务器执行:
netstat -lntp | grep 10825
确保端口正常监听
5.3. 方案三(临时):关闭 RPC(不推荐)
spring:
cloud:
nacos:
config:
use-remote-sync-config: false
6. 验证结果
修复后验证:
telnet 192.168.0.220 10825
✔ 连接成功
应用启动:
Nacos Config 正常加载
不再出现 is empty
7. 经验总结
7.1. Nacos 2.x 必须同时满足:
HTTP通 + gRPC通
7.2. 常见误区
|----------------|------------------|
| 误区 | 实际 |
| curl 能通就说明正常 | ❌ 只代表 HTTP 通 |
| is empty 是配置问题 | ❌ 可能是网络/鉴权问题 |
| 403 一定是账号问题 | ❌ 也可能是 token 未携带 |
7.3. 快速排查口诀
配置 empty 先别慌
先查 403 和端口
10825 不通
一定有坑
8. 建议优化
8.1. 环境统一
- 所有环境统一 Nacos 鉴权策略
- 避免"有的开鉴权,有的不开"
8.2. 网络规范
- 明确 Nacos 必开端口:
-
- 8848 / 9825(HTTP)
- 9848 / 10825(gRPC)
8.3. 启动检查
上线前增加:
telnet nacos-ip 10825
作为健康检查项
9. 最终总结一句话
👉 本问题根因是 Nacos gRPC 端口未打通,导致客户端连接失败,从而引发配置读取异常(表现为 empty)