服务注册不上了,你敲了 5 个命令排查,第 3 个就找到了:8 个高频问题的一键排

📅 2026/7/7 7:38:09 👁️ 阅读次数 📝 编程学习
服务注册不上了,你敲了 5 个命令排查,第 3 个就找到了:8 个高频问题的一键排

服务注册不上了,你敲了 5 个命令排查,第 3 个就找到了:8 个高频问题的一键排查路径


排查问题的前 30 秒,决定了你要花 30 分钟还是 3 小时

某个核心服务突然不可达。你的第一反应是什么?

“应该是网络问题。”——过了 10 分钟,不是。
“是不是注册中心挂了?”——又过了 5 分钟,8848 端口好好的。
“Nacos 日志里有异常吗?”——grep 了半天,没找到。

30 分钟过去了。还没有定位到问题。最后发现是客户端版本和 Nacos 服务端版本不兼容——客户端 1.4.2 连了 2.3.0 的服务端,HTTP 请求头格式不对,注册请求被静默丢弃了。

排查问题的速度不取决于你知道多少,而取决于你的排查顺序。这篇文章把 Nacos 生产中最常见的 8 个问题按排查顺序排列——从概率最高的开始,逐一给出一键排查命令。你不需要记住所有命令,只需要按这个顺序走。

⚠️ 本文基于 Nacos 2.3.x 排查经验。排查命令兼容 Nacos 2.0.0+,部分指标名称在 1.x 版本中不同。客户端版本问题(问题一)在 1.x→2.x 迁移场景中出现频率最高。


排查速查表:8 个问题 × 5 个命令

一票否决

一票否决

一票否决

高频

高频

中频

中频

低频但致命

服务出问题了

问题一
版本不兼容

问题二
认证失败

问题三
端口不通

问题四
心跳超时

问题五
实例被剔除

问题六
配置推送延迟

问题七
MySql连接池耗尽

问题八
JVM GC 导致无响应

curl /nacos/v1/console/server/state

检查客户端日志 token 行

telnet 8848 + telnet 9848

查看 nacos_monitor 指标

控制台→服务详情→实例列表

grep push nacos.log

SHOW PROCESSLIST + 连接数

jstat -gc + GC 日志

按 8.1 → 8.8 顺序排查。前三个是"一票否决"级——任何一个都能在 30 秒内被排除或确认。


问题一:客户端版本和服务端不兼容

概率:🔥🔥🔥🔥🔥(1.x→2.x 迁移场景下最高发)

现象:服务注册成功,但其他服务发现不到。或者直接注册失败,客户端日志报Request error: 400

根因:Nacos 1.x 使用 HTTP 协议(端口 8848),Nacos 2.x 默认使用 gRPC(端口 9848)。如果客户端是 1.x,它只往 8848 发请求,不走 9848 的 gRPC 通道。服务端 2.x 收到 1.x 客户端的请求后会做一个兼容处理——但部分元数据字段会丢失,导致服务发现不生效。

一键排查

# 1. 确认服务端版本curl-s"http://nacos:8848/nacos/v1/console/server/state"|jq.# 输出示例:# {# "version": "2.3.0",# "standalone_mode": "cluster",# "function_mode": null# }# 2. 确认客户端版本# 查看客户端 Maven/Gradle 依赖中的 nacos-client 版本# 或看客户端日志里启动时打印的版本号:grep"nacos"application.log|grep"version"

版本兼容矩阵

服务端兼容的客户端不兼容的客户端
2.3.x2.0.0+1.4.x 及以下(功能受限)
2.0.x - 2.2.x2.0.0+1.x(部分降级兼容,但推送不生效)
1.4.x1.x2.x(功能受限)

解决:客户端升级到 nacos-client 2.0.0+。如果客户端暂时无法升级,服务端加参数开启 1.x 兼容模式:

# nacos/conf/application.properties # 开启 1.x 客户端 HTTP 兼容(2.3.x 后默认关闭) nacos.core.support.upgrade.from.1x=true

问题二:认证失败但日志不明显

概率:🔥🔥🔥🔥

现象:调用 Nacos API 返回 403,日志里只有一行unknown user

根因:Nacos 2.x 认证开启后,客户端需要在spring.cloud.nacos.discovery.usernamepassword里配置正确的凭证。如果用了默认密码nacos/nacos但服务端改过,客户端注册静默失败。

一键排查

