当前位置: 首页 > news >正文

Spring Cloud整合Eureka、ZooKeeper、原理分析

一、核心原理对比

1. Eureka(AP模型:可用性优先)

  • 架构设计
    • 对等复制:无主从节点,所有节点平等,注册表存储在内存(ConcurrentHashMap)。
    • 服务注册流程
      1. 注册:客户端通过POST请求将元数据(IP、端口等)注册至Eureka Server。
      2. 心跳续约:客户端每30秒发送PUT请求续约,超时90秒未收到则标记为DOWN。
      3. 服务剔除:连续3次心跳失败后,Server从注册表移除实例,并广播事件至集群。
    • 自我保护机制
      • 当15分钟内心跳失败率超85%时,停止剔除实例,防止网络故障误删健康服务。
      • 管理页面显示警告,网络恢复后自动退出保护模式。
  • 数据一致性
    • 牺牲强一致性,允许短暂数据不一致,确保至少一个节点可用。
    • 客户端缓存注册表,每30秒增量更新,支持轮询、随机等负载均衡策略。

2. ZooKeeper(CP模型:一致性优先)

  • 架构设计
    • 主备模式:基于ZAB协议(ZooKeeper Atomic Broadcast),Leader处理写请求,Follower处理读请求,Observer提升读性能。
    • 服务注册流程
      1. 注册:客户端创建临时节点存储服务信息,会话超时(默认60秒)后节点自动删除。
      2. 心跳:通过会话维持,临时节点存活依赖客户端心跳。
      3. 发现:客户端监听节点变化(Watcher机制),实时更新服务列表。
    • 崩溃恢复
      • Leader故障时,集群进入选举模式(30-120秒),选出新Leader后同步数据。
  • 数据一致性
    • 通过ZAB协议确保强一致性,所有写操作需经Leader同步至过半节点。
    • 消息广播采用二阶段提交(Proposal → ACK → Commit),保证事务顺序。

3、服务注册与发现流程对比

步骤EurekaZooKeeper
注册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 场景(高可用、分区容忍)。

整合步骤:

  1. 添加依赖(服务端)

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    

  2. 启动类注解(服务端)

    @SpringBootApplication
    @EnableEurekaServer // 启用Eureka服务端
    public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
    }
    

  3. 客户端配置(微服务)

    # application.yml
    eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ # 注册中心地址
    


2. ZooKeeper 服务注册中心

ZooKeeper 是强一致性的分布式协调服务(CP 系统),适用于需要强一致性的场景。

下载版本

http://archive.apache.org/dist/zookeeper/

解压zookeeper的压缩包到/export/servers路径下去,然后准备进行安装

整合步骤:

  1. 添加依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
    

  2. 配置连接

    # application.yml
    spring:cloud:zookeeper:connect-string: localhost:2181 # ZooKeeper地址
    

  3. 启用服务发现

    @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

  1. 网关层统一接入
    使用 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() 避免脏数据残留。

http://www.dtcms.com/a/335504.html

相关文章:

  • 牛客周赛 Round 104(小红的矩阵不动点/小红的不动点权值)
  • 【Netty核心解密】Channel与ChannelHandlerContext:网络编程的双子星
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?
  • Mac(四)自定义按键工具 Hammerspoon 的安装和使用
  • Baumer高防护相机如何通过YoloV8深度学习模型实现行人跌倒的检测识别(C#代码UI界面版)
  • Redis入门1
  • 【Leetcode hot 100】189.轮转数组
  • 【C2000】C2000例程使用介绍
  • 24. 什么是不可变对象,好处是什么
  • Flink作业执行的第一步:DataFlow graph的构建
  • 一周学会Matplotlib3 Python 数据可视化-多子图及布局实现
  • 【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板
  • Python可视化工具-Bokeh:动态显示数据
  • 【Golang】:错误处理
  • 10 SQL进阶-SQL优化(8.15)
  • 【Luogu】每日一题——Day21. P3556 [POI 2013] MOR-Tales of seafaring (图论)
  • 中国大学MOOC--C语言程序设计第十周字符串(下)
  • openEuler等Linux系统中如何复制移动硬盘的数据
  • HTTPS 配置与动态 Web 内容部署指南
  • Hadoop入门
  • SpringCloud 06 服务容错 Sentinel
  • NY270NY273美光固态闪存NY277NY287
  • 黎阳之光:以动态感知与 AI 深度赋能,引领电力智慧化转型新革命
  • mysql||事务相关知识
  • nertctl使用了解
  • Node.js导入MongoDB具体操作
  • IoT/HCIP实验-5/基于WIFI的智慧农业实验(LwM2M/CoAP+PSK+ESP8266 连接到 IoTDA)
  • python study notes[4]
  • Vue深入组件:Props 详解3
  • 【adb端口5555】烽火hg680-gy_烽火hg680-gc安卓9线刷烧录包 解决用一段时间就提示升级的问题