Nacos vs Eureka

一、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):

复制代码
可用性优先
   ↓
服务注册信息可能不一致(但保证可用)

NacosAP + 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-config

2.配置 spring.cloud.nacos.config.server-addr

3.@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 主推)

相关推荐
Jul1en_2 小时前
【SpringCloud】SkyWalking 链路追踪知识详解及部署教程
java·后端·spring·spring cloud·skywalking
万能的知了3 小时前
K8s到底需不需要GPU节点?集群资源分配的底层逻辑
云原生·容器·kubernetes
我登哥MVP3 小时前
SpringCloud Alibaba 核心组件解析:服务熔断和降级
java·spring boot·后端·spring·spring cloud·java-ee·maven
我登哥MVP4 小时前
SpringCloud Alibaba 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
Moshow郑锴4 小时前
Ubuntu26.04之Docker配置国内镜像加速器
云原生·eureka
Jooolin13 小时前
从 DeepSeek、Qwen 到 GPT:一次企业级 AI 知识库项目的模型选型复盘
人工智能·云原生·ai编程
阿里云云原生18 小时前
AI Agent 如何“驾驭”云监控?实测自然语言驱动的全链路可观测运维
云原生
JiaHao汤19 小时前
分布式事务方案全景:从理论到 Seata 落地
java·分布式·spring·spring cloud
Wyc7240920 小时前
Nacos
spring cloud