5月27日 23:26
什么是服务注册与发现?注册中心如何选型?
答案
服务注册与发现是微服务中解决"实例动态管理"的核心机制:服务注册是实例启动时将地址信息写入注册中心,服务发现是调用方从注册中心拉取可用实例列表。注册中心是两者的协调中介,同时负责健康检查和故障剔除。
主流注册中心按 CAP 模型分两派:
- AP 派:Eureka — 自我保护机制,网络分区时保留过期数据仍可查询,但可能拿到已下线实例。Spring Cloud 集成好,2.x 已停维。
- CP 派:Zookeeper(ZAB)、Etcd(Raft)、Consul(Raft) — 主节点宕机时拒绝写入直到选主完成,牺牲可用性换一致性。
- 混合派:Nacos — 临时实例走 AP(Distro 协议),持久化实例走 CP(Raft 协议),是国内微服务首选。
追问一:Eureka 自我保护机制?
心跳续约比例低于阈值(默认85%)时进入自我保护:不再剔除过期实例。防止网络抖动导致误剔除,代价是可能调用到已死实例,需配合重试和熔断。
追问二:Nacos 如何实现 AP/CP 切换?
临时实例(ephemeral)用 Distro 协议(AP),节点平等写入并异步同步;持久化实例(persistent)用 Raft 协议(CP),写入需多数派确认。无状态服务用 AP,有状态服务用 CP。
追问三:客户端发现 vs 服务端发现?
- 客户端发现:调用方自己拉取实例列表做负载均衡(Eureka/Nacos),少一跳但客户端逻辑重。
- 服务端发现:请求先到代理(K8s Service/Nginx)再转发,客户端无感知但多一跳延迟。
选型速判
Spring Cloud Alibaba → Nacos;K8s → Etcd + CoreDNS;多数据中心 + 服务网格 → Consul;强一致性 → Zookeeper。Eureka 仅适合已有 Netflix 栈项目维护。
yaml# Nacos 临时实例配置(AP 模式) spring: cloud: nacos: discovery: server-addr: localhost:8848 namespace: dev # ephemeral: true # 默认 true,即 AP 模式 # Nacos 持久化实例配置(CP 模式) spring: cloud: nacos: discovery: server-addr: localhost:8848 ephemeral: false # 切换为 CP 模式