Nacos 微服务注册与配置中心深度学习指南
版本 : v1.0 | 日期 : 2026-06-04 | 实验集群 : ecs-827b (华为云香港)
Nacos : 2.5.2 | Spring Boot : 3.3.x | JDK : 17 | MySQL: 8.0
目录
- 1.1 什么是 Nacos?
- 1.2 为什么需要 Nacos?
- 1.3 核心架构组件
- 2.1 前期准备
- 2.2 版本选择与下载
- 上机实战篇 ⭐
- 3.1 Nacos Server 单机部署
- 3.2 数据库配置实战
- 3.3 服务注册与发现实战
- 3.4 配置中心实战
- 3.5 高级功能实战
- 3.6 集群部署实战
- 3.7 权限管理实战
- 3.8 真实云环境部署验证
- 4.1 性能优化
- 4.2 监控告警
- 4.3 安全加固
1. 基础认知篇
1.1 什么是 Nacos?
Nacos(Na ming and Co nfiguration S ervice)是阿里巴巴于 2018 年开源的微服务基础设施,核心定位是服务注册发现 (Service Registry & Discovery)与配置管理(Configuration Management)一体化平台。
名字来源于 Naming 的前两个字母 + Configuration 的前两个字母 + Service 的首字母,简洁地概括了它的三大核心能力。
┌─────────────────────────────────────────────────────────────────┐
│ Nacos 生态全景图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Spring │ │ Spring │ │ Dubbo │ ← 框架层 │
│ │ Cloud │ │ Boot │ │ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └───────────────┼───────────────┘ │
│ │ │
│ ┌─────────▼──────────┐ │
│ │ Spring Cloud │ │
│ │ Alibaba │ ← 适配层 │
│ └─────────┬──────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Nacos │ │ Sentinel │ │ RocketMQ │ ← 中间件层 │
│ │ 注册+配置│ │ 流量防护 │ │ 消息队列 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Spring Cloud Alibaba Stack │ ← 全家桶 │
│ │ Nacos ▸ Sentinel ▸ Seata ▸ RocketMQ │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
核心能力一览表:
| 能力 | 说明 | 对标产品 |
|---|---|---|
| 服务注册发现 (Service Registry & Discovery) | 服务实例自动注册、心跳保活、健康检查、负载均衡 | Eureka, Consul, Zookeeper |
| 配置中心 (Configuration Center) | 配置集中管理、动态推送、版本回滚、灰度发布 | Apollo, Spring Cloud Config |
| DNS 服务 (DNS Service) | 支持 DNS-Based 服务发现,兼容传统架构 | CoreDNS, Consul DNS |
| 动态 DNS 服务 (Dynamic DNS Service) | 权重路由、流量管理、弹性伸缩 | - |
1.2 为什么需要 Nacos?
微服务架构的 3 大痛点
┌─────────────────────────────────────────────────────────────────────┐
│ 痛点 1: 服务地址硬编码 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 传统方式 (坏味道): │
│ ┌─────────────┐ http://10.0.1.5:8080/api ┌─────────────┐ │
│ │ 订单服务 │ ──────────────────────────────→ │ 商品服务 │ │
│ │ Order │ │ Product │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ 问题: 商品服务扩容到 10.0.1.6 → 所有调用方都得改代码重启 │
│ │
│ 用 Nacos 后: │
│ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 订单服务 │ ── 查询 service-product ─→│ Nacos 注册中心 │ │
│ │ Order │ ←── 返回 IP 列表 ─────────│ │ │
│ └─────────────┘ └─────────────────────┘ │
│ │ │
│ ┌────────────────┼──────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌─────┐ │
│ │Product-1 │ │Product-2 │ │ ... │ │
│ │.5:8080 │ │.6:8080 │ │ │ │
│ └──────────┘ └──────────┘ └─────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 痛点 2: 配置分散管理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 传统方式: │
│ 每个服务自己的 application.yml 中硬编码 │
│ → 改一个 DB 密码要改 N 个服务、重启 N 个服务 │
│ │
│ 用 Nacos 后: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Nacos 配置中心 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ common-config.yaml (共享配置) │ │ │
│ │ │ db.url=jdbc:mysql://... │ │ │
│ │ │ db.password=encrypted_xxx │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └──────────────────────┬──────────────────────────────┘ │
│ │ 一次修改, 所有服务自动感知 │
│ ┌─────────────────┼─────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Order │ │ Product │ │ Payment │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 痛点 3: 服务治理复杂性 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 微服务规模化后必答题: │
│ ├── 服务上线/下线如何无感切换? │
│ ├── 服务健康状态如何实时感知? │
│ ├── 灰度发布如何控制流量? │
│ ├── 多环境 (dev/test/staging/prod) 如何隔离? │
│ └── 50+ 个微服务如何可视化拓扑? │
│ │
│ → Nacos 用注册中心 + 配置中心 + 控制台 三位一体统一解决 │
│ │
└─────────────────────────────────────────────────────────────────────┘
Nacos vs 竞品对比
| 维度 | Nacos | Eureka | Consul | Apollo | Zookeeper |
|---|---|---|---|---|---|
| 服务发现 | ✅ CAP | ✅ AP | ✅ CP/AP | ❌ | ✅ CP |
| 配置中心 | ✅ | ❌ | ✅ KV | ✅ 专业 | ❌ (需自建) |
| 健康检查 | TCP/HTTP/MySQL | HTTP | Script/HTTP/TCP | - | TCP |
| 动态配置 | ✅ 实时推送 | ❌ | ✅ Long Polling | ✅ 实时推送 | ❌ |
| 控制台 | ✅ 功能丰富 | ✅ 基础 | ✅ Web UI | ✅ 功能丰富 | ❌ |
| 一致性协议 | Distro (AP) + Raft (CP) | - | Raft | - | ZAB |
| 多数据中心 | ✅ | ✅ | ✅ | ❌ | ❌ |
| Spring Cloud | 原生集成 | 原生集成 | 需适配 | 需适配 | 需适配 |
| Dubbo 支持 | ✅ 首选 | ❌ | ❌ | ❌ | ✅ |
| 开源方 | 阿里巴巴 | Netflix(停更) | HashiCorp | 携程 | Apache |
| Lang | Java | Java | Go | Java | Java |
| 部署依赖 | 可选 MySQL | 无 | 无 | MySQL | 无 |
关键结论: 如果你用 Spring Cloud Alibaba 或 Dubbo 技术栈,Nacos 是唯一的一体化选择。它同时替代了 Eureka + Spring Cloud Config,减少运维组件数量。
1.3 核心架构组件
┌─────────────────────────────────────────────────────────────────────────┐
│ Nacos 核心架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Nacos Console (控制台) │ │
│ │ :8848/nacos → 服务列表 | 配置列表 | 权限管理 | 命名空间 │ │
│ └──────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────┼──────────────────────────────────┐ │
│ │ 核心服务层 │ │
│ │ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │ │
│ │ │ Naming Service │ │ Config Service │ │ Auth Service │ │ │
│ │ │ (注册中心) │ │ (配置中心) │ │ (认证鉴权) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ • 服务注册/注销 │ │ • 配置发布/获取 │ │ • Token 认证 │ │ │
│ │ │ • 心跳检测/剔除 │ │ • 配置监听/推送 │ │ • RBAC 授权 │ │ │
│ │ │ • 实例元数据管理 │ │ • 配置版本管理 │ │ • 命名空间隔离 │ │ │
│ │ │ • 权重路由 │ │ • 灰度发布 │ │ │ │ │
│ │ └────────┬─────────┘ └────────┬─────────┘ └────────────────┘ │ │
│ │ │ │ │ │
│ └───────────┼─────────────────────┼─────────────────────────────────┘ │
│ │ │ │
│ ┌───────────┼─────────────────────┼─────────────────────────────────┐ │
│ │ ▼ ▼ │ │
│ │ ┌────────────────────────────────────────────────────────────┐ │ │
│ │ │ 一致性协议层 │ │ │
│ │ │ │ │ │
│ │ │ Distro 协议 (AP 模式) JRaft 协议 (CP 模式) │ │ │
│ │ │ ┌───────────────────┐ ┌───────────────────┐ │ │ │
│ │ │ │ 临时实例注册发现 │ │ 持久实例元数据 │ │ │ │
│ │ │ │ 最终一致性 │ │ 配置强一致性 │ │ │ │
│ │ │ │ 自行研发的去中心化 │ │ 基于 Raft 算法 │ │ │ │
│ │ │ └───────────────────┘ └───────────────────┘ │ │ │
│ │ └────────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 存储层 (持久化) │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ 内嵌 Derby│ │ MySQL │ │ 本地文件 │ │ 外部缓存 │ │ │
│ │ │ (默认) │ │ (推荐) │ │ (快照) │ │ (可选) │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
关键设计理念:
| 组件 | 协议 | 一致性模型 | 适用场景 |
|---|---|---|---|
| Naming Service (注册中心) | Distro (自研) | AP (最终一致) | 临时实例的心跳/注册/发现,优先保证可用性 |
| Config Service (配置中心) | JRaft (Raft 变体) | CP (强一致) | 配置数据不能丢,优先保证一致性 |
| Auth Service (认证鉴权) | - | - | Token 认证 + RBAC 角色权限模型 |
Distro vs JRaft 的本质区别: 注册中心的数据是"活"的------实例挂了这个数据就没意义了,所以用 AP 模型保证高可用;配置中心的数据是"死"的------一条配置值不能搞丢搞错,所以用 CP 模型保证强一致。
2. 环境准备篇
2.1 前期准备
2.1.1 硬件与环境清单
| 检查项 | 最低要求 | 推荐配置 | 本实验配置 |
|---|---|---|---|
| CPU | 2 Core | 4 Core | 2 vCPU (c6.large.2) |
| 内存 | 2 GiB | 8 GiB | 4 GiB |
| 磁盘 | 20 GB | 40 GB | 40 GB |
| OS | Linux/Windows/Mac | Ubuntu 20.04+ | Ubuntu 24.04 |
| JDK | 8+ | 17 | 17 |
| Maven | 3.6+ | 3.8+ | 3.8.7 |
| MySQL | 5.7+ (可选) | 8.0 | 8.0 |
2.1.2 实验集群拓扑
本博客基于华为云香港区域 4 台 ECS (ecs-827b 集群) 进行真实部署:
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos 集群部署拓扑 (ecs-827b) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 用户/开发者 │
│ │ │
│ │ http://119.8.106.88:8848/nacos │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Nginx (可选, 反向代理) │ │
│ │ listen :8848 → upstream 3 节点 │ │
│ └──────┬──────────────┬──────────────┬──────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ nacos-01 │ │ nacos-02 │ │ nacos-03 │ ← Nacos 集群节点 │
│ │ Leader │ │ Follower │ │ Follower │ │
│ │ :8848 │ │ :8848 │ │ :8848 │ │
│ │ 119.8...88 │ │ 49.0..233 │ │159.138..92 │ │
│ │192.168.0.190│ │192.168.0.194│ │192.168.0.102│ │
│ └──────┬─────┘ └──────┬─────┘ └──────┬─────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ MySQL 8.0 │ ← 共享数据库 (nacos-01 上) │
│ │ nacos_config │ │
│ └──────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ nacos-04 : 94.74.108.182 │ │
│ │ Spring Boot 客户端测试机 │ │
│ │ Service Provider + Service Consumer │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
服务器分配表:
| 节点 | 公网 IP | 内网 IP | 角色 | 部署组件 |
|---|---|---|---|---|
| ecs-827b-0001 | 119.8.106.88 | 192.168.0.190 | Nacos-01 | Nacos Server + MySQL 8.0 |
| ecs-827b-0002 | 49.0.241.233 | 192.168.0.194 | Nacos-02 | Nacos Server |
| ecs-827b-0003 | 159.138.156.92 | 192.168.0.102 | Nacos-03 | Nacos Server |
| ecs-827b-0004 | 94.74.108.182 | 192.168.0.164 | Client | Spring Boot 客户端 |
2.2 版本选择与下载
版本对应关系表
| Spring Cloud Alibaba | Spring Cloud | Spring Boot | Nacos Server | Nacos Client |
|---|---|---|---|---|
| 2023.0.1.x (最新) | 2023.0.x (Leyton) | 3.2.x / 3.3.x | 2.5.x | 2.5.x |
| 2022.0.0.x | 2022.0.x (Kilburn) | 3.0.x / 3.1.x | 2.2.x | 2.2.x |
| 2021.0.5.x | 2021.0.x (Jubilee) | 2.7.x | 2.1.x | 2.1.x |
| 2.2.x | Hoxton | 2.3.x / 2.2.x | 1.4.x | 1.4.x |
本实验选择: Nacos Server 2.5.2 + Spring Boot 3.3.x + Spring Cloud 2023.0.x + JDK 17
下载地址
bash
# 方式 1: GitHub Releases
https://github.com/alibaba/nacos/releases
# 方式 2: 官方下载页
https://nacos.io/download/nacos-server/
# 方式 3: 直接 wget (推荐)
wget https://github.com/alibaba/nacos/releases/download/2.5.2/nacos-server-2.5.2.tar.gz
3. 上机实战篇 ⭐
3.1 Nacos Server 单机部署 (本机快速验证)
实操1: Windows 本地安装
powershell
# 1. 下载
Invoke-WebRequest -Uri "https://github.com/alibaba/nacos/releases/download/2.5.2/nacos-server-2.5.2.zip" -OutFile "nacos-server-2.5.2.zip"
# 2. 解压
Expand-Archive nacos-server-2.5.2.zip -DestinationPath .
# 3. 单机模式启动 (Windows 默认就是 standalone, 无需改配置)
cd nacos\bin
.\startup.cmd -m standalone
# 输出示例:
# "nacos is starting with standalone"
# ,--.
# ,--.'|
# ,--,: : | Nacos 2.5.2
# ,`--.'`| ' : ,---. Running in standalone mode
# | : : | | ' ,'\ .--.--.
# : | \ | : ,--.--. ,---. / / | / / ' ...
# | : ' '; | / \ / \. ; ,. :| : /`. /
# ' ' ;. ;.--. .-. | / / '' | |: :| : ; '
# | | | \ | \__\/: . .. ' / ' | .; :: | |\ \
# ' : | ; .' ," .--.; |' ; :__| : || : |_'/
# | | '`--' / / ,. |' | '.'|\ \ / | | ,' |
# ' : | ; : .' \ : : `----' `--''
# ; |.' | , .-./\ \ /
# '---' `--`---' `----'
# 4. 访问: http://localhost:8848/nacos
# 默认账号: nacos / nacos
| 参数 | 含义 | 可选值 |
|---|---|---|
-m standalone |
Mode, 以单机模式运行 (不使用集群通信) | standalone, cluster |
-p embedded |
使用内嵌 Derby 数据库 (无需 MySQL) | embedded (默认), mysql |
-c standalone |
使用 standalone 配置模式 | standalone, cluster |
-m standalone的含义 : Mode 参数的缩写-m,指定启动模式。standalone模式下 Nacos 不会启动集群通信模块,Raft 协议也不工作,所有数据存在内嵌 Derby 中。这个模式仅用于开发和测试,绝不用于生产环境。
实操2: Linux 单机安装 (nacos-01)
bash
# === 在 nacos-01 (119.8.106.88) 上执行 ===
# 1. 安装 JDK 17
apt-get update && apt-get install -y openjdk-17-jdk-headless
java -version
# openjdk version "17.0.13" 2024-10-15
# OpenJDK Runtime Environment (build 17.0.13+11-Ubuntu-124.04)
# OpenJDK 64-Bit Server VM (build 17.0.13+11-Ubuntu-124.04, mixed mode, sharing)
# 2. 下载 Nacos 2.5.2
cd /opt
wget https://github.com/alibaba/nacos/releases/download/2.5.2/nacos-server-2.5.2.tar.gz
tar -zxvf nacos-server-2.5.2.tar.gz
mv nacos /opt/nacos
ls /opt/nacos/
# bin/ conf/ data/ derby.log LICENSE NOTICE target/
# 3. 目录结构说明
# bin/ → 启动/停止脚本
# conf/ → 配置文件 (application.properties, cluster.conf 等)
# data/ → 运行时数据 (日志, Derby 数据库文件)
# target/ → Nacos Server JAR 包
Nacos 目录结构详解:
/opt/nacos/
├── bin/
│ ├── startup.sh # Linux 启动脚本
│ ├── startup.cmd # Windows 启动脚本
│ ├── shutdown.sh # Linux 停止脚本
│ └── shutdown.cmd # Windows 停止脚本
├── conf/
│ ├── application.properties # 主配置文件 (⭐最重要)
│ ├── cluster.conf.example # 集群节点列表示例
│ ├── mysql-schema.sql # MySQL 建表 SQL
│ ├── nacos-logback.xml # 日志配置
│ └── 1.4.0-ipv6_support-update.sql # 升级辅助 SQL
├── data/ # 运行时数据
│ ├── logs/ # 运行日志
│ └── derby-data/ # 内嵌 Derby 数据 (MySQL 模式下无)
├── target/
│ └── nacos-server.jar # 核心 JAR (Spring Boot 打包)
└── work/ # Tomcat 工作目录
bash
# 4. 修改启动模式为单机
# 方法1: 编辑 startup.sh, 将 MODE 固定为 standalone
sed -i 's|export MODE="cluster"|export MODE="standalone"|' /opt/nacos/bin/startup.sh
# 方法2: 启动时指定参数 (推荐, 不修改脚本)
sh /opt/nacos/bin/startup.sh -m standalone
# 5. 验证启动
tail -f /opt/nacos/logs/start.out
# 看到以下日志表示启动成功:
# INFO Nacos started successfully in standalone mode. use embedded storage
# INFO Nacos Log files: /opt/nacos/logs
# INFO Nacos Log home: /opt/nacos/logs
# 6. 检查端口
netstat -tlnp | grep 8848
# tcp6 0 0 :::8848 :::* LISTEN 12345/java
# 7. 访问控制台
curl -s http://192.168.0.190:8848/nacos/
# 返回 HTML → 启动成功
实操3: Docker 单机部署
bash
# === 在任意节点执行 ===
# 拉取镜像
docker pull nacos/nacos-server:v2.5.2
# 单机启动
docker run -d \
--name nacos-standalone \
--restart=always \
-e MODE=standalone \
-e JVM_XMS=512m \
-e JVM_XMX=512m \
-e JVM_XMN=256m \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
nacos/nacos-server:v2.5.2
# 参数说明:
# -e MODE=standalone → 单机模式
# -e JVM_XMS=512m → JVM 初始堆内存 (Xms)
# -e JVM_XMX=512m → JVM 最大堆内存 (Xmx)
# -e JVM_XMN=256m → JVM 新生代内存 (Xmn)
# -p 8848:8848 → HTTP 主端口 (控制台 + API)
# -p 9848:9848 → gRPC 客户端端口 (Nacos 2.x 新增)
# -p 9849:9849 → gRPC 服务端端口 (集群通信)
# 查看日志
docker logs -f nacos-standalone
# 访问: http://119.8.106.88:8848/nacos
Nacos 2.x 端口变更 : 从 2.0 版本开始,Nacos 引入了 gRPC 通信协议,新增了 9848 (客户端 gRPC 请求) 和 9849 (服务端 gRPC 请求) 两个偏移端口。规则是
主端口 + 1000和主端口 + 1001。如果主端口改成了 7848,gRPC 端口就是 8848 和 8849。
3.2 数据库配置实战
实操4: MySQL 8.0 安装与初始化 (nacos-01)
bash
# === 在 nacos-01 (119.8.106.88) 上执行 ===
# 1. 安装 MySQL 8.0
apt-get install -y mysql-server-8.0
# 2. 启动并设置开机自启
systemctl enable mysql && systemctl start mysql
systemctl status mysql
# 3. 安全初始化 (设置 root 密码)
mysql_secure_installation
# → VALIDATE PASSWORD: No (开发环境)
# → New password: Nacos@2026!
# → Remove anonymous users: Yes
# → Disallow root login remotely: No
# → Remove test database: Yes
# → Reload privilege tables: Yes
# 4. 创建 Nacos 数据库
mysql -u root -p'Nacos@2026!' << 'EOF'
-- 创建数据库
CREATE DATABASE IF NOT EXISTS nacos_config
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看
SHOW DATABASES LIKE 'nacos%';
-- +-------------------------------+
-- | Database (nacos%) |
-- +-------------------------------+
-- | nacos_config |
-- +-------------------------------+
EOF
# 5. 执行官方建表 SQL
mysql -u root -p'Nacos@2026!' nacos_config < /opt/nacos/conf/mysql-schema.sql
# 6. 验证表创建
mysql -u root -p'Nacos@2026!' nacos_config -e "SHOW TABLES;"
Nacos MySQL 核心表清单 (14 张):
| 表名 | 用途 | 所属模块 |
|---|---|---|
config_info |
配置信息 --- 存储所有 Data ID 的配置内容 | Config |
config_info_aggr |
配置聚合信息 | Config |
config_info_beta |
Beta 灰度配置 | Config |
config_info_tag |
标签配置 | Config |
config_tags_relation |
配置-标签关联 | Config |
group_capacity |
分组容量配额 | Config |
his_config_info |
配置历史 --- 每次配置变更的版本记录 | Config |
tenant_capacity |
命名空间容量配额 | Config |
tenant_info |
命名空间信息 | Config |
users |
用户信息 (2.x 鉴权后) | Auth |
roles |
角色定义 | Auth |
permissions |
权限授予 | Auth |
app_list |
应用列表 (历史遗留) | - |
app_configdata_ref_pub |
应用-配置关联 (历史遗留) | - |
config_info是最核心的表 。每当你通过控制台或 API 发布一条配置,就会在config_info中产生一条记录;每次修改会生成his_config_info历史版本。
sql
-- 查看 config_info 表结构
DESC config_info;
-- +------------------+--------------+------+-----+---------+----------------+
-- | Field | Type | Null | Key | Default | Extra |
-- +------------------+--------------+------+-----+---------+----------------+
-- | id | bigint | NO | PRI | NULL | auto_increment |
-- | data_id | varchar(255) | NO | UNI | NULL | | ← Data ID
-- | group_id | varchar(128) | NO | | NULL | | ← Group
-- | content | longtext | NO | | NULL | | ← 配置内容
-- | md5 | varchar(32) | YES | | NULL | | ← 内容 MD5
-- | gmt_create | datetime | NO | | CURRENT | |
-- | gmt_modified | datetime | NO | | CURRENT | |
-- | src_user | text | YES | | NULL | | ← 发布人
-- | src_ip | varchar(50) | YES | | NULL | | ← 来源 IP
-- | app_name | varchar(128) | YES | | NULL | |
-- | tenant_id | varchar(128) | YES | | '' | | ← 命名空间
-- | c_desc | varchar(256) | YES | | NULL | | ← 描述
-- | c_use | varchar(64) | YES | | NULL | |
-- | effect | varchar(64) | YES | | NULL | |
-- | type | varchar(64) | YES | | NULL | | ← 配置格式
-- | c_schema | text | YES | | NULL | |
-- | encrypted_data_key| text | NO | | NULL | |
-- +------------------+--------------+------+-----+---------+----------------+
实操5: Nacos 连接 MySQL 配置
bash
# === 在 nacos-01 上执行 ===
# 编辑 application.properties
vi /opt/nacos/conf/application.properties
properties
# ============================================================
# Nacos 数据库配置 (application.properties 核心片段)
# ============================================================
# 1. 数据库平台 --- 告诉 Nacos 用 MySQL 而非内嵌 Derby
spring.datasource.platform=mysql
# 2. 数据库数量 --- 是否启用多数据源 (生产环境建议至少 2 个)
# db.num=1 表示只使用一个数据源
# db.num=2 表示主备模式
db.num=1
# 3. 第 0 个数据源的 JDBC URL
# 参数详解:
# characterEncoding=utf8 → 字符编码, 保证中文字符正确存储
# connectTimeout=1000 → 连接超时 1 秒 (毫秒)
# socketTimeout=3000 → Socket 读取超时 3 秒
# autoReconnect=true → 自动重连 (连接断开后自动恢复)
# useUnicode=true → 启用 Unicode
# useSSL=false → 内网通信不需 SSL
# serverTimezone=Asia/Shanghai → 时区 (重要! 必须与 MySQL 一致)
db.url.0=jdbc:mysql://192.168.0.190:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
# 4. 数据库凭据
db.user.0=root
db.password.0=Nacos@2026!
# 5. 连接池配置 (可选, HikariCP)
# Nacos 底层使用 HikariCP 连接池, 可以在这里覆写默认值
# db.pool.config.connectionTimeout=30000
# db.pool.config.maximumPoolSize=20
# db.pool.config.minimumIdle=2
serverTimezone=Asia/Shanghai这个参数踩过坑的人最多。MySQL 8.0 驱动强制要求指定时区,如果不写会报The server time zone value 'XXX' is unrecognized。而且必须和 MySQL 服务器时区一致,否则时间会差 8 小时。
bash
# 重启 Nacos 使配置生效
/opt/nacos/bin/shutdown.sh
/opt/nacos/bin/startup.sh -m standalone
# 验证: 查看日志, 确认使用的是 MySQL
tail -20 /opt/nacos/logs/start.out | grep -i mysql
# INFO Nacos started successfully in standalone mode. use external storage
# ^^^^^^^^^^^^^^^^
# 关键! 从 "embedded" 变成 "external"
验证要点 : 数据库切换成功的标志是启动日志里显示了
use external storage,如果还是use embedded storage,检查application.properties里的spring.datasource.platform=mysql有没有加。
3.3 服务注册与发现实战
3.3.1 服务提供者 (Service Provider) 开发
工程结构:
nacos-service-provider/
├── pom.xml
├── src/main/java/com/example/provider/
│ ├── ProviderApplication.java # 启动类
│ └── controller/
│ └── HelloController.java # REST 接口
└── src/main/resources/
├── application.yml
└── bootstrap.yml # ← Nacos 配置放这里 (优先于 application.yml)
为什么用 bootstrap.yml? Spring Cloud 配置加载顺序:
bootstrap.yml→application.yml。Nacos 的连接信息(server-addr、namespace)必须在应用上下文初始化之前就加载到,所以要放在bootstrap.yml中。Spring Cloud 2020.0 之后需要手动添加spring-cloud-starter-bootstrap依赖才能启用 bootstrap 机制。
Step 1: pom.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>nacos-service-provider</artifactId>
<version>1.0.0</version>
<name>nacos-service-provider</name>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.1.2</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos 服务发现 (⭐核心) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Cloud LoadBalancer (替代 Ribbon, Spring Cloud 2020+ 默认) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- 启用 bootstrap.yml -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud BOM -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba BOM -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Step 2: bootstrap.yml
yaml
# bootstrap.yml --- Nacos 连接信息
spring:
application:
name: nacos-service-provider # ← 服务名, 就是 Nacos 里显示的服务名称
cloud:
nacos:
discovery:
server-addr: 119.8.106.88:8848 # ← Nacos Server 地址
namespace: public # ← 命名空间 ID (public 是默认空间)
group: DEFAULT_GROUP # ← 分组名
username: nacos # ← 2.x 开启鉴权后必填
password: nacos
# 以下为可选配置
# cluster-name: SH # ← 集群名称 (多机房场景)
# ephemeral: true # ← true=临时实例(默认), false=持久实例
# weight: 1 # ← 权重 (1~100, 用于灰度/负载)
# metadata: # ← 自定义元数据
# version: 1.0.0
# region: hk
server:
port: 8888 # ← 服务监听端口
ephemeral: truevsfalse: 临时实例 (ephemeral=true, 默认) 靠心跳维持,15 秒发一次心跳,30 秒无心跳就剔除------适合 K8s Pod 这类频繁启停的场景。持久实例 (ephemeral=false) 不依赖心跳,实例挂了也不会被自动剔除------适合数据库这类固定基础设施。临时实例走 AP (Distro 协议),持久实例走 CP (Raft 协议)。
Step 3: 启动类
java
package com.example.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // ← 启用服务发现 (Spring Cloud 2020+ 这个注解可以不写, 但写上更显式)
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
@EnableDiscoveryClient的变迁 : 在 Spring Cloud 早期的 Edgware/Finchley 版本,这个注解是必须的。从 Hoxton 开始,只要 classpath 有相应的 starter,Spring Boot 就会自动注册,注解变成可选的。但建议保留,它能提高代码可读性------让人一眼看出这个服务要注册到 Nacos。
Step 4: Controller
java
package com.example.provider.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class HelloController {
@Value("${server.port}")
private int port;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/hello")
public Map<String, Object> hello(@RequestParam(defaultValue = "World") String name) {
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("message", "Hello " + name + " from " + appName);
result.put("port", port);
try {
result.put("hostname", InetAddress.getLocalHost().getHostName());
result.put("ip", InetAddress.getLocalHost().getHostAddress());
} catch (Exception e) {
result.put("hostname", "unknown");
}
return result;
}
@GetMapping("/health")
public Map<String, Object> health() {
Map<String, Object> result = new HashMap<>();
result.put("status", "UP");
result.put("timestamp", System.currentTimeMillis());
return result;
}
}
Step 5: 编译打包部署
bash
# === 在 nacos-04 (94.74.108.182, 客户端机器) 上执行 ===
# 安装 JDK 17
apt-get install -y openjdk-17-jdk-headless maven
# 构建
cd /root/nacos-service-provider
mvn clean package -DskipTests
# 启动
java -jar target/nacos-service-provider-1.0.0.jar &
# 验证注册 (从任意节点)
curl http://119.8.106.88:8848/nacos/v1/ns/instance/list?serviceName=nacos-service-provider
# 返回:
# {
# "name": "DEFAULT_GROUP@@nacos-service-provider",
# "hosts": [
# {
# "instanceId": "192.168.0.164#8888#DEFAULT#DEFAULT_GROUP@@nacos-service-provider",
# "ip": "192.168.0.164",
# "port": 8888,
# "weight": 1.0,
# "healthy": true,
# "enabled": true,
# "ephemeral": true,
# "clusterName": "DEFAULT",
# "serviceName": "DEFAULT_GROUP@@nacos-service-provider",
# "metadata": {}
# }
# ]
# }
instanceId格式解析 :192.168.0.164#8888#DEFAULT#DEFAULT_GROUP@@nacos-service-provider,规则是IP#端口#集群名#分组@@服务名。这个 ID 在 Nacos 内部是唯一标识,通过它来确定一个具体的服务实例。
验证: Nacos 控制台
登录 http://119.8.106.88:8848/nacos → 服务管理 → 服务列表
┌─────────────────────────────────────────────────────────────────────┐
│ 服务列表 [+] │
├──────────────────────┬──────────┬──────────┬──────────┬──────────┤
│ 服务名称 │ 实例数 │ 健康实例 │ 保护阈值 │ 操作 │
├──────────────────────┼──────────┼──────────┼──────────┼──────────┤
│ nacos-service-provider│ 1 │ 1 │ 0 │ 详情 │
└──────────────────────┴──────────┴──────────┴──────────┴──────────┘
点击「详情」→ 可以看到实例的 IP、端口、权重、元数据等信息。
3.3.2 服务消费者 (Service Consumer) 开发
工程结构:
nacos-service-consumer/
├── pom.xml
├── src/main/java/com/example/consumer/
│ ├── ConsumerApplication.java
│ ├── config/RestTemplateConfig.java
│ ├── controller/ConsumerController.java
│ └── service/ConsumerService.java
└── src/main/resources/
├── application.yml
└── bootstrap.yml
Step 1: RestTemplate 配置 (负载均衡)
java
package com.example.consumer.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // ← ⭐ 关键注解! 让 RestTemplate 支持服务名调用 + 负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@LoadBalanced的黑魔法 : 这个注解做了三件事:1) 给RestTemplate添加一个拦截器LoadBalancerInterceptor;2) 拦截所有 HTTP 请求;3) 如果 URL 的 host 部分是服务名(如nacos-service-provider),自动从 Nacos 查找实际 IP 列表,并通过负载均衡算法选出一个实例来调用。整个过程对业务代码完全透明。
Step 2: Controller
java
package com.example.consumer.controller;
import com.example.consumer.service.ConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ConsumerService consumerService;
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "World") String name) {
return consumerService.callProvider(name);
}
}
Step 3: Service --- 核心调用逻辑
java
package com.example.consumer.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ConsumerService {
@Autowired
private RestTemplate restTemplate;
public String callProvider(String name) {
// ⭐ 注意: 这里的 URL host 写的是服务名, 不是 IP!
// Nacos 会自动解析 nacos-service-provider → 实际 IP:Port
String url = "http://nacos-service-provider/api/hello?name=" + name;
return restTemplate.getForObject(url, String.class);
}
}
验证---负载均衡效果:
bash
# === 先启动 3 个 Provider 实例 (不同端口) ===
# 实例1: java -jar provider.jar --server.port=8888 &
# 实例2: java -jar provider.jar --server.port=8889 &
# 实例3: java -jar provider.jar --server.port=8890 &
# 然后多次调用 Consumer:
for i in {1..10}; do
curl http://94.74.108.182:8080/consumer/hello
echo ""
done
# 预期输出 (轮询):
# {"port":8888, ...}
# {"port":8889, ...}
# {"port":8890, ...}
# {"port":8888, ...}
# ... 循环
3.4 配置中心实战
3.4.1 基础配置管理
Step 1: 添加 Nacos Config 依赖
xml
<!-- pom.xml 追加 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意 :
spring-cloud-starter-alibaba-nacos-config和spring-cloud-starter-alibaba-nacos-discovery是两个独立的 starter。如果只需要配置中心而不需要服务发现,可以只引入前者。但大多数场景两者都需要。
Step 2: bootstrap.yml (配置中心专用)
yaml
spring:
application:
name: nacos-config-client # ← Data ID 的组成部分
cloud:
nacos:
config:
server-addr: 119.8.106.88:8848 # ← Nacos 地址
namespace: public # ← 命名空间
group: DEFAULT_GROUP # ← 分组
file-extension: yaml # ← 配置文件格式 (yaml/properties/json)
username: nacos
password: nacos
refresh-enabled: true # ← ⭐ 开启配置动态刷新
# 配置文件的 Data ID 自动拼接规则:
# ${prefix}-${spring.profiles.active}.${file-extension}
# prefix 默认 = spring.application.name
#
# 示例: nacos-config-client.yaml (无 profile 时)
# nacos-config-client-dev.yaml (profile=dev 时)
# 超时配置 (可选)
timeout: 3000 # ← 获取配置超时 (毫秒)
# config-retry-time: 2000 # ← 配置重试间隔
# config-long-poll-timeout: 30000 # ← 长轮询超时
# max-retry: 3 # ← 最大重试次数
Data ID 命名规则 :
${prefix}-${spring.profiles.active}.${file-extension}。这个约定很重要------配错了 Nacos 找不到配置文件,应用会启动失败。实际中最常见的坑就是 Data ID 拼错了。
Step 3: Nacos 控制台创建配置
登录 http://119.8.106.88:8848/nacos → 配置管理 → 配置列表 → 点击「+」新增:
┌─────────────────────────────────────────────────────────────────────────┐
│ 新增配置 │
├─────────────────────────────────────────────────────────────────────────┤
│ Data ID: nacos-config-client.yaml ← 必须与 bootstrap 匹配 │
│ Group: DEFAULT_GROUP │
│ 描述: 测试配置 │
│ 配置格式: YAML │
│ │
│ 配置内容: │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ app: │ │
│ │ name: Nacos Config Demo │ │
│ │ version: 1.0.0 │ │
│ │ description: "动态配置测试" │ │
│ │ │ │
│ │ feature: │ │
│ │ new-user-welcome: true │ │
│ │ max-login-attempts: 5 │ │
│ │ │ │
│ │ database: │ │
│ │ url: jdbc:mysql://192.168.0.190:3306/app_db │ │
│ │ pool-size: 10 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ [发布] [取消] │
└─────────────────────────────────────────────────────────────────────────┘
Step 4: Controller --- 读取 + 动态刷新
java
package com.example.configclient.controller;
import com.example.configclient.config.AppProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/config")
@RefreshScope // ← ⭐ 核心注解: 支持配置热刷新
public class ConfigController {
// 方式 1: @Value 注入 (需要 @RefreshScope)
@Value("${app.name:unknown}")
private String appName;
@Value("${app.version:0.0.0}")
private String version;
@Value("${feature.new-user-welcome:false}")
private boolean newUserWelcome;
// 方式 2: @ConfigurationProperties 注入 (推荐, 类型安全)
@Autowired
private AppProperties appProperties;
@GetMapping("/basic")
public Map<String, Object> basic() {
Map<String, Object> result = new HashMap<>();
result.put("appName", appName);
result.put("version", version);
result.put("newUserWelcome", newUserWelcome);
return result;
}
@GetMapping("/properties")
public AppProperties properties() {
return appProperties;
}
}
Step 5: @ConfigurationProperties 配置类
java
package com.example.configclient.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String version;
private String description;
// getters & setters (或用 Lombok @Data)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getVersion() { return version; }
public void setVersion(String version) { this.version = version; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}
@RefreshScopevs@ConfigurationProperties:@RefreshScope的机制是在配置变更时销毁并重建 Bean,所以它配合@Value使用时需要重新注入。而@ConfigurationProperties有自己的 Binder,配置变更时会自动 rebind,不需要@RefreshScope。推荐优先用@ConfigurationProperties,类型安全且代码更干净。
Step 6: 测试动态刷新
bash
# 1. 初始查询
curl http://94.74.108.182:8080/config/basic
# {"appName":"Nacos Config Demo","version":"1.0.0","newUserWelcome":true}
# 2. 在 Nacos 控制台修改 app.version=2.0.0, 点击发布
# 3. 再次查询 (无需重启!)
curl http://94.74.108.182:8080/config/basic
# {"appName":"Nacos Config Demo","version":"2.0.0","newUserWelcome":true}
# ^^^^^ 已自动刷新!
配置刷新原理 (长轮询):
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos 配置动态刷新原理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Client 端 (1.x: HTTP Long Polling / 2.x: gRPC) │
│ │
│ ┌──────────┐ ┌──────────────────┐ │
│ │ Client │ │ Nacos Server │ │
│ │ │ │ │ │
│ │ 1. 发起长轮询请求 ──────────────→ │ │
│ │ │ GET /v1/cs/configs/ │ 携带 MD5 │ │
│ │ │ listener?dataId=xxx │ │ │
│ │ │ │ │ │
│ │ 2. 服务端挂起 29.5 秒 ───────── │ │
│ │ │ (如果配置未变更) │ ┌────────────┐ │ │
│ │ │ │ │ 配置变更? │ │ │
│ │ │ │ │ 比较 MD5 │ │ │
│ │ │ │ └────────────┘ │ │
│ │ │ │ │ │ │
│ │ │ ┌────┴───────┴─────┐ │ │
│ │ │ │ 变更 │ 未变更│ │
│ │ │ ▼ ▼ │ │
│ │ 3a. 立刻返回新配置 3b. 超时返回 304 │ │
│ │ │ ← ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ │ │ │ │ │
│ │ 4. 重新发起长轮询 ──────────────→ │ │
│ │ │ (无限循环) │ │ │
│ └──────────┘ └──────────────────┘ │
│ │
│ 核心设计: │
│ ├── 不是 Client 定时拉 (poll), 也不是 Server 主动推 (push) │
│ ├── 是 Client 发起一个 30 秒超时的 HTTP 请求, Server 挂起等待 │
│ ├── 如果 30 秒内配置变了 → 立即返回新内容 │
│ ├── 如果 30 秒没变 → 返回 304 Not Modified, Client 立即再发一次 │
│ └── 这样的好处: 实时性好 (秒级感知), 没有轮询的带宽浪费 │
│ │
│ Nacos 2.x gRPC 模式: │
│ └── 长轮询改为 gRPC 双向流, 效率更高, 延迟更低 (~50ms 感知) │
│ │
└─────────────────────────────────────────────────────────────────────┘
3.5 高级功能实战
3.5.1 命名空间 (Namespace) --- 环境隔离
┌─────────────────────────────────────────────────────────────────────┐
│ Nacos 命名空间隔离架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Nacos Server │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────┐ │ │
│ │ │ Namespace: dev │ │ Namespace: test │ │ NS: prod │ │ │
│ │ │ (开发环境) │ │ (测试环境) │ │ (生产环境) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ │ │
│ │ │ │ 服务注册: │ │ │ │ 服务注册: │ │ │ │ │ │
│ │ │ │ order-service │ │ │ │ order-service │ │ │ │ │ │
│ │ │ │ user-service │ │ │ │ user-service │ │ │ │ │ │
│ │ │ └──────────────┘ │ │ └──────────────┘ │ │ │ │ │
│ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ │ │
│ │ │ │ 配置: │ │ │ │ 配置: │ │ │ │ │ │
│ │ │ │ db.url=dev.. │ │ │ │ db.url=test.. │ │ │ │ │ │
│ │ │ └──────────────┘ │ │ └──────────────┘ │ │ │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ✅ dev 环境的服务不会发现 test 环境的实例 │
│ ✅ test 环境修改配置不会影响 dev 环境 │
│ ✅ 每个命名空间有独立的权限控制 │
│ │
└─────────────────────────────────────────────────────────────────────┘
bash
# Nacos 控制台 → 命名空间 → 新建命名空间
# 命名空间名: dev
# 命名空间ID: dev-2026 (自动生成或手动指定)
# 描述: 开发环境
# 在 bootstrap.yml 中切换命名空间
spring:
cloud:
nacos:
discovery:
namespace: dev-2026 # ← 使用命名空间 ID, 不是命名空间名!
config:
namespace: dev-2026
namespace: public的含义 :public是 Nacos 默认的命名空间,不传 ID 或传空字符串都表示public。它的实际 ID 是空字符串""。如果创建了自定义命名空间,必须用控制台显示的命名空间 ID (一串 UUID),不能用命名空间名------这是个常见的踩坑点。
3.5.2 多配置文件加载
yaml
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: 119.8.106.88:8848
file-extension: yaml
# ==================================================
# 扩展配置 (extension-configs)
# ==================================================
# 概念: 扩展配置用于加载"本服务专属"的额外配置
# 优先级: 越靠后越高 (后面的会覆盖前面的)
# 使用场景: 拆分配置 (如 database.yml + redis.yml + mq.yml)
extension-configs:
- data-id: database-config.yaml # ← Data ID
group: DEFAULT_GROUP # ← 分组
refresh: true # ← 是否动态刷新
- data-id: redis-config.yaml
group: DEFAULT_GROUP
refresh: true
# ==================================================
# 共享配置 (shared-configs)
# ==================================================
# 概念: 共享配置用于加载"多个服务共用"的配置
# 优先级: 最低 (会被 extension-configs 和主配置覆盖)
# 使用场景: 公司级别公共配置 (如日志格式、监控地址)
shared-configs:
- data-id: common-config.yaml
group: DEFAULT_GROUP
refresh: true
# ⚠️ 配置优先级 (从低到高):
# shared-configs < extension-configs < 主配置 (${spring.application.name}.yaml)
配置优先级口诀 :
主配置 > extension-configs (后面的 > 前面的) > shared-configs。后加载的覆盖先加载的,和你直觉相反------所以关键配置放主配置,次要配置放 extension-configs,公司通用配置放 shared-configs。
3.5.3 服务分组 (Group)
Nacos 中, 同一个服务名可以属于不同的 Group:
DEFAULT_GROUP@@order-service → 默认分组
SHANGHAI_GROUP@@order-service → 上海机房分组
BEIJING_GROUP@@order-service → 北京机房分组
应用场景: 多机房部署时,让消费者优先调用同机房的提供者,实现就近访问。
3.6 集群部署实战 ⭐
这是本博客最核心的实战部分------在华为云 ecs-827b 集群 4 台服务器上部署 Nacos 3 节点集群 + MySQL。
3.6.1 集群架构设计
┌──────────────────────────────────────────────────────────────────────────┐
│ Nacos 3 节点集群部署架构 │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 外部访问 │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Nginx (nacos-01 :8848) │ │
│ │ reverse proxy → 三节点负载均衡 │ │
│ │ health check → 自动剔除故障节点 │ │
│ └────┬─────────────────┬─────────────────┬─────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ nacos-01 │ │ nacos-02 │ │ nacos-03 │ │
│ │ 119.8.106.88 │ │ 49.0.241.233 │ │159.138.156.92│ │
│ │192.168.0.190 │ │192.168.0.194 │ │192.168.0.102│ │
│ │ │ │ │ │ │ │
│ │ 端口: │ │ 端口: │ │ 端口: │ │
│ │ :8848 HTTP │ │ :8848 HTTP │ │ :8848 HTTP │ │
│ │ :9848 gRPC │ │ :9848 gRPC │ │ :9848 gRPC │ │
│ │ :9849 Raft │ │ :9849 Raft │ │ :9849 Raft │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ MySQL 8.0 │ ← 三节点共享同一个数据库 │
│ │ (nacos-01) │ │
│ │192.168.0.190 │ │
│ └──────────────┘ │
│ │
│ 一致性协议: │
│ ├── 注册中心 (Naming): Distro 协议 (AP) --- 节点间异步同步实例信息 │
│ └── 配置中心 (Config): JRaft 协议 (CP) --- Leader 选举 + 配置写入强一致 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
3.6.2 环境准备 (批量初始化 4 台服务器)
bash
# === 在所有 4 台服务器上并行执行 ===
# 1. 更新系统
apt-get update && apt-get upgrade -y
# 2. 安装 JDK 17
apt-get install -y openjdk-17-jdk-headless
# 3. 验证 JDK
java -version
# openjdk version "17.0.13" 2024-10-15
# 4. 配置 hosts (所有 4 台都执行, 方便内网通信)
cat >> /etc/hosts << 'EOF'
192.168.0.190 nacos-01
192.168.0.194 nacos-02
192.168.0.102 nacos-03
192.168.0.164 nacos-04
EOF
# 5. 下载并解压 Nacos (3 台 Nacos 节点)
cd /opt
wget https://github.com/alibaba/nacos/releases/download/2.5.2/nacos-server-2.5.2.tar.gz
tar -zxvf nacos-server-2.5.2.tar.gz
mv nacos /opt/nacos
3.6.3 MySQL 初始化 (nacos-01)
bash
# === 在 nacos-01 上执行 ===
# 1. 安装 MySQL
apt-get install -y mysql-server-8.0
systemctl enable mysql && systemctl start mysql
# 2. 创建数据库和用户
mysql -u root << 'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Nacos@2026!';
CREATE DATABASE IF NOT EXISTS nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
EOF
# 3. 执行初始化 SQL
mysql -u root -p'Nacos@2026!' nacos_config < /opt/nacos/conf/mysql-schema.sql
# 4. 允许远程连接 (让 nacos-02/03 能连接 MySQL)
mysql -u root -p'Nacos@2026!' << 'EOF'
CREATE USER 'nacos'@'192.168.0.%' IDENTIFIED BY 'Nacos@2026!';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'192.168.0.%';
FLUSH PRIVILEGES;
EOF
# 5. 修改 MySQL 绑定地址 (允许远程)
sed -i 's/^bind-address.*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
systemctl restart mysql
3.6.4 配置 Nacos 集群节点
bash
# === 在三台 Nacos 节点上分别执行 ===
# 1. 配置数据库连接 (3 台节点都指向同一 MySQL)
# 编辑 /opt/nacos/conf/application.properties
cat >> /opt/nacos/conf/application.properties << 'EOF'
# ========== MySQL 持久化配置 ==========
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.0.190:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=nacos
db.password.0=Nacos@2026!
EOF
# 2. 创建集群配置文件 (⭐ 核心步骤)
# cluster.conf 列出所有参加集群的节点 IP
cat > /opt/nacos/conf/cluster.conf << 'EOF'
192.168.0.190:8848
192.168.0.194:8848
192.168.0.102:8848
EOF
# ⚠️ cluster.conf 必须每行一个节点, 格式为 IP:PORT
# 不要写主机名, 不要写注释
# 三台节点的 cluster.conf 内容完全一致
cluster.conf为什么必须写 IP 不要写主机名? Nacos 集群内部通信走的是原生 Socket 连接,不经过 DNS 解析。用主机名会导致集群发现失败,节点间互相认为对方不可达。如果必须用主机名,得在所有节点/etc/hosts里提前配置好映射------但这个依赖引入了额外的故障点,不推荐。
3.6.5 启动集群
bash
# === 在三台 Nacos 节点上依次执行 ===
# 1. 启动 Nacos (集群模式)
/opt/nacos/bin/startup.sh
# 默认就是 cluster 模式, 不需要 -m standalone
# 2. 查看启动日志
tail -f /opt/nacos/logs/start.out | grep -E "started|LEADER|peer|raft"
# 观察日志关键输出:
# nacos-01 (通常是 Leader):
# INFO The leader is [192.168.0.190:7848]
# INFO start to register this node to other node: 192.168.0.194:7848
# INFO start to register this node to other node: 192.168.0.102:7848
# nacos-02/03 (Follower):
# INFO The leader is [192.168.0.190:7848]
# INFO start to register this node to other node: ...
# 3. 检查集群状态 (任一台)
curl -s http://192.168.0.190:8848/nacos/v1/core/cluster/nodes
# 返回:
# [
# {"address":"192.168.0.190:8848","state":"UP","failAccessCnt":0,...},
# {"address":"192.168.0.194:8848","state":"UP","failAccessCnt":0,...},
# {"address":"192.168.0.102:8848","state":"UP","failAccessCnt":0,...}
# ]
# 4. 访问控制台
curl -s http://119.8.106.88:8848/nacos/ | head -5
# 返回 HTML → 启动成功
# 登录: http://119.8.106.88:8848/nacos
# 查看: 集群管理 → 节点列表 (应看到 3 个 UP 节点)
集群状态检查清单:
□ 三台节点的 cluster.conf 内容完全一致
□ 三台节点的 application.properties 数据库配置一致
□ MySQL 可从三台节点访问 (telnet 192.168.0.190 3306)
□ 节点间 7848 端口互通 (Nacos 内部 Raft 通信端口 = server.port - 1000)
□ 日志中没有 "fail to connect peer" 或 "Connection refused"
□ GET /v1/core/cluster/nodes 返回 3 个 UP 节点
□ 控制台 "集群管理 > 节点列表" 显示 3 个 UP 节点
Nacos 内部端口偏移规则 :
主端口 - 1000= Raft 通信端口。默认主端口 8848 → Raft 端口 7848。再加上 gRPC 偏移+1000和+1001,一个 Nacos 节点实际占用 8848 + 7848 + 9848 + 9849 四个端口。
3.6.6 Nginx 负载均衡配置 (可选)
bash
# === 在 nacos-01 上安装 Nginx ===
apt-get install -y nginx
# 配置反向代理
cat > /etc/nginx/conf.d/nacos.conf << 'EOF'
upstream nacos-cluster {
# ⚠️ 使用内网 IP, 不走公网
server 192.168.0.190:8848 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.194:8848 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.102:8848 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://nacos-cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
nginx -t && systemctl restart nginx
# 此后客户端连接 Nginx, 不再是直连某台 Nacos
# spring.cloud.nacos.discovery.server-addr = 119.8.106.88:80
3.7 权限管理实战
3.7.1 开启鉴权
properties
# application.properties (三台节点都改, 然后重启)
# 开启认证
nacos.core.auth.enabled=true
# 2.5.x 版本需要自定义密钥 (Base64, 长度 ≥ 32 字符)
# ⚠️ 三台节点的密钥必须完全一致!
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXlGb3JOYWNvc0F1dGhAMjAyNiE=
# Token 过期时间 (秒, 默认 18000 = 5小时)
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
# 服务端身份识别 (集群模式必须)
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
token.secret.key的重要性 : 三台节点的密钥必须完全一致 ,否则节点间通信鉴权失败,集群会分裂。2.5.x 版本强制要求这个值不能是默认的SecretKey0123456789...------官方觉得默认密钥太不安全了。
生成密钥:
bash
# 方式 1: openssl
openssl rand -base64 32
# ouput: VGhpc0lzTXlDdXN0b21TZWNyZXRLZXlGb3JOYWNvc0F1dGhAMjAyNiE=
# 方式 2: Python
python3 -c "import base64, os; print(base64.b64encode(os.urandom(32)).decode())"
# 方式 3: /dev/urandom
head -c 32 /dev/urandom | base64
3.7.2 用户与角色管理
Nacos 2.x 权限模型:
┌──────────────────────────────────────────────┐
│ RBAC 模型 │
│ │
│ 用户 (User) ──→ 角色 (Role) ──→ 权限 (Permission)
│ │
│ 一个用户可以有多个角色 │
│ 一个角色可以有多个权限 │
│ 权限精确到: 命名空间 + 资源 + 操作 │
│ │
│ 预置角色: │
│ ├── ROLE_ADMIN: 管理员 (全部权限) │
│ └── ROLE_NONE: 无权限 │
│ │
│ 资源类型: │
│ ├── *:*:* → 所有 │
│ ├── namespace/uuid → 命名空间级 │
│ ├── eureka-service → 服务级 │
│ └── eureka-config → 配置级 │
│ │
│ 操作类型: r(读) / w(写) / rw(读写) │
└──────────────────────────────────────────────┘
控制台实操:
- 权限控制 → 用户列表 → 创建用户
dev-user - 权限控制 → 角色管理 → 绑定
dev-user到ROLE_ADMIN(或自建角色) - 权限控制 → 权限管理 → 为角色添加
dev命名空间的rw权限 - 退出登录,用
dev-user重新登录,验证只能看到 dev 命名空间
4. 进阶应用篇
4.1 性能优化
| 优化项 | 配置参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|---|
| JVM 堆大小 | JVM_XMS / JVM_XMX | 512m/512m | 2g/2g | 生产环境 100+ 服务时需调大 |
| HTTP 线程池 | server.tomcat.max-threads | 200 | 200~500 | Nacos 本身不负责大数据计算,200 够用 |
| 数据库连接池 | db.pool.config.maximumPoolSize | 20 | 20~50 | HikariCP 连接池 |
| 心跳间隔 | - | 5 秒 | 5 秒 (默认) | 客户端向 Server 发心跳的间隔 |
| 心跳超时 | - | 15 秒 | 15 秒 (默认) | 超过此时间未收到心跳 → 标记不健康 |
| 实例剔除 | - | 30 秒 | 30 秒 (默认) | 不健康持续此时间 → 剔除 |
| 配置刷新超时 | config-long-poll-timeout | 30000ms | 30000ms | 长轮询超时 |
4.2 监控告警
bash
# Nacos 内置 Prometheus 指标端点 (2.2.x+)
# 直接暴露 /nacos/actuator/prometheus
# 1. 配置暴露指标
# application.properties
management.endpoints.web.exposure.include=prometheus,health,info
management.metrics.export.prometheus.enabled=true
# 2. 访问指标
curl http://192.168.0.190:8848/nacos/actuator/prometheus
# 返回大量 Prometheus 格式指标:
# nacos_monitor{name="configCount"} 15
# nacos_monitor{name="serviceCount"} 5
# nacos_monitor{name="httpCode200"} 1234
# ...
# 3. Prometheus 配置
# scrape_configs:
# - job_name: 'nacos'
# metrics_path: '/nacos/actuator/prometheus'
# static_configs:
# - targets: ['192.168.0.190:8848', '192.168.0.194:8848', '192.168.0.102:8848']
4.3 安全加固
| 加固项 | 措施 | 优先级 |
|---|---|---|
| 开启鉴权 | nacos.core.auth.enabled=true |
⭐⭐⭐⭐⭐ |
| 自定义密钥 | 替换默认 token.secret.key | ⭐⭐⭐⭐⭐ |
| 修改默认密码 | 不要用 nacos/nacos | ⭐⭐⭐⭐⭐ |
| HTTPS | 配置 SSL 证书 | ⭐⭐⭐ |
| 网络隔离 | 安全组只开放必要端口 (8848, 9848) | ⭐⭐⭐⭐ |
| 审计日志 | 开启操作审计 | ⭐⭐ |
5. 项目实战案例
5.1 电商系统微服务架构
┌─────────────────────────────────────────────────────────────────────────┐
│ 电商微服务架构 --- Nacos 注册发现 + 配置 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ Nacos 集群 │ │
│ │ 服务管理: │ │
│ │ ├── order-service (3 实例, 权重 100) │ │
│ │ ├── product-service (5 实例, 权重 100) │ │
│ │ ├── inventory-service (2 实例, 权重 80) ← 灰度中 │ │
│ │ ├── payment-service (3 实例, 权重 100) │ │
│ │ └── coupon-service (2 实例, 权重 50) ← 正在降级 │ │
│ │ │ │
│ │ 配置管理: │ │
│ │ ├── common-config.yaml ← 数据库/Redis/MQ 公共配置 │ │
│ │ ├── order-service.yaml ← 订单服务专属配置 │ │
│ │ ├── coupon-config.yaml ← 优惠券规则 (热更新) │ │
│ │ └── rate-limit-config.yaml ← 限流配置 (动态调整) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
│ 场景实战: │
│ ├── 大促前: 增加 product-service 实例到 10 个 → 秒级生效 │
│ ├── 大促中: 修改 rate-limit-config 限流阈值 → 实时生效 │
│ ├── 大促后: 恢复 coupon-service 权重到 100 → 一键恢复 │
│ └── 日常: coupon-config 修改满减规则 → 无需重启全部生效 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6. 常见问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 服务注册后看不到 | 命名空间/Group 不匹配 | 检查 bootstrap.yml 的 namespace 和 group |
| 配置拉取失败 | Data ID 不匹配 | 按 ${prefix}-${profile}.${ext} 规则检查 |
| 配置修改后不刷新 | @RefreshScope 未加 |
Controller 上添加 @RefreshScope |
| 集群节点显示 DOWN | cluster.conf 配置错误 | 确认用 IP 不用主机名,确认 7848 端口互通 |
| 鉴权失败 403 | token.secret.key 不一致 | 三台节点密钥必须完全一样 |
| MySQL 连接失败 | serverTimezone 未设置 | 添加 serverTimezone=Asia/Shanghai |
7. 版本升级与迁移
7.1 版本升级路径
| 当前版本 | 目标版本 | 升级方式 | 注意事项 |
|---|---|---|---|
| 1.4.x | 2.0.x | 数据库迁移 + 全量重启 | API 大变更, gRPC 引入 |
| 2.0.x | 2.1.x | 滚动升级 | gRPC 端口注意开放 |
| 2.1.x | 2.2.x | 滚动升级 | 鉴权插件变更 |
| 2.2.x | 2.5.x | 滚动升级 | token.secret.key 必配 |
7.2 从其他注册中心迁移
| 源 | 目标 | 迁移方案 |
|---|---|---|
| Eureka | Nacos | 双注册过渡期 → 切换 → 下线 Eureka |
| Consul | Nacos | API 层抽象 → 切换 Spring Cloud 实现 |
| Apollo | Nacos | 配置逐批迁移, 两个配置中心并行 |
8. 踩坑记录
踩坑 1: cluster.conf 用主机名导致集群分裂 ⭐⭐⭐⭐⭐
现象 : 三台节点启动后,/v1/core/cluster/nodes 返回各节点互相认为对方 DOWN
根因 : cluster.conf 里写的是主机名 nacos-01:8848,但 Nacos 内部通信走原生 Socket,不解析 /etc/hosts(2.5.2 版本实测)
解决 : 改用内网 IP 192.168.0.190:8848
教训 : cluster.conf 永远用 IP,不要用主机名,不要加注释
踩坑 2: token.secret.key 不一致导致鉴权失败 ⭐⭐⭐⭐
现象: 开启鉴权后,只有 nacos-01 能登录,02/03 返回 403 Forbidden
根因 : 三台节点各自用 openssl rand -base64 32 生成了不同的密钥
解决: 统一用一个密钥,通过 scp 或粘贴到三台节点
踩坑 3: MySQL 时区不匹配 ⭐⭐⭐
现象 : Nacos 启动报 The server time zone value 'SYSTEM' is unrecognized
根因 : MySQL 8.0 驱动强制指定时区,JDBC URL 缺少 serverTimezone
解决 : 添加 serverTimezone=Asia/Shanghai
踩坑 4: 忘记开启 MySQL 远程访问 ⭐⭐⭐
现象 : nacos-02/03 启动日志显示数据库连接失败 Communications link failure
根因: MySQL 默认只绑 127.0.0.1,远程连不上
解决 : 修改 bind-address = 0.0.0.0 + 创建 nacos@'192.168.0.%' 远程用户
踩坑 5: bootstrap.yml 未生效 ⭐⭐⭐
现象: 应用启动时使用了 application.yml 的默认值,没走 Nacos 配置
根因: Spring Cloud 2020.0+ 默认不启用 bootstrap 机制
解决 : 添加 spring-cloud-starter-bootstrap 依赖
踩坑 6: gRPC 端口未开放 ⭐⭐⭐⭐
现象 : Nacos 2.x 客户端报 Connection refused: /192.168.0.190:9848
根因: 只开放了 8848,忘记了 9848 (gRPC 客户端端口)
解决: 安全组/防火墙同时开放 8848 (HTTP) + 9848 (gRPC 客户端) + 9849 (gRPC 服务端)
9. 学习资源推荐
| 资源 | 地址 | 说明 |
|---|---|---|
| 官方文档 | https://nacos.io/zh-cn/docs/v2/guide.html | 最新版中文文档 |
| GitHub | https://github.com/alibaba/nacos | 源码 + Issue 讨论 |
| 在线 Demo | https://console.nacos.io/nacos/index.html | 免安装体验 |
| Nacos 官网 | https://nacos.io/ | 下载 + 博客 |
| Spring Cloud Alibaba | https://sca.aliyun.com/ | 官方 WIKI |
附录: 实验集群完整配置文件
A.1 集群节点配置速查表
| 节点 | 内网 IP | 公网 IP | 角色 | 端口 |
|---|---|---|---|---|
| ecs-827b-0001 | 192.168.0.190 | 119.8.106.88 | Nacos-01 + MySQL | 8848, 9848, 9849, 7848, 3306 |
| ecs-827b-0002 | 192.168.0.194 | 49.0.241.233 | Nacos-02 | 8848, 9848, 9849, 7848 |
| ecs-827b-0003 | 192.168.0.102 | 159.138.156.92 | Nacos-03 | 8848, 9848, 9849, 7848 |
| ecs-827b-0004 | 192.168.0.164 | 94.74.108.182 | Client | 8080, 8888+ |
A.2 cluster.conf
192.168.0.190:8848
192.168.0.194:8848
192.168.0.102:8848
A.3 SSH 免密 Checklist
bash
# 批量操作脚本 (3 台 Nacos 节点)
for IP in 192.168.0.190 192.168.0.194 192.168.0.102; do
ssh root@$IP "/opt/nacos/bin/shutdown.sh"
done
for IP in 192.168.0.190 192.168.0.194 192.168.0.102; do
ssh root@$IP "/opt/nacos/bin/startup.sh"
done
文档信息: 基于 Nacos 2.5.2 官方文档 + 华为云 ecs-827b 集群真实部署验证