Nacos 入门了解

一篇"知道它是什么、什么时候用得上"的速览笔记。不做安装教程,只讲清楚 Nacos 解决的问题、核心模型和适用边界。

1 · 一句话理解

Nacos = 注册中心 + 配置中心(外加一点服务元数据管理)。

微服务多了以后有两个绕不开的麻烦:

  • 服务地址会变:实例扩容、缩容、崩溃重启,IP 和端口不固定。硬编码地址必然出事。
  • 配置散落各处:数据库连接、开关、限流阈值写在各自的配置文件里,改一次要重新打包重启一轮。

Nacos 把这两件事收拢到一个中心:谁在线由它记账,配置改了由它通知。

2 · 技术栈定位

  • 服务端:Java(Spring Boot 实现),官方发行包就是一个可执行的 Java 服务
  • 客户端:Java SDK 最成熟(Spring Cloud Alibaba / Dubbo 几乎默认搭配),另有 Go、Python、C++、Node.js 等版本,能力完整度不及 Java
  • 通信协议:HTTP + gRPC(2.x 起以 gRPC 长连接为主),协议本身与语言无关

所以它出身 Java 生态,但不是只有 Java 能接。

3 · 整体架构

图 1 \xb7 Nacos 整体架构

几个要点:

  • Nacos 不在调用链路上。消费者拿到实例列表后是直连提供者的,Nacos 只负责"告诉你有谁"。这点和网关、代理有本质区别。
  • 一致性分两套:临时实例(注册的服务实例)用 Distro 协议做最终一致,追求可用性;持久化数据(配置等)走 Raft 强一致。
  • 存储可换:默认内嵌 Derby,生产环境接 MySQL。

4 · 服务注册与发现

图 2 \xb7 服务注册与发现流程

临时实例 vs 持久实例是最容易混的一组概念:

维度 临时实例(ephemeral) 持久实例(persistent)
保活方式 客户端主动心跳 服务端主动探测
失联后 自动摘除 只标记不健康,不删除
存储 内存 落库
典型场景 弹性伸缩的微服务 固定的中间件 / 遗留服务

默认是临时实例,大多数业务服务用这个就对了。

本地缓存是关键容灾设计:客户端会把服务列表缓存到本地,Nacos 集群整体挂掉时,已经跑起来的服务仍能按最后一次的列表继续互相调用,不至于全站雪崩。

5 · 配置中心

图 3 \xb7 配置模型与动态刷新

定位一份配置需要三个坐标:

  • Namespace——环境隔离,dev / test / prod 各一个,互不可见
  • Group——业务线或用途分组,默认 DEFAULT_GROUP
  • Data ID——具体配置文件名,通常是 {服务名}-{环境}.{格式}

配置中心真正的价值在于动态刷新:改一个限流阈值、翻一个功能开关,发布后几百毫秒内所有实例生效,不用重启、不用发版。1.x 靠长轮询实现,2.x 换成 gRPC 长连接,连接数和延迟都大幅改善。

配套能力里比较实用的两个:版本历史与一键回滚(改错了能立刻退回去)、本地快照(Nacos 挂了应用还能靠上次拉到的配置启动)。

6 · 和相似组件的关系

组件 定位 和 Nacos 的差别
Eureka 纯注册中心 已停止大版本演进,无配置中心
Consul 注册 + KV 配置 Go 实现,强一致优先,Java 生态整合不如 Nacos 顺
ZooKeeper 通用协调服务 CP 模型,做注册中心偏重,运维成本高
Apollo 专业配置中心 配置治理更细致,但不做服务发现
etcd 分布式 KV K8s 的底座,偏基础设施,不面向业务开发

Nacos 的优势是一个组件覆盖两件事,且和 Spring Cloud Alibaba 开箱即合。

7 · 什么时候用得上

适合:

  • Spring Cloud / Dubbo 微服务集群,实例数量动态变化
  • 多环境、多套配置需要集中管理和灰度
  • 需要不重启就能调整的运行时开关与阈值

不必要:

  • 单体应用或只有两三个固定服务的小系统——环境变量 + 配置文件足够
  • 已经全面跑在 Kubernetes 上——K8s 自带 Service 发现和 ConfigMap,除非要跨集群或需要动态推送能力,否则重复建设
  • 纯前端 / 静态站点类项目(比如本知识库这种 Node + Rspress 架构),完全用不上

8 · 落地时要注意的坑

  • 别把 Nacos 当强一致数据库用。服务发现走 AP,短暂看到过期实例是正常的,业务侧要有重试和熔断。
  • 生产必须集群 + MySQL。单机内嵌 Derby 只适合本地试玩。
  • Namespace 一定要按环境切干净。测试配置推到生产是最典型的事故。
  • 鉴权默认是关的。早期版本存在未授权访问漏洞,务必开启鉴权且不要暴露公网。
  • 客户端与服务端版本要匹配。1.x 和 2.x 的通信模型不同,混用容易出奇怪问题。

小结:Nacos 是 Java 微服务体系里"服务在哪、配置是什么"这两个问题的标准答案。如果你的系统还没到需要动态管理几十个服务实例的规模,它就是额外的运维负担;一旦到了那个规模,它省下的力气非常可观。