一、核心原理对比
1. Eureka(AP模型:可用性优先)
- 架构设计:
- 对等复制:无主从节点,所有节点平等,注册表存储在内存(
ConcurrentHashMap
)。 - 服务注册流程:
- 注册:客户端通过POST请求将元数据(IP、端口等)注册至Eureka Server。
- 心跳续约:客户端每30秒发送PUT请求续约,超时90秒未收到则标记为DOWN。
- 服务剔除:连续3次心跳失败后,Server从注册表移除实例,并广播事件至集群。
- 自我保护机制:
- 当15分钟内心跳失败率超85%时,停止剔除实例,防止网络故障误删健康服务。
- 管理页面显示警告,网络恢复后自动退出保护模式。
- 对等复制:无主从节点,所有节点平等,注册表存储在内存(
- 数据一致性:
- 牺牲强一致性,允许短暂数据不一致,确保至少一个节点可用。
- 客户端缓存注册表,每30秒增量更新,支持轮询、随机等负载均衡策略。
2. ZooKeeper(CP模型:一致性优先)
- 架构设计:
- 主备模式:基于ZAB协议(ZooKeeper Atomic Broadcast),Leader处理写请求,Follower处理读请求,Observer提升读性能。
- 服务注册流程:
- 注册:客户端创建临时节点存储服务信息,会话超时(默认60秒)后节点自动删除。
- 心跳:通过会话维持,临时节点存活依赖客户端心跳。
- 发现:客户端监听节点变化(Watcher机制),实时更新服务列表。
- 崩溃恢复:
- Leader故障时,集群进入选举模式(30-120秒),选出新Leader后同步数据。
- 数据一致性:
- 通过ZAB协议确保强一致性,所有写操作需经Leader同步至过半节点。
- 消息广播采用二阶段提交(Proposal → ACK → Commit),保证事务顺序。
3、服务注册与发现流程对比
步骤 | Eureka | ZooKeeper |
---|---|---|
注册 | POST请求至Server,内存存储 | 创建临时节点,会话绑定 |
心跳 | 客户端每30秒续约,超时90秒标记DOWN | 会话心跳维持,超时删除节点 |
发现 | 客户端缓存注册表,每30秒增量更新 | Watcher监听节点变化,实时更新 |
故障处理 | 自我保护机制,停止剔除实例 | 立即剔除故障节点,无保护机制 |
4、故障处理与扩展性
4.1. 故障处理
- Eureka:
- 自我保护:网络波动时保留实例,防止误删健康服务。
- 集群容错:单节点故障不影响整体服务,客户端自动切换至其他节点。
- ZooKeeper:
- 快速剔除:故障节点立即删除,但依赖网络稳定性。
- 选举恢复:Leader故障时进入选举模式,恢复时间较长(30-120秒)。
4.2. 扩展性
- Eureka:
- 水平扩展:新增节点自动同步注册表,无需配置。
- 多数据中心:需手动配置跨中心同步,支持较弱。
- ZooKeeper:
- 集群扩展:需手动部署跨中心集群,原生支持多数据中心能力弱。
- 功能扩展:支持分布式锁、配置管理等协调功能。
5、适用场景
5.1. Eureka
- 典型场景:
- 微服务架构:电商订单、支付服务,需高可用性,容忍短暂数据不一致。
- 云原生部署:与K8s配合,实现容器化服务自动注册与发现。
- 优势:快速响应服务状态变化,适合动态扩缩容场景。
5.2. ZooKeeper
- 典型场景:
- 分布式协调:分布式锁、集群选举、配置同步。
- 金融交易:需强一致性保证,如交易顺序校验。
- 优势:数据准确性高,适合对一致性要求严格的场景。
二、整合
1. Eureka 服务注册中心
Eureka 是 Netflix 开源的服务发现组件,适用于 AP 场景(高可用、分区容忍)。
整合步骤:
添加依赖(服务端)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
启动类注解(服务端)
@SpringBootApplication @EnableEurekaServer // 启用Eureka服务端 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
客户端配置(微服务)
# application.yml eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册中心地址
2. ZooKeeper 服务注册中心
ZooKeeper 是强一致性的分布式协调服务(CP 系统),适用于需要强一致性的场景。
下载版本
http://archive.apache.org/dist/zookeeper/
解压zookeeper的压缩包到/export/servers路径下去,然后准备进行安装
整合步骤:
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> </dependency>
配置连接
# application.yml spring: cloud: zookeeper: connect-string: localhost:2181 # ZooKeeper地址
启用服务发现
@SpringBootApplication @EnableDiscoveryClient // 通用服务发现注解 public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } }
禁止同时注册
同一服务不可同时注册到两个注册中心,会导致路由混乱:
# 错误示例(禁止):
eureka.client.enabled: true
spring.cloud.zookeeper.enabled: true
网关层统一接入
使用 Spring Cloud Gateway 配置多注册中心路由:@Bean public DiscoveryClientRouteDefinitionLocator dynamicRoutes(DiscoveryClient discoveryClient) { return new DiscoveryClientRouteDefinitionLocator(discoveryClient); }
5. 健康检查配置
确保服务状态实时同步:
# Eureka 健康检查
eureka:
client:
healthcheck:
enabled: true
# ZooKeeper 会话超时(默认60秒)
spring:
cloud:
zookeeper:
discovery:
instance-id: ${spring.application.name}:${random.value}
session-timeout: 30000
最佳实践:
服务下线时主动调用DiscoveryClient.shutdown()
避免脏数据残留。