如果你手里维护着 Nacos 2.x,你会发现网上很多教程还停留在“打开 8848 端口,服务就能注册”的老经验,但我建议你把 9848、9849 这两个端口也一并盯死。这不是细节洁癖,而是 Nacos 从 1.x 到 2.x 最被低估的一次内部变化:内部通信协议从 HTTP 体系换成了以 gRPC 为底座的长连接体系。今天这篇就来聊聊这次演进背后做了什么取舍、客户端到服务端到底怎么握手、生产环境要改哪些配置,以及我迁移之后实际踩过的几个坑。
这篇文章适合两类人:一类是正准备把 Nacos 从 1.x 升到 2.x、但又不敢直接动手的运维和开发;另一类是已经在用 2.x、却对“为什么我明明只暴露了 8848 端口,服务却老注册不上去”感到困惑的人。读完以后,你至少能清楚判断:一个 Nacos 2.x 集群,在网络层到底需要放通哪些端口,客户端连接失败时该从哪个方向查,以及老客户端能不能继续混跑。
先说结论:Nacos 2.x 并没有彻底删掉 HTTP 接口,但服务发现和服务配置这条“数据面”的主链路已经切换到 gRPC。HTTP 在 Nacos 里更多退化为管理面、控制台以及给老客户端兜底的兼容通道。理解了这条主次关系,后面所有配置项的调整逻辑就都顺了。
1. 为什么 2.x 一定要换通信底座:HTTP 长轮询的账越算越亏
1.1 1.x 时代的 HTTP 长轮询是怎么“硬扛”海量请求的
Nacos 1.x 的客户端和服务端之间,玩的是纯 HTTP。服务注册是 POST,服务发现是 GET,配置监听是长轮询。长轮询这个机制本身并不复杂:客户端发一个带超时参数的 HTTP 请求过来,服务端如果没有数据变更,就先把连接挂住不返回,等到超时到了或者有变更再响应。
这套设计在规模不大时很优雅,因为它能显著减少空转的请求数量。比如一个配置中心有 100 个客户端在监听同一个配置,1.x 会让这些请求在服务端聚合,大家共享一次“配置有没有变”的检查,而不是各自死循环地刷新。这也是当时 Nacos 1.x 能扛住不少生产流量的原因。
但问题出在“规模上来以后”。服务注册与发现这条链路没有长轮询聚合的红利可以吃。每个实例默认 5 秒发一次心跳,假设你有 10000 个实例,光心跳就是每秒 2000 个 HTTP 请求,还没算上服务消费者的查询请求和配置监听的长连接开销。HTTP/1.1 就算开了 keep-alive,请求头、JSON 序列化、服务端线程调度,每一层都在消耗资源。
1.2 服务治理体量变大后,HTTP 的短板不在“快慢”而在“连接拆装”
很多人对 HTTP 的批评是“慢”,但 Nacos 的场景里,HTTP 真正的问题不是慢,而是“拆”。一次 HTTP 请求,再怎么精简,也要带 method、path、header、cookie 这一堆元数据;响应要经过 JSON 序列化和反序列化。如果只是低频调用还好,当调用量到每秒上万次,这种“每次请求独立封装”的开销就很可观了。
更麻烦的是,HTTP 对“服务端主动推送”这件事天然不友好。1.x 时期做配置变更通知,靠的还是长轮询返回,客户端收到响应后再立刻发起下一次请求,实际上变更通知是有延迟的。服务发现变更的推送,则用了一套 UDP 方案:服务端往客户端上报的地址上扔一个 UDP 数据包。UDP 又没有确认机制,一旦网络抖动丢包,客户端就可能一直拿着旧的服务列表,直到下一次 pull 才纠正。
我当时接手的一个老项目就是这个味道:配置更新后,总有一部分节点的配置不是即时生效,而是要等长轮询超时后下一次请求才拉到新值。排了半天,最后定位到是 UDP 推送丢了包,HTTP 长轮询又没到时间,整个变更周期被拉得很长。这是 1.x 协议栈的结构性限制,不是调调参数就能解决的。
1.3 为什么选 gRPC,而不是自己造一套私有 TCP 协议
有人可能会问:既然 HTTP 连接拆装开销大,那直接用裸 TCP 自定义一套协议不就好了?确实能解决连接复用和序列化问题,但这等于要自己搞定编解码、连接管理、流控、鉴权、负载均衡、超时重试这一整套东西,且每出一种语言的 SDK 就要移植一遍,后续维护成本极高。
gRPC 的好处,是它把底层很多事情标准化了。它基于 HTTP/2,天然支持多路复用,一条 TCP 连接上可以并发跑多个请求,不再需要为每个请求建立独立连接;它默认用 Protobuf 做序列化,序列化结果比 JSON 小不少,反序列化也更快;它还支持 stream 模式,服务端可以把数据持续往客户端推,这正好解决了配置变更和服务发现推送的痛点。
所以 Nacos 2.x 选择 gRPC 并不是追新,而是被真实业务场景逼出来的选择:连接要复用,数据要压缩,变更要能主动推,还要有多语言生态。HTTP/2 的二进制帧、头部压缩、服务端推送这些特性,刚好每一个都打在 Nacos 的痛点上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 看懂 2.x 的内部通信:两个 gRPC 端口和一条“建连-保活-推送”链路
2.1 端口规划:8848、9848、9849,偏移规则的由来
Nacos 2.x 的端口规则,是第一次接触时最容易懵的地方。默认主端口还是 88
