一、Nacos 工作流程

二、Nacos vs Eureka 核心区别
2.1 共同点(都是注册中心)
| 共同点 | 说明 |
|---|---|
| 1. 服务注册 | 都支持服务提供者注册到注册中心 |
| 2. 服务拉取 | 都支持消费者从注册中心拉取服务列表 |
| 3. 心跳检测 | 都支持心跳方式做健康检测 |
2.2 核心区别(5 大差异)
| 维度 | Nacos | Eureka |
|---|---|---|
| 1. 健康检测 | 服务端主动检测 (非临时实例) | 客户端心跳(30 秒) |
| 2. 临时实例 | ✅ 支持 (默认,心跳不正常会被剔除) | ❌ 不支持 |
| 3. 非临时实例 | ✅ 支持 (nacos 主动询问,心跳不正常不会被剔除) | ❌ 不支持 |
| 4. 消息推送 | ✅ 支持消息推送 (服务列表变更实时推送) | ❌ 只支持拉取 (30 秒拉一次) |
| 5. 集群一致性 | AP + CP 双模式 (有非临时实例时 CP) | 只支持 AP |
| 6. 配置中心 | ✅ 支持(Nacos 也是配置中心) | ❌ 只有注册中心 |
三、5 大区别深度详解
3.1 区别 1:健康检测方式不同
Eureka (老架构):
服务提供者 → 30 秒发一次心跳 → Eureka Server
↓
Eureka Server 90 秒没收到心跳 → 剔除实例
Nacos (新架构):
非临时实例:
Nacos Server → 主动询问 → 服务提供者
↓
Nacos Server 没收到响应 → 标记不健康(**但不剔除**)
临时实例(默认):
服务提供者 → 5 秒发一次心跳 → Nacos Server
↓
Nacos Server 15 秒没收到心跳 → 剔除实例
关键配置:
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
ephemeral: false # ⚠️ false = 非临时实例(Nacos 主动询问)
# ephemeral: true(默认)= 临时实例(服务主动心跳)
3.2 区别 2:服务列表推送 vs 拉取
Eureka (只拉不推):
服务消费者 → 30 秒拉一次 → Eureka Server
- ⚠️ 服务列表变更后,消费者最多延迟 30 秒才能感知
Nacos (推 + 拉):
服务列表变更 → Nacos Server 主动推送 → 服务消费者(实时)
↓
本地缓存
↓
每 10 秒拉一次(兜底)
- ✅ 服务列表变更实时推送
3.3 区别 3:AP / CP 模式
Eureka (只支持 AP):
可用性优先
↓
服务注册信息可能不一致(但保证可用)
Nacos (AP + CP 双模式):
默认 AP(临时实例)
↓
有非临时实例时 → CP(强一致)
Nacos 集群模式配置:
# Nacos 集群部署(3 节点)
192.168.200.130:8848 # 节点 1
192.168.200.131:8848 # 节点 2
192.168.200.132:8848 # 节点 3
3.4 区别 4:配置中心
Eureka:
❌ 只有注册中心
配置中心用 Spring Cloud Config 或 Nacos
Nacos:
✅ 注册中心 + 配置中心(一体化)
配置变更支持动态刷新(@RefreshScope)
Nacos 配置中心实战:
// 1. 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
// 2. 配置 bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.200.130:8848
file-extension: yaml
namespace: mova-prod
// 3. Nacos 控制台添加配置
// Data ID: mova-report-service.yaml
// Group: DEFAULT_GROUP
// 配置内容:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://192.168.200.100:3306/mova
username: mova
password: mova_pwd
// 4. 动态刷新(@RefreshScope)
@RestController
@RefreshScope // ⚠️ 配置变更自动刷新
public class ReportController {
@Value("${mova.report.timeout:5000}")
private Integer timeout;
@GetMapping("/config")
public String getConfig() {
return "timeout=" + timeout;
}
}
3.5 区别 5:服务剔除策略
Eureka (默认剔除):
30 秒没心跳 → 标记不健康
90 秒没心跳 → ⚠️ 直接剔除(强制下线)
Nacos (分情况):
临时实例:
15 秒没心跳 → ⚠️ 剔除
非临时实例:
Nacos 主动询问 → 没响应 → ⚠️ 标记不健康(不剔除)
等待服务恢复(更安全)
关键服务不能随便被剔除------可能只是网络抖动
四、Nacos 完整工作流程
4.1 服务注册流程
服务提供者(mova-report-service)启动
↓
1. 向 Nacos Server 发送注册请求
POST /nacos/v1/ns/instance
{
"ip": "192.168.200.101",
"port": 8081,
"serviceName": "mova-report-service",
"ephemeral": false
}
↓
2. Nacos Server 验证服务信息
↓
3. 存储到内存 + 持久化到文件
↓
4. 返回注册成功
4.2 服务发现流程
服务消费者(user-service)启动
↓
1. 从 Nacos Server 拉取服务列表
GET /nacos/v1/ns/instance/list?serviceName=mova-report-service
↓
2. Nacos Server 返回服务列表
[
{ip: "192.168.200.101", port: 8081},
{ip: "192.168.200.102", port: 8081}
]
↓
3. 消费者本地缓存服务列表(user-service 内存)
↓
4. Ribbon 从列表中选一个实例(负载均衡)
↓
5. Feign 发起远程调用
4.3 健康检查流程
临时实例 (ephemeral: true):
服务提供者 → 每 5 秒发心跳 → Nacos Server
↓
Nacos Server 15 秒没收到 → ⚠️ 剔除服务
非临时实例 (ephemeral: false):
Nacos Server → 每 5 秒主动询问 → 服务提供者
↓
服务提供者没响应 → 标记不健康(**不剔除**)
↓
服务提供者恢复 → Nacos 标记健康
4.4 消息推送流程
服务提供者变更(新增/下线/健康状态变化)
↓
Nacos Server 检测到变化
↓
Nacos Server 主动 UDP 推送 → 所有订阅了该服务的消费者
↓
消费者更新本地服务列表缓存
↓
Ribbon 重新选择实例
五、Nacos vs Eureka 完整对比
| 维度 | Nacos | Eureka |
|---|---|---|
| 健康检查 | 服务端主动询问 | 客户端心跳 |
| 临时实例 | ✅ 支持(默认) | ❌ 不支持 |
| 非临时实例 | ✅ 支持 | ❌ 不支持 |
| 消息推送 | ✅ 主动推送(实时) | ❌ 只拉取(30 秒延迟) |
| 集群模式 | AP + CP 双模式 | 只支持 AP |
| 配置中心 | ✅ 注册中心 + 配置中心 | ❌ 只有注册中心 |
| 动态刷新 | ✅ @RefreshScope |
❌ 需要 Config |
| 社区活跃度 | ⚠️⚠️⚠️ 阿里维护,活跃 | ⚠️ 停止维护 |
六、Nacos 完整配置
6.1 Nacos Server 部署
# 1. 下载 Nacos
wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz
tar -xvf nacos-server-2.2.0.tar.gz
cd nacos/bin
# 2. 单机模式启动
sh startup.sh -m standalone
# 3. 集群模式启动(3 节点)
sh startup.sh -m cluster
# 4. 访问控制台
# http://192.168.200.130:8848/nacos
# 默认账号密码:nacos / nacos
6.2 业务服务配置
# application.yml(MOVA 报表服务)
spring:
application:
name: mova-report-service
cloud:
nacos:
# 1. 注册中心
discovery:
server-addr: 192.168.200.130:8848
namespace: mova-prod
group: DEFAULT_GROUP
ephemeral: false # ⚠️ 非临时实例(mpvs 关键时点用)
# 2. 配置中心
config:
server-addr: 192.168.200.130:8848
namespace: mova-prod
group: DEFAULT_GROUP
file-extension: yaml
6.3 Nacos 控制台配置
Data ID: mova-report-service.yaml
Group: DEFAULT_GROUP
Namespace: mova-prod
配置内容:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://192.168.200.100:3306/mova
6.4 Nacos 集群配置
# nacos/conf/cluster.conf
192.168.200.130:8848
192.168.200.131:8848
192.168.200.132:8848
七、Nacos 4 大使用场景
场景 1:服务注册与发现
// 服务提供者
@SpringBootApplication
@EnableDiscoveryClient // 启用 Nacos 发现
public class MOVAReportApplication {
public static void main(String[] args) {
SpringApplication.run(MOVAReportApplication.class, args);
}
}
场景 2:动态配置刷新
@RestController
@RefreshScope // 配置变更自动刷新
public class MOVAConfig {
@Value("${mova.timeout:5000}")
private Integer timeout;
}
场景 3:服务分组管理
XML
spring:
cloud:
nacos:
discovery:
group: MOVA_GROUP
spring:
cloud:
nacos:
discovery:
group: MPVS_GROUP
场景 4:命名空间隔离
# 开发环境
spring:
cloud:
nacos:
discovery:
namespace: dev
# 生产环境
spring:
cloud:
nacos:
discovery:
namespace: prod
八、Nacos 实战对照
| Nacos 配置 | 用途 | 业务价值 |
|---|---|---|
| ephemeral: true | 高可用 | 报表服务快速注册 |
| ephemeral: false | 强一致 | 27 家分行不能被误剔除 |
| ephemeral: true | 简单 | 采集服务注册 |
| ❌ Eureka 老架构 | 维护 | 不用升级 |
九、面试官 8 大追问
追问 1:Nacos vs Eureka 区别?
"5 大区别:
1.健康检查:Nacos 服务端主动询问 vs Eureka 客户端心跳
2.临时实例:Nacos 支持 vs Eureka 不支持
3.消息推送:Nacos 实时推送 vs Eureka 30 秒拉取
4.AP/CP:Nacos 双模式 vs Eureka 只 AP
5.配置中心:Nacos 一体化 vs Eureka 单独
追问 2:Nacos 临时实例和非临时实例?
"临时实例(默认) :服务主动心跳,15 秒没心跳剔除 。高可用场景 。
非临时实例 :Nacos 主动询问,没响应标记不健康但不剔除 。强一致场景。
追问 3:Nacos AP 还是 CP?
"默认 AP (临时实例)。有非临时实例时 CP 。
老哥项目 :MOVA 用 AP (高可用),mpvs 用 CP(强一致)。"
追问 4:Nacos 消息推送怎么实现的?
"UDP 推送 。Nacos 检测到服务列表变更,主动推送到所有订阅该服务的消费者 。
Eureka 是 HTTP 拉取 ------30 秒延迟 。
关键功能必须用 Nacos ------服务列表变更需要实时感知。"
追问 5:Nacos 配置中心怎么用?
"3 步:
1.引入
spring-cloud-starter-alibaba-nacos-config2.配置
spring.cloud.nacos.config.server-addr3.
@RefreshScope动态刷新配置变更不重启。"
追问 6:Nacos 集群怎么部署?
"3 节点:
- 192.168.200.130:8848
- 192.168.200.131:8848
- 192.168.200.132:8848
Nacos 自动选 Leader(Raft 算法)。"
追问 7:Nacos 命名空间怎么用?
"4 个标准命名空间:
- dev(开发)
- test(测试)
- staging(预发)
- prod(生产)
追问 8:为什么 Nacos 越来越火?
"3 大原因:
1.注册中心 + 配置中心一体化(少一个组件)
2.AP/CP 双模式(更灵活)
3.阿里生态(Spring Cloud Alibaba 主推)