Nacos 基础教程
下面是一份 超清晰、实用、成体系的 Nacos 全套知识,包括:核心概念、架构、配置中心、注册中心、集群部署、最佳实践、运维与故障排查。
Nacos = 服务注册中心 + 配置中心
阿里开源,天然适配 Spring Cloud Alibaba、Dubbo、微服务架构。
功能三件套
- 服务发现(注册中心):替代 Eureka、Consul、Zookeeper。
- 配置管理(配置中心):替代 Apollo、Spring Cloud Config。
- 动态 DNS 服务管理(不常用)
相较于 Eureka
- 支持 AP / CP 切换
- 配置中心内置(Eureka 没有)
- 权限、命名空间、分组更完善
相较于 Consul、Zookeeper
- 配置中心能力更强
- UI 管理界面更友好
- 更适合国内 Spring Cloud Alibaba 生态
相较于 Apollo
- 轻量级、部署简单
- 注册中心和配置中心二合一(Apollo 只有配置中心)
核心组件
- NamingService:服务注册 & 心跳检测
- ConfigService:读写配置 & 推送变更
- Console:管理 UI
- 集群 + MySQL:存储持久化配置与集群数据
- 应用启动 -> 向 Nacos 注册实例(IP + Port)
- 应用每 5 秒发送心跳
- Nacos 标记健康状态
- 客户端从 Nacos 拉取服务列表(支持 Push)
Nacos 支持 两种模型:
| 模式 | 特点 |
|---|---|
| AP 模式(默认) | 更高可用,适合注册中心 |
| CP 模式 | 数据一致性强,适合配置中心 |
通过配置可切:
spring.cloud.nacos.discovery.ephemeral=false
| 类型 | 心跳 | 适用场景 |
|---|---|---|
| 临时实例(ephemeral=true) | 心跳丢失自动下线 | 微服务、Pod |
| 永久实例(ephemeral=false) | 无心跳 | 容器外固定服务 |
支持:
- clusterName
- weight(负载均衡用)
- metadata(路由标签)
- group
- namespace
Spring Cloud 中:
spring.cloud.nacos.discovery.cluster-name=HZ
spring.cloud.nacos.discovery.metadata.version=v1
一个配置由三部分组成:
namespace -> group -> dataId
例:
namespace:prod
group:application
dataId:myapp.yaml
修改配置后,Nacos 会自动 push 给所有客户端。
客户端无需重启,Spring Boot 自动刷新:
@RefreshScope
@ConfigurationProperties(prefix = "app")
支持:
- properties
- yaml
- json
- text
- xml
推荐统一使用 yaml。
主配置:
spring:
cloud:
nacos:
config:
extension-configs:
- data-id: redis.yaml
group: infra
refresh: true
推荐 3 节点或 5 节点集群 + MySQL 8.0。
[Client] <---> [Nacos1]
<---> [Nacos2]
<---> [Nacos3]
|
v
[MySQL]
Nacos 提供 SQL 文件:
nacos/conf/nacos-mysql.sql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8
db.user=nacos
db.password=123456
192.168.1.10:8848
192.168.1.11:8848
192.168.1.12:8848
推荐加上:
/nacos
并开启:
- keepalive
- 连接池
- 超时调优
- Pod 要设置 健康检查,避免频繁上下线
- 使用 metadata 做灰度发布(版本路由)
- 使用 clusterName 做可用区分离
- 每个应用用 独立 DataId
- 公共配置用 shared-configs
- 不要把敏感信息(password)放成明文 -> 用 KMS / Vault
| 规模 | CPU | 内存 |
|---|---|---|
| 单机 | 2C | 4G |
| 小型集群(3节点) | 4C each | 8G each |
| 中大型 | 8C+ | 16G~32G |
- JVM 设置:-Xms4g -Xmx4g
- 调大 MySQL 连接池
- Nacos 2.x 通信改为 gRPC,效率更高(无需再开太多 HTTP 连接)
- 开启鉴权 auth
- 关掉公网端口
- 权限分离 namespace、group
① “服务反复上下线”
- Pod 健康检查过于严格
- 网络抖动
- 心跳延迟
解决:
spring.cloud.nacos.discovery.heart-beat-interval=5000
spring.cloud.nacos.discovery.heart-beat-timeout=15000
② 配置刷新失败
- Network 不通
- 配置格式错误(YAML 缩进)
③ MySQL 连接被拒绝
- MySQL 权限不对
- 数据库未初始化
- 长连接过多
④ 集群节点不互通
- cluster.conf 配错 IP
- 8848 / 7848 端口未开放
查询服务
curl -X GET "127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=test-service"
发布配置
curl -X POST "127.0.0.1:8848/nacos/v1/cs/configs" \
-d "dataId=test.yaml&group=DEFAULT_GROUP&content=hello"