Nacos 微服务注册与配置中心深度学习指南

Nacos 微服务注册与配置中心深度学习指南

版本 : v1.0 | 日期 : 2026-06-04 | 实验集群 : ecs-827b (华为云香港)

Nacos : 2.5.2 | Spring Boot : 3.3.x | JDK : 17 | MySQL: 8.0


目录

  1. 基础认知篇
  • 1.1 什么是 Nacos?
  • 1.2 为什么需要 Nacos?
  • 1.3 核心架构组件
  1. 环境准备篇
  • 2.1 前期准备
  • 2.2 版本选择与下载
  1. 上机实战篇
  • 3.1 Nacos Server 单机部署
  • 3.2 数据库配置实战
  • 3.3 服务注册与发现实战
  • 3.4 配置中心实战
  • 3.5 高级功能实战
  • 3.6 集群部署实战
  • 3.7 权限管理实战
  • 3.8 真实云环境部署验证
  1. 进阶应用篇
  • 4.1 性能优化
  • 4.2 监控告警
  • 4.3 安全加固
  1. 项目实战案例
  2. 常见问题与解决方案
  3. 版本升级与迁移
  4. 踩坑记录
  5. 学习资源推荐

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.ymlapplication.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: true vs false: 临时实例 (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-configspring-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; }
}

@RefreshScope vs @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(读写)          │
└──────────────────────────────────────────────┘

控制台实操:

  1. 权限控制 → 用户列表 → 创建用户 dev-user
  2. 权限控制 → 角色管理 → 绑定 dev-userROLE_ADMIN (或自建角色)
  3. 权限控制 → 权限管理 → 为角色添加 dev命名空间rw 权限
  4. 退出登录,用 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 集群真实部署验证

相关推荐
货拉拉技术2 小时前
货拉拉标注平台-拉拉标注
后端·架构
龙亘川3 小时前
拆解低空智联:四位一体架构、落地场景与行业瓶颈|《低空智联技术与应用白皮书 2026》深度复盘
架构·低空智联技术与应用白皮书
codeejun3 小时前
每日一Go-74、Go 云原生可观测性实战之OpenTelemetry 全链路采集:Trace + Metrics + Logs
开发语言·云原生·golang
用户337922545683 小时前
从零手搓大语言模型:模型结构篇
架构
杊页3 小时前
系列二:MVVM 深度实战与项目重构 | 第6篇 DataBinding & ViewBinding 实战落地:告别 findViewById 的“刀耕火种”
架构·mvvm
风一直吹3 小时前
Web 端 PvP 实时对战从零实现:匹配、同步、伤害全链路拆解
架构
Sunia3 小时前
《Agentx专栏》06-记忆系统:用Redis+Milvus给AI配上短期+长期双层记忆
java·架构
AI科技星3 小时前
依托Gε₀ = e²/(4παmₚ²)核心方程:全新公式推导+原创理论提炼+全维度精算验证
人工智能·线性代数·架构·概率论·学习方法
用户938515635073 小时前
前端必会:从 Fetch 到 DeepSeek,一篇搞懂 HTTP 请求的方方面面
javascript·架构