注册中心
问题
微服务架构中注册中心的作用是什么?Nacos 和 Eureka 有什么区别?
答案
为什么需要注册中心
微服务之间的调用不再是固定 IP + 端口,而是动态发现。注册中心解决服务实例的注册、发现和健康管理。
主流注册中心对比
| 特性 | Nacos | Eureka | Consul | Zookeeper |
|---|---|---|---|---|
| CAP | AP + CP 可切换 | AP | CP | CP |
| 健康检查 | TCP/HTTP/MySQL/自定义 | 客户端心跳 | TCP/HTTP/gRPC/Script | 会话保持 |
| 配置中心 | 内置 | 无 | KV 存储 | 可实现 |
| 控制台 | 开箱即用 | 简单 | 功能完整 | 无 |
| 推送模型 | 推 + 拉 结合 | 拉(30s 周期) | 长轮询 | Watch |
| 生态 | 阿里生态,国内主流 | Netflix(已停止维护) | HashiCorp | Apache |
推荐
新项目推荐使用 Nacos:同时提供注册中心 + 配置中心,功能全面,国内社区活跃。Eureka 2.x 已停止开发。
Nacos 使用
application.yml — Nacos 注册
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev # 命名空间(环境隔离)
group: DEFAULT_GROUP # 分组
cluster-name: HZ # 集群名(同机房优先调用)
Eureka 核心机制
自我保护机制:当 Eureka Server 发现短时间内大量服务心跳失败(>15%),会进入自我保护模式,不再剔除实例。这是对网络分区的容错——宁可保留不可用的实例信息,也不误删健康实例。
Nacos vs Eureka 核心区别
| 对比 | Nacos | Eureka |
|---|---|---|
| 一致性模型 | AP(临时实例)/ CP(持久实例) | AP |
| 服务变更通知 | 推送 + 拉取(实时性好) | 客户端拉取(默认 30s) |
| 健康检查 | 服务端主动探测 + 客户端心跳 | 仅客户端心跳 |
| 临时/持久实例 | 支持 | 不支持 |
| 配置中心 | 内置 | 不支持 |
| 权重路由 | 支持 | 不支持 |
| 维护状态 | 活跃更新 | 停止维护 |
临时实例 vs 持久实例(Nacos)
- 临时实例(默认):客户端心跳维持,心跳停止则剔除。适合微服务
- 持久实例:服务端主动健康检查,不会自动剔除。适合数据库、中间件等基础设施
常见面试问题
Q1: 注册中心的作用?
答案:
注册中心是微服务架构的核心组件,负责三件事:
- 服务注册:服务启动后向注册中心注册自己的地址
- 服务发现:消费者从注册中心获取提供者的实例列表
- 健康管理:通过心跳或主动探测剔除不可用实例
Q2: Nacos 和 Eureka 的区别?
答案:
Nacos 支持 AP/CP 切换,内置配置中心,服务变更实时推送,支持权重路由和临时/持久实例,正在活跃开发。Eureka 是纯 AP 模型,客户端 30s 拉取,无配置中心,已停止维护。新项目推荐 Nacos。
Q3: CAP 理论中,注册中心选 AP 还是 CP?
答案:
大多数微服务场景选 AP(可用性 + 分区容忍性)。原因是注册中心的核心诉求是高可用——即使返回的实例列表不是最新的(短暂不一致),也不能让服务调用完全中断。配合客户端缓存和重试机制可以容忍短暂的数据不一致。
Q4: Eureka 的自我保护机制?
答案:
当 Eureka Server 在 15 分钟内心跳失败比例超过 85% 时,进入自我保护模式,不再剔除任何实例。这是防止网络抖动导致大面积误剔除。缺点是可能保留已下线的实例。可通过 eureka.server.enable-self-preservation=false 关闭(不推荐在生产环境关闭)。
Q5: 服务下线后消费者多久能感知?
答案:
- Nacos:推送机制,通常秒级感知
- Eureka:最长可能 30s(客户端缓存刷新周期)+ 30s(Server 端注册表缓存更新)+ 90s(心跳超时),最慢约 2-3 分钟
可以通过缩短拉取间隔、配合重试和熔断来缓解延迟感知问题。
相关链接
- Nacos 官方文档
- Spring Cloud Netflix
- 分布式系统基础 - CAP 理论