跳到主要内容

注册中心

问题

微服务架构中注册中心的作用是什么?Nacos 和 Eureka 有什么区别?

答案

为什么需要注册中心

微服务之间的调用不再是固定 IP + 端口,而是动态发现。注册中心解决服务实例的注册、发现和健康管理。

主流注册中心对比

特性NacosEurekaConsulZookeeper
CAPAP + CP 可切换APCPCP
健康检查TCP/HTTP/MySQL/自定义客户端心跳TCP/HTTP/gRPC/Script会话保持
配置中心内置KV 存储可实现
控制台开箱即用简单功能完整
推送模型推 + 拉 结合拉(30s 周期)长轮询Watch
生态阿里生态,国内主流Netflix(已停止维护)HashiCorpApache
推荐

新项目推荐使用 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 核心区别

对比NacosEureka
一致性模型AP(临时实例)/ CP(持久实例)AP
服务变更通知推送 + 拉取(实时性好)客户端拉取(默认 30s)
健康检查服务端主动探测 + 客户端心跳仅客户端心跳
临时/持久实例支持不支持
配置中心内置不支持
权重路由支持不支持
维护状态活跃更新停止维护
临时实例 vs 持久实例(Nacos)
  • 临时实例(默认):客户端心跳维持,心跳停止则剔除。适合微服务
  • 持久实例:服务端主动健康检查,不会自动剔除。适合数据库、中间件等基础设施

常见面试问题

Q1: 注册中心的作用?

答案

注册中心是微服务架构的核心组件,负责三件事:

  1. 服务注册:服务启动后向注册中心注册自己的地址
  2. 服务发现:消费者从注册中心获取提供者的实例列表
  3. 健康管理:通过心跳或主动探测剔除不可用实例

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 分钟

可以通过缩短拉取间隔、配合重试和熔断来缓解延迟感知问题。

相关链接