Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Nacos 基础教程

下面是一份 超清晰、实用、成体系的 Nacos 全套知识,包括:核心概念、架构、配置中心、注册中心、集群部署、最佳实践、运维与故障排查。

1. Nacos 是什么?

Nacos = 服务注册中心 + 配置中心

阿里开源,天然适配 Spring Cloud Alibaba、Dubbo、微服务架构。

功能三件套

  • 服务发现(注册中心):替代 Eureka、Consul、Zookeeper。
  • 配置管理(配置中心):替代 Apollo、Spring Cloud Config。
  • 动态 DNS 服务管理(不常用)

2. 为什么使用 Nacos?(优点)

相较于 Eureka

  • 支持 AP / CP 切换
  • 配置中心内置(Eureka 没有)
  • 权限、命名空间、分组更完善

相较于 Consul、Zookeeper

  • 配置中心能力更强
  • UI 管理界面更友好
  • 更适合国内 Spring Cloud Alibaba 生态

相较于 Apollo

  • 轻量级、部署简单
  • 注册中心和配置中心二合一(Apollo 只有配置中心)

3. Nacos 架构

核心组件

  • NamingService:服务注册 & 心跳检测
  • ConfigService:读写配置 & 推送变更
  • Console:管理 UI
  • 集群 + MySQL:存储持久化配置与集群数据

4. 注册中心(Naming)详解

4.1 服务注册流程

  1. 应用启动 -> 向 Nacos 注册实例(IP + Port)
  2. 应用每 5 秒发送心跳
  3. Nacos 标记健康状态
  4. 客户端从 Nacos 拉取服务列表(支持 Push)

4.2 服务发现模式

Nacos 支持 两种模型:

模式 特点
AP 模式(默认) 更高可用,适合注册中心
CP 模式 数据一致性强,适合配置中心

通过配置可切:

spring.cloud.nacos.discovery.ephemeral=false

4.3 临时实例 vs 永久实例

类型 心跳 适用场景
临时实例(ephemeral=true 心跳丢失自动下线 微服务、Pod
永久实例(ephemeral=false) 无心跳 容器外固定服务

4.4 权重、元数据、分组、命名空间

支持:

  • clusterName
  • weight(负载均衡用)
  • metadata(路由标签)
  • group
  • namespace

Spring Cloud 中:

spring.cloud.nacos.discovery.cluster-name=HZ
spring.cloud.nacos.discovery.metadata.version=v1

5. 配置中心(Config)详解

5.1 Nacos 配置对象(DataId)结构

一个配置由三部分组成:

namespace -> group -> dataId

例:

namespace:prod
group:application
dataId:myapp.yaml

5.2 配置推送机制(实时)

修改配置后,Nacos 会自动 push 给所有客户端

客户端无需重启,Spring Boot 自动刷新:

@RefreshScope
@ConfigurationProperties(prefix = "app")

5.3 配置格式

支持:

  • properties
  • yaml
  • json
  • text
  • xml

推荐统一使用 yaml

5.4 多配置文件合并

主配置:

spring:
  cloud:
    nacos:
      config:
        extension-configs:
          - data-id: redis.yaml
            group: infra
            refresh: true

6. Nacos 集群部署(生产环境)

推荐 3 节点或 5 节点集群 + MySQL 8.0

6.1 集群架构

[Client] <---> [Nacos1]  
           <---> [Nacos2]  
           <---> [Nacos3]  
                     |
                     v
                  [MySQL]

6.2 MySQL 结构初始化

Nacos 提供 SQL 文件:

nacos/conf/nacos-mysql.sql

6.3 启动时配置:application.properties

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

6.4 集群配置 cluster.conf

192.168.1.10:8848
192.168.1.11:8848
192.168.1.12:8848

6.5 反向代理(Nginx)

推荐加上:

/nacos

并开启:

  • keepalive
  • 连接池
  • 超时调优

7. Nacos 最佳实践

7.1 注册中心

  • Pod 要设置 健康检查,避免频繁上下线
  • 使用 metadata 做灰度发布(版本路由)
  • 使用 clusterName 做可用区分离

7.2 配置中心

  • 每个应用用 独立 DataId
  • 公共配置用 shared-configs
  • 不要把敏感信息(password)放成明文 -> 用 KMS / Vault

7.3 资源规划

规模 CPU 内存
单机 2C 4G
小型集群(3节点) 4C each 8G each
中大型 8C+ 16G~32G

7.4 性能优化

  • JVM 设置:-Xms4g -Xmx4g
  • 调大 MySQL 连接池
  • Nacos 2.x 通信改为 gRPC,效率更高(无需再开太多 HTTP 连接)

7.5 安全加固

  • 开启鉴权 auth
  • 关掉公网端口
  • 权限分离 namespace、group

8. Nacos 故障排查

8.1 常见问题

① “服务反复上下线”

  • 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 端口未开放

9. Nacos 相关命令(Curl)

查询服务

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"