# 1. 直接在 Nacos 服务器上用默认密码试一次curl-XPOST"http://nacos:8848/nacos/v1/auth/login"\-d"username=nacos&password=nacos"# 期望返回 accessToken# 2. 如果上一步失败,确认服务端的实际密码# 连 MySQL → SELECT username FROM users;# 或检查服务端 auth.log:grep"login"/home/nacos/logs/nacos/auth.log|tail-5# 3. 确认客户端的配置# Spring Cloud Alibaba 项目检查 bootstrap.yml 或 application.yml:# spring.cloud.nacos.discovery.username# spring.cloud.nacos.discovery.password

问题三:8848 通了但 9848 没通

概率:🔥🔥🔥

现象:Nacos 控制台能打开,但服务注册失败。客户端日志报Connection refusedUNAVAILABLE

根因:Nacos 2.x 多了一个 gRPC 端口 9848。很多运维在防火墙规则里只放了 8848,没放 9848。gRPC 连接不上时客户端会尝试降级到 HTTP,但服务发现和配置推送的实时性会丢失。

一键排查

# 在客户端机器上测两个端口telnet nacos-server-ip8848telnet nacos-server-ip9848# 或者用 ncnc-zvnacos-server-ip8848nc-zvnacos-server-ip9848# 在 Nacos 服务端确认 gRPC 端口是否监听netstat-tlnp|grep9848# 应该有:tcp6 0 0 :::9848 :::* LISTEN java进程

Nacos 2.x 需要开放的端口完整列表:

端口协议作用是否必须
8848HTTP控制台 + 配置管理 API✅ 必须
9848gRPC服务发现 + 配置推送(实时)✅ 必须
9849gRPC集群内部 Raft 通信✅ 集群模式必须
7848TCPJraft 选举通信集群模式必须

问题四:心跳超时,实例在健康和不健康之间反复横跳

概率:🔥🔥🔥

现象:控制台里实例状态来回跳——健康 → 不健康 → 健康 → 不健康。

根因排序

  1. 客户端 GC 停顿超过心跳间隔。默认心跳间隔 5 秒,如果客户端 Full GC 超过 5 秒,这一轮心跳就丢了。服务端在 15 秒(3 个心跳周期)后把该实例标记为不健康。

  2. 服务端 GC 停顿。服务端 Full GC 期间无法处理心跳请求。等 GC 结束后,积压的心跳请求同时到达,服务端处理不过来。

  3. 网络抖动。机房之间偶尔丢包。

一键排查

# 1. 检查客户端 GC 情况jstat-gc<client_pid>100010# 2. 检查 Nacos 服务端心跳处理延迟curl-s"http://nacos:8848/nacos/actuator/prometheus"|grepnacos_monitor# 关注指标:# nacos_monitor{name="healthCheck"} - 健康检查处理数# nacos_monitor{name="pushCost"} - 推送耗时# 3. 调整心跳超时时间(如果确认是网络延迟导致)# 客户端配置:spring.cloud.nacos.discovery.heart-beat-interval=10000# 心跳间隔调到 10sspring.cloud.nacos.discovery.heart-beat-timeout=30000# 超时 30sspring.cloud.nacos.discovery.ip-delete-timeout=45000# 45s 后才剔除

问题五:实例被"无故"踢出

概率:🔥🔥

现象:服务列表里少了几台机器。重启客户端后自动注册回来了。

根因只有三种

  1. 客户端主动注销。应用优雅关闭时调的namingService.deregisterInstance()——这不是 bug。
  2. 主动健康检查失败。你配了 HTTP 健康检查,但/health端点返回的不是 200。
  3. 被动健康检查超时。心跳丢了 > 15 秒(默认),服务端自动剔除。

一键排查

# 1. 确认不是客户端主动注销grep"deregister"/var/log/app/application.log# 2. 确认健康检查配置# 控制台 → 服务详情 → 编辑 → 查看"健康检查方式"# 如果是 HTTP:确认你的 /health 端点能否正常访问curl-s"http://instance-ip:port/health"# 如果是 TCP:检查端口是否能在 500ms 内建立连接# 3. 看心跳日志grep"send beat"/var/log/app/application.log|tail-20

问题六:配置改了但没推到客户端

概率:🔥🔥

现象:在控制台上改了一个配置,点了发布。有的实例获取了新配置,有的还是老的。

根因

客户端版本推送机制故障点
1.xHTTP Long Polling(30s 挂起)网络超时后重新发起轮询有延迟
2.xgRPC 双向流gRPC 连接断开后会重连,重连期间漏掉推送

