一、问题现象

最近部署微服务项目时,遇到了一个非常隐蔽的坑:我的 CartApplication 服务启动直接报错退出,日志里疯狂报 Nacos 服务注册超时 / 连接失败,但奇怪的是:

  • ✅ Nacos 控制台 http://192.168.100.128:8848/nacos 能正常访问,账号密码登录完全没问题
  • ❌ 应用启动时一直报错,无法完成服务注册,直接退出进程
  • ❌ 客户端 telnet 192.168.100.128 8848 能通,但 telnet 192.168.100.128 9848 直接超时

二、根本原因:Nacos 2.x 通信机制变化

很多人都知道 Nacos 1.x 的端口,但 Nacos 2.x 升级后,通信机制做了大改动,新增了gRPC 通信端口

Nacos 2.x 端口用途对照表:

表格

端口 用途 我的状态
8848 HTTP API / 控制台页面、配置中心 ✅ 已开放,能正常访问
9848 gRPC 客户端通信端口(服务注册 / 发现、心跳发送、配置变更推送) ❌ 被防火墙拦截,客户端连不上
9849 gRPC 集群通信端口(节点间同步、选举) ❌ 被防火墙拦截

⚠️ 划重点:客户端服务注册、定时心跳都是通过 9848 端口的 gRPC 协议 完成的,不是 8848!这个端口不通,服务就注册不到 Nacos 上,应用直接报错退出。


三、解决方案:开放防火墙端口

我的环境是 CentOS 7 虚拟机,直接执行下面的命令,1 分钟搞定:

1. 开放 Nacos 2.x 的关键端口

# 开放gRPC客户端通信端口(9848)
firewall-cmd --zone=public --add-port=9848/tcp --permanent

# 开放gRPC集群通信端口(9849,单机模式也建议开放)
firewall-cmd --zone=public --add-port=9849/tcp --permanent

# 重载防火墙配置,让端口规则生效
firewall-cmd --reload

2. 验证端口是否开放成功

# 查看已开放的端口列表,确认9848/9849在列表中
firewall-cmd --list-ports

看到输出里包含 9848/tcp9849/tcp 就说明配置成功了。

3. 客户端测试端口连通性

在你的开发机 / 其他服务器上执行 telnet 命令,测试端口是否能通:

telnet 192.168.100.128 9848

如果能正常进入 telnet 交互界面,说明端口已经通了。

更多推荐