1. Nacos 在分布式架构里的定位与核心价值
先聊点实在的。这两年跟微服务打交道的人,大概率都绕不开 Nacos 这个名字。不管你是用 Spring Cloud Alibaba 还是 Dubbo,只要系统拆成了多个服务,就一定会遇到两个问题:服务之间怎么找到对方?配置改了怎么让所有实例同时生效?
Nacos 解决的就是这两件事,它既是注册中心又是配置中心。注册中心解决“服务发现”的问题,配置中心解决“配置管理”的问题。一个组件包办两件事,这也是它跟 Eureka、Consul 相比最大的差异化优势。
我在项目里见过不少团队,一开始只用它做注册中心,配置还在用本地 application.yml 配合 Git 版本管理。结果每次改配置都要经历“改文件、提交、发版、重启”四部曲,碰上紧急故障要调参数,整个人都是崩溃的。后来把配置也挪到 Nacos 上,才算真正体会到什么叫“配置热更新”。
对刚接触分布式的人而言,Nacos 是一个特别适合作为“第一个分布式组件”来学的项目。因为它的安装部署足够简单,逻辑功能足够清晰,而且代码层面用了很多 Java 分布式领域的经典设计思路,读源码能学到不少东西。
这篇文章我会从部署方案、功能逻辑、代码接入、内部机制四个维度展开,最后再分享一些我在实际排障过程中积累的经验。不管你是准备第一次在项目里引入 Nacos,还是已经在用了但想搞清楚它内部到底怎么运作的,这篇文章都值得看完。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 配置部署实战:从单机到集群的完整落地
2.1 单机部署:5 分钟跑起来
先说说最简单的情况,本地开发环境,单机跑一个 Nacos 就够了。
Nacos 的下载方式有两种,一种是直接去 GitHub Releases 页面下载编译好的压缩包,另一种是拉源码自己打包。本地开发建议直接下编译好的包,省时间。下载完解压后,目录结构大概是这样的:
code复制nacos/
├── bin/
│ ├── startup.sh
│ ├── startup.cmd
│ └── shutdown.sh
├── conf/
│ ├── application.properties
│ └── nacos-mysql.sql
├── data/
└── logs/
启动之前先想一个问题:Nacos 默认用的是内嵌数据库 Derby,还是需要自己装 MySQL?
我的建议是,生产环境一定用 MySQL,本地开发如果只是想快速看一眼效果,用默认的 Derby 也行。但如果你打算深入使用,最好一开始就接 MySQL,免得后期数据迁移折腾。
启动命令很简单,Linux 环境:
bash复制cd nacos/bin
./startup.sh -m standalone
Windows 环境:
batch复制startup.cmd -m standalone
启动成功后,浏览器访问 http://localhost:8848/nacos,默认账号密码都是 nacos/nacos。这里注意一点,Nacos 2.x 默认的控制台端口是 8080,但服务端口是 8848。如果你发现访问 8848 是通的,但控制台打不开,八成是 8080 端口被占用或者没放行。
我在本地第一次启动时还遇到过一个问题:启动脚本显示成功了,但进程一直在重启。看日志发现是端口被别的服务占了。这个等下在问题排查部分细说。
2.2 使用 Docker 快速部署
不少团队现在习惯用 Docker 来管理中间件,Nacos 官方也提供了镜像,用起来很方便。
先创建一个自定义网络,让 Nacos 和 MySQL 能互相通信:
bash复制docker network create nacos_network
然后启动 MySQL 容器,Nacos 需要 MySQL 8.x 版本,注意初始化数据库文件要先准备:
bash复制docker run -d \
--name nacos-mysql \
--network nacos_network \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=nacos_config \
-p 3306:3306 \
mysql:8.0
启动 Nacos 容器,指定 MySQL 地址:
bash复制docker run -d \
--name nacos-server \
--network nacos_network \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=nacos-mysql \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root123 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
nacos/nacos-server:v2.3.2
这里要特别提醒一个点:很多人在用 Docker 部署 Nacos 时只映射了 8848 端口,结果客户端连接时报错或者不稳定。这是因为 Nacos 2.x 版本开始,客户端和服务端通信不仅仅走 8848,还需要 9848(gRPC 端口)和 9849(gRPC 服务端间通信端口)。端口映射不全,服务注册发现能通,但配置订阅和心跳检测会出问题。
2.3 集群部署:高可用的最小可用方案
生产环境用单机版是找死,这个不用多说。Nacos 集群部署的官方推荐方案是“三节点 Nacos + MySQL 主从”,架构大概是这样:
- 3 个 Nacos 节点组成集群,节点之间通过 Raft 协议选主
- 配置数据和注册数据都持久化到 MySQL
- MySQL 做主从备份,防止单点数据库挂掉
Nacos 集群部署的核心是集群节点配置。在 conf/cluster.conf 文件中,每行写一个节点 IP:port:
code复制192.168.1.11:8848
192.168.1.12:8848
192.168.1.13:8848
注意这里有个历史坑:老版本的 cluster.conf 是支持写主机名的,但某些版本对主机名解析有 bug,导致节点之间无法通信。我的建议是直接写 IP,别写主机名,省得踩坑。
然后修改 conf/application.properties,配置数据源:
properti复制