一键排查

# 1. 确认配置变更是否被记录grep"dataId=your-data-id"/home/nacos/logs/nacos/config.log|tail-5# 2. 在 Nacos 服务端看推送情况# 控制台 → 配置管理 → 监听查询 → 输入 dataId# 可以看到有多少实例正在监听这个配置# 3. 在客户端机器上看是否收到推送grep"refresh"/var/log/app/application.log|tail-10# 4. 如果客户端是 1.x,检查 Long Polling 超时配置# 服务端:nacos.config.longPollTimeout=30000# 单位毫秒,默认 30000

问题七:MySQL 连接池耗尽,Nacos 卡死

概率:🔥

现象:Nacos 控制台能打开,但任何操作都超时。日志里频繁出现HikariPool - Connection is not available

根因:Nacos 集群每个节点默认最大数据库连接数 20。3 节点集群就是 60 个连接。如果 MySQL 配了低连接数上限,或者有慢查询积压,连接池很快打满。

一键排查

# 1. MySQL 侧查看当前连接数mysql>SHOW PROCESSLIST;mysql>SHOW VARIABLES LIKE'max_connections';# 2. Nacos 侧查看连接池状态curl-s"http://nacos:8848/nacos/actuator/prometheus"|grephikaricp# 关注 hikaricp_connections_active 和 hikaricp_connections_pending# 3. Nacos 日志里找连接池超时grep"Connection is not available"/home/nacos/logs/nacos.log|wc-l

处理

# nacos/conf/application.properties db.pool.config.maximumPoolSize=20 # 每个节点最大连接数 db.pool.config.connectionTimeout=3000 # 获取连接超时(毫秒) db.pool.config.idleTimeout=600000 # 空闲连接最大存活时间(毫秒)

如果频繁打满,先看 MySQL 是不是有慢查询,再考虑加到 30。


问题八:JVM Full GC 导致服务端假死

概率:🔥(低频但致命)

现象:Nacos 进程还在,端口能通,但所有请求超时。控制台页面转圈。没有明显错误日志。

根因:进了 Full GC。JVM 堆内存不够了。

一键排查

# 1. 确认是否是 GC 导致jstat-gc<nacos_pid>10005# 看 FGC 列(Full GC 次数)和 FGCT 列(Full GC 总耗时)# 如果 FGCT 在持续增长 → Full GC 频繁# 2. 看 GC 日志# 前提:启动参数里加了 -Xlog:gc*tail-100/var/log/nacos/gc-*.log# 3. 看堆内存jmap-heap<nacos_pid>|head-30# 4. 临时恢复方法# 如果是单机:重启# 如果是集群:先摘掉这个节点,让其他节点扛流量,再排查

常规优化

# nacos/bin/startup.sh 的 JVM 参数JAVA_OPT="${JAVA_OPT}-server -Xms2g -Xmx2g -Xmn1g"JAVA_OPT="${JAVA_OPT}-XX:+UseG1GC -XX:MaxGCPauseMillis=200"JAVA_OPT="${JAVA_OPT}-XX:+HeapDumpOnOutOfMemoryError"JAVA_OPT="${JAVA_OPT}-XX:HeapDumpPath=/var/log/nacos/"

一张图带走:30 秒排查路径

版本 OK

端口 OK

认证 OK

状态异常

确认问题后

版本不对

端口不通

认证失败

实例被踢

GC 频繁

服务出问题
注册不上/配置推不过/发现不到

1. curl server/state
确认版本兼容

2. telnet 8848 + 9848
确认端口畅通

3. curl auth/login
确认认证通过

4. 控制台看实例列表
确认健康状态

5. jstat -gc
确认不是 GC 问题

对应问题按上面
一键排查做到底

升级客户端到 2.x
或开启 1.x 兼容

加防火墙规则
9848 TCP 入站

检查 username/password
确认 token.secret.key

查心跳配置
查健康检查方式

调 JVM -Xmx
加 GC 日志

截图保存。按 1→2→3→4→5 顺序排查,每个节点右边的"确认问题后"是直接跳转定位到上面具体问题的解法。


你们遇到过最离谱的 Nacos 问题是什么?评论区留数字:1=版本不兼容 2=防火墙端口 3=认证失败 4=心跳反复横跳 5=配置推送延迟 6=MySQL 连接池 7=GC 假死 8=其他(评论区说说)。