Nacos简单实用集群创建
- [一、服务注册:Eureka 平滑迁移 Nacos](#一、服务注册:Eureka 平滑迁移 Nacos)
-
- [1. 核心依赖引入](#1. 核心依赖引入)
- [2. 基础配置](#2. 基础配置)
- 二、服务分级存储模型
- [三、负载均衡:NacosRule 同集群优先](#三、负载均衡:NacosRule 同集群优先)
- 四、权重配置:精细化流量管控
- [五、环境隔离:Namespace + Group 双层隔离](#五、环境隔离:Namespace + Group 双层隔离)
-
- [1. Namespace 命名空间](#1. Namespace 命名空间)
- [2. Group 分组](#2. Group 分组)
- [3. 完整隔离配置](#3. 完整隔离配置)
- [六、Nacos 核心原理 & Eureka 对比](#六、Nacos 核心原理 & Eureka 对比)
-
- [1. 实例类型](#1. 实例类型)
- [2. Nacos vs Eureka 核心对比](#2. Nacos vs Eureka 核心对比)
- [3. CAP 选型](#3. CAP 选型)
- [七、Nacos 配置中心:动态配置刷新](#七、Nacos 配置中心:动态配置刷新)
-
- [1. 引入配置中心依赖](#1. 引入配置中心依赖)
- [2. 核心配置文件](#2. 核心配置文件)
- [3. Nacos 配置文件命名规则](#3. Nacos 配置文件命名规则)
- [4. 配置动态刷新两种方式](#4. 配置动态刷新两种方式)
- [5. **多环境共享配置**](#5. 多环境共享配置)
- [八、Nacos 集群高可用搭建](#八、Nacos 集群高可用搭建)
-
- [1. 集群核心架构](#1. 集群核心架构)
- [2. 底层协议](#2. 底层协议)
- [3. 集群搭建关键步骤](#3. 集群搭建关键步骤)
- [4. 集群硬性规范](#4. 集群硬性规范)
一、服务注册:Eureka 平滑迁移 Nacos
1. 核心依赖引入
统一管理 Spring Cloud Alibaba 版本,避免依赖冲突,父工程统一锁定版本:
xml
<properties>
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- SpringCloudAlibaba 版本统一管理 -->
<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>
微服务子工程引入 Nacos 服务注册依赖,移除 Eureka 相关依赖:
xml
<!-- Nacos 服务注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 基础配置
注释原有 Eureka 配置,新增 Nacos 注册地址:
yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动服务后,访问 Nacos 控制台,即可看到当前服务已成功注册。
二、服务分级存储模型
Nacos 采用三级分层架构,适配机房、地域部署场景:
服务 → 集群 (Cluster) → 实例
- 服务:如 user-service、order-service,代表一类业务服务
- 集群:代表机房 / 地域(杭州、上海、郑州),用于就近调用
- 实例:单台服务器上运行的具体服务节点
集群配置
yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
cluster-name: ZZ # 自定义集群标识
三、负载均衡:NacosRule 同集群优先
Nacos 内置专属负载均衡策略 NacosRule,核心规则:
- 优先调用同集群下的服务实例,减少跨机房网络延迟
- 本集群无可用实例时,自动跨集群调用,并打印告警日志
- 同集群内采用随机算法实现负载分发
开启 NacosRule
yaml
# 消费者服务配置
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
四、权重配置:精细化流量管控
Nacos 控制台支持手动设置实例权重(范围 0~1),实现无损发布与流量管控:
- 权重 = 0:下线节点,不接收任何流量,用于服务维护
- 权重 = 1:默认值,正常接收流量
- 权重自定义:高配机器调高权重,合理分配服务器压力
高频实战场景
- 灰度发布 / 平滑升级
新节点权重置 0 → 测试验证 → 逐步调高权重 → 旧节点权重置 0,实现零停机更新。 - 服务临时维护
无需停机、无需删除实例,直接置权重为 0,隔离流量排查问题。 - 差异化流量分配
根据服务器配置高低,分配不同流量,避免低配机器性能瓶颈。
五、环境隔离:Namespace + Group 双层隔离
Nacos 提供多层级隔离方案,彻底解决开发、测试、生产环境配置混乱问题。
1. Namespace 命名空间
- 作用:按环境隔离(dev / test / prod)
- 特点:不同命名空间天然隔离,服务、配置互不互通
- 使用:控制台创建命名空间,配置中填写命名空间唯一 ID
2. Group 分组
- 作用:按业务线隔离(订单组、用户组、支付组)
- 特点:同一环境下,不同业务配置、服务分组管理
3. 完整隔离配置
yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
cluster-name: ZZ
namespace: xxxx-xxxx-xxxx # 填写命名空间ID
group: ORDER_GROUP # 业务分组
六、Nacos 核心原理 & Eureka 对比
1. 实例类型
- 临时实例(默认):客户端主动上报心跳,心跳超时自动剔除,适合普通业务
- 非临时实例:服务端主动健康探测,断开不会自动剔除,适合核心持久化服务
手动配置非临时实例:
yaml
spring:
cloud:
nacos:
discovery:
ephemeral: false
2. Nacos vs Eureka 核心对比
| 特性 | Nacos | Eureka |
|---|---|---|
| 健康检测 | 临时实例 (客户端心跳)、非临时实例 (服务端探测) | 仅客户端心跳 |
| 数据同步 | 服务端主动 Push 推送 | 客户端定时 Pull 拉取 |
| CAP 能力 | 支持 AP / CP 动态切换 | 仅 AP |
| 附加能力 | 注册中心 + 配置中心一体化 | 仅注册中心 |
3. CAP 选型
- 配置中心场景:CP 强一致性,保证配置数据准确不冲突
- 服务注册场景:AP 高可用,优先保证服务可用,容忍短暂数据不一致
七、Nacos 配置中心:动态配置刷新
Nacos 兼具配置中心能力,统一管理全局配置,修改配置无需重启服务。
1. 引入配置中心依赖
xml
<!-- Nacos 配置中心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 核心配置文件
新建 bootstrap.yml(优先级高于 application.yml,项目启动优先加载):
yaml
spring:
application:
name: user-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
3. Nacos 配置文件命名规则
服务名-环境.后缀名
例:user-service-dev.yaml
4. 配置动态刷新两种方式
方式一:@RefreshScope + @Value
java
@RestController
@RefreshScope // 开启动态刷新
public class DemoController {
@Value("${user.name}")
private String userName;
@GetMapping("/get")
public String getConfig(){
return userName;
}
}
方式二:@ConfigurationProperties(推荐)
批量绑定配置,类型自动转换,代码更优雅:
java
@Component
@ConfigurationProperties(prefix = "user")
public class UserConfig {
private String name;
private Integer age;
// getter / setter 必须提供
}
5. 多环境共享配置
配置加载优先级(从高到低):
- 服务名 - 环境.yaml (环境独有配置)
- 服务名.yaml (全局共享配置)
公共配置统一放入默认配置文件,实现多环境复用。
八、Nacos 集群高可用搭建
单机 Nacos 仅适用于本地开发,生产环境必须搭建集群,避免单点故障。
1. 集群核心架构
- 微服务 → Nginx 负载均衡
- Nginx 反向代理多个 Nacos 节点
- 所有 Nacos 节点共用一套 MySQL 数据
- 集群节点数量必须为奇数(≥3),满足Raft 选举机制
2. 底层协议
- 配置管理:Raft 协议,CP 强一致
- 服务注册:Distro 协议,AP 高可用
3. 集群搭建关键步骤
步骤 1:初始化数据库
执行 Nacos 自带脚本 mysql-schema.sql,创建 nacos 数据库。
步骤 2:配置集群列表
修改 conf/cluster.conf,填写所有节点地址:
192.168.1.100:8848
192.168.1.101:8848
192.168.1.102:8848
步骤 3:统一数据库配置
所有节点 application.properties 数据库配置保持一致:
yaml
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
步骤 4:Nginx 负载均衡配置
css
http {
upstream nacos_http {
server 127.0.0.1:8848;
server 127.0.0.2:8848;
server 127.0.0.3:8848;
}
server {
listen 8848;
location /nacos/ {
proxy_pass http://nacos_http/nacos/;
}
}
}
stream {
upstream nacos_grpc {
server 127.0.0.1:9848;
server 127.0.0.2:9848;
server 127.0.0.3:9848;
}
server {
listen 9848;
proxy_pass nacos_grpc;
}
}
步骤 5:启动集群
所有节点执行启动脚本:
# Linux/Mac
./startup.sh
# Windows
startup.cmd
4. 集群硬性规范
- 节点数量 ≥3 且为奇数
- 所有节点 Nacos 版本、JDK 版本完全一致
- 共用同一个 MySQL,禁用内置 Derby 数据库
- 集群配置文件、数据库配置全网统一