服务注册与发现(Nacos/Eureka)?

2025年 阅读约 15 分钟 面试指南 · Spring Cloud

深入解析服务注册与发现:Nacos vs Eureka对比、AP vs CP模式、心跳机制与健康检查、自我保护模式、Nacos 2.x gRPC长连接,附面试模拟问答。

一句话总结

注册中心是微服务架构的通讯录,负责服务注册、发现、健康检查。核心流程:服务提供者启动 → 向注册中心注册(IP+端口+元数据)→ 服务消费者从注册中心获取服务列表 → 通过负载均衡调用。Nacos vs Eureka:Nacos 功能更全(配置中心+注册中心合一)、支持 AP/CP 切换、2.x 使用 gRPC 长连接;Eureka 只做注册中心、纯 AP、2.x 已停止维护。生产推荐 Nacos

初级理解

注册中心工作流程

# 服务注册与发现流程 # 1. 服务提供者启动 → 向注册中心注册 # POST /nacos/v1/ns/instance # {serviceName: "user-service", ip: "192.168.1.1", port: 8080} # 2. 服务消费者启动 → 从注册中心订阅服务 # GET /nacos/v1/ns/instance/list?serviceName=user-service # → [{ip: "192.168.1.1", port: 8080}, {ip: "192.168.1.2", port: 8080}] # 3. 服务提供者定期发送心跳(续约) # PUT /nacos/v1/ns/instance/beat # 默认 5 秒一次 # 4. 注册中心检测心跳超时 → 剔除不健康实例 # 默认 15 秒无心跳 → 标记不健康 # 默认 30 秒无心跳 → 剔除 # 5. 注册中心推送变更给消费者 # 服务列表变化 → 通知消费者更新本地缓存

中级深入

Nacos vs Eureka

对比维度NacosEureka
CAPAP/CP 可切换AP
功能注册中心 + 配置中心仅注册中心
健康检查TCP/HTTP/MySQL 多种心跳机制
通信协议HTTP(1.x)/ gRPC(2.x)HTTP
保护机制保护阈值(0-1)自我保护模式
维护状态活跃维护2.x 停止维护

Nacos 2.x gRPC 长连接

# Nacos 1.x:HTTP 心跳(短连接) # 每个实例每 5 秒发一次 HTTP 请求 # 问题:连接频繁创建销毁,资源消耗大 # Nacos 2.x:gRPC 长连接 # 客户端与服务端建立 gRPC 双向流 # 通过流发送心跳和接收配置变更 # 优点: # 1. 长连接复用,减少连接开销 # 2. 服务端可主动推送变更(实时性高) # 3. 支持大规模实例(单机 10 万+)

高级拓展

Eureka 自我保护模式

# 自我保护模式触发条件 # 15 分钟内,心跳失败比例 < 85% # 触发后行为 # 不再剔除任何实例(即使心跳超时) # 保护已有的服务列表不丢失 # 为什么需要? # 网络分区时,Eureka 和客户端之间网络不通 # 但客户端之间网络正常 # 如果剔除所有实例,服务就不可用了 # 自我保护保留实例,客户端之间仍可通信 # 配置 eureka: server: enable-self-preservation: true # 默认开启 renewal-percent-threshold: 0.85 # 阈值

Nacos AP vs CP 切换

# Nacos 支持 AP 和 CP 模式切换 # AP 模式(默认):临时实例 # - 实例注册时 ephemeral=true # - 使用 Distro 协议(AP) # - 适合一般微服务场景 # CP 模式:持久化实例 # - 实例注册时 ephemeral=false # - 使用 Raft 协议(CP) # - 适合对一致性要求高的场景(如 DNS 服务发现) # 切换方式 # 1. 注册实例时指定 ephemeral 参数 # 2. Nacos 服务端配置 # nacos.core.auth.enabled=true 时默认 CP

实战场景

场景:Nacos 集群部署

# Nacos 集群部署(3 节点) # 1. 每个节点独立部署 # 2. 使用 MySQL 存储配置数据(集群共享) # 3. 使用 cluster.conf 配置集群节点列表 # cluster.conf 192.168.1.1:8848 192.168.1.2:8848 192.168.1.3:8848 # application.properties spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://mysql:3306/nacos_config # 客户端连接 spring: cloud: nacos: discovery: server-addr: 192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848

面试模拟

面试官:Nacos 和 Eureka 有什么区别?

你:Nacos 功能更全(注册+配置二合一),支持 AP/CP 切换,2.x 使用 gRPC 长连接性能更好。Eureka 只做注册中心,纯 AP,2.x 已停止维护。生产环境推荐 Nacos。

面试官:Eureka 的自我保护模式是什么?

你:当 15 分钟内心跳失败比例低于 85% 时触发,不再剔除任何实例。目的是防止网络分区时误删健康实例。这是一种宁可保留错误数据也要保证可用性的 AP 思想体现。