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 主推)

相关推荐
DolitD32 分钟前
实时云渲染多应用并发:CELL容器技术突破3D隔离瓶颈
云原生·容器·实时互动·图形渲染·数据可视化
鹤落晴春1 小时前
【K8s】Kustomize管理
云原生·容器·kubernetes
重生之我是Java开发战士4 小时前
【Spring Cloud】认识微服务与工程搭建
spring·spring cloud·微服务
bruce1284 小时前
K8s Pod 异常重启排查
云原生·容器·kubernetes
MetaLite4 小时前
微服务认证选型-SpringSecurity-SaToken与自研方案
微服务·云原生·架构
运维老郭7 小时前
Prometheus 监控 K8s 从入门到入坑:工作原理 + 部署实操 + 避坑指南
云原生·容器·kubernetes
AAA@峥7 小时前
从零搭建 Prometheus 完整监控告警体系|Linux 部署 + node_exporter+Grafana 可视化
云原生·grafana·prometheus
10mAh8 小时前
【Docker】磁盘空间被占满怎么清理?——overlay2、容器日志与 Build Cache 排查实战
docker·容器·eureka
SelectDB技术团队9 小时前
Apache Doris 多云原生实践:SaaS、BYOC 与四大公有云覆盖
数据库·阿里云·云原生·华为云·腾讯云·亚马逊云·写入更新
鹤落晴春18 小时前
有状态应用 vs 无状态应用
运维·云原生·k8s