Spring Cloud Eureka 的实现原理

Eureka 是 Netflix 开源的服务发现组件,Spring Cloud 将其集成,提供了基于 Java 的微服务体系中客户端服务发现的能力。它的核心思想是 "注册与发现"

一、核心架构图

下图清晰地展示了 Eureka 的核心架构和组件交互:

二、核心角色

从架构图中可以看出,Eureka 包含三个核心角色:

  1. Eureka Server(服务端)

    • 作用:服务注册中心,一个独立的部署单元,通常以集群模式部署。

    • 功能

      • 提供服务注册功能,接收来自 Eureka Client 的注册信息。

      • 存储和管理所有可用的服务实例信息,即服务注册表(Registry)

      • 提供心跳监控,剔除故障的实例。

      • 提供服务查询接口,供消费者获取服务列表。

  1. Eureka Client(客户端 - 服务提供者)

    • 作用:将自己的服务注册到 Eureka Server,并使自身服务信息对消费者可用。

    • 功能

      • 在应用启动时,向 Eureka Server 注册 自身信息(如服务名、IP、端口等)。

      • 定期向 Eureka Server 发送心跳(默认30秒一次)以续约,表明自己"健康存活"。

      • 当服务关闭时,向 Eureka Server 发送取消注册 请求,从注册列表中移除自己。

  1. Eureka Client(客户端 - 服务消费者)

    • 作用:从 Eureka Server 获取服务提供者列表,并基于该列表发起远程调用。

    • 功能

      • 在应用启动时或需要时,从 Eureka Server 拉取(Fetch) 服务注册表,并缓存在本地。

      • 定期(默认30秒一次)从 Eureka Server 增量更新 本地缓存的服务列表。

      • 结合客户端负载均衡器(如 Ribbon),从本地服务列表中选择一个实例进行调用。

三、核心实现原理与工作机制

1. 服务注册(Register)
  • 流程

    1. 服务提供者(Eureka Client)在启动时,读取配置的 eureka.client.service-url.defaultZone,找到 Eureka Server 的地址。

    2. 向 Eureka Server 发送 POST 请求,携带自身的元数据信息(如 appNameinstanceIdipAddrport 等)。

    3. Eureka Server 接收到注册请求后,将实例信息存储在一个双层的 ConcurrentHashMap 结构中(第一层 key 是服务名 appName,第二层 key 是实例ID instanceId)。

  • 核心数据结构 :服务注册表 Registry
2. 心跳续约与健康检查(Renew)
  • 流程

    1. 服务提供者注册成功后,会启动一个定时任务,每隔30秒(默认) 向 Eureka Server 发送一次 PUT 请求,即"心跳"。

    2. Eureka Server 接收到心跳后,会更新该实例的"最后续约时间"(lastUpdateTimestamp)。

    1. 如果 Eureka Server 在90秒(默认)内 没有收到某个实例的心跳,它会认为该实例已经故障,会将其从注册表中剔除(Evict) 。这个机制称为服务剔除
  • 可配置参数

    • eureka.instance.lease-renewal-interval-in-seconds:客户端心跳间隔,默认30s。

    • eureka.instance.lease-expiration-duration-in-seconds:服务端等待心跳的超时时间,默认90s。

3. 服务获取与缓存(Fetch Registry)
  • 全量获取

    • 服务消费者(Eureka Client)在启动时,会第一次从 Eureka Server 全量拉取 所有服务注册信息,并缓存到本地。
  • 增量获取

    • 之后,客户端会每隔30秒(默认) 向 Eureka Server 发起一次增量获取请求,只获取发生变化(新增、下线)的注册信息,来更新本地缓存。

    • 这种设计极大地减少了网络传输的数据量,提升了效率。

  • 优点 :消费者直接从本地缓存获取服务列表进行调用,即使 Eureka Server 集群全部宕机,短时间内仍能基于本地缓存进行服务间通信,保证了系统的高可用性。

服务下线(Cancel)
  • 流程

    1. 当服务提供者正常关闭(如执行 SpringApplication.exit())时,会向 Eureka Server 发送一个 DELETE 请求。

    2. Eureka Server 接收到请求后,会立即将该实例从注册表中移除。

  • 作用:保证服务列表的实时性,避免消费者调用到已下线的实例。

5. 自我保护机制(Self Preservation)

这是 Eureka 一个非常重要且独特的特性。

服务下线(Cancel)
  • 流程

    1. 当服务提供者正常关闭(如执行 SpringApplication.exit())时,会向 Eureka Server 发送一个 DELETE 请求。

    2. Eureka Server 接收到请求后,会立即将该实例从注册表中移除。

  • 作用:保证服务列表的实时性,避免消费者调用到已下线的实例。

5. 自我保护机制(Self Preservation)

这是 Eureka 一个非常重要且独特的特性。

、Eureka Server 集群的工作原理

Eureka Server 通过互相注册的方式组成集群,以实现高可用。

  • 对等复制(Peer to Peer Replication)

    1. 每个 Eureka Server 都是对等的节点,没有主从之分。

    2. 当某个 Eureka Client 向其中一个 Eureka Server 节点注册时,该节点会将这个注册请求转发(Replicate) 到集群中的其他所有节点。

    3. 同样,心跳、下线等操作也会被同步复制。

  • 最终一致性 :Eureka 集群的数据同步是异步的,这意味着在某个时刻,集群中各节点的数据可能不是严格一致的,但最终会达成一致。这种弱一致性模型牺牲了强一致性,换来了高可用性和分区容错性(符合 CAP 理论中的 AP)。

总结

特性 实现机制 设计目标
服务注册 客户端启动时向 Server 发送 POST 请求 中心化服务信息管理
服务发现 客户端拉取并缓存 Server 的注册表 快速、低延迟的本地调用
健康监控 客户端定时发送心跳,Server 超时剔除 自动感知和处理故障实例
高可用 Server 组成集群,通过 P2P 复制数据 消除单点故障
容错性 自我保护机制 防止网络波动导致的服务列表清空,保证 AP

Eureka 通过其简单的客户端心跳、服务端缓存和独特的自我保护机制,提供了一个非常健壮和容错的服务发现解决方案,特别适合部署在可能发生网络不稳定的云环境中。

相关推荐
你不是我我5 小时前
【Java 开发日记】我们来说一下 Mybatis 的缓存机制
java·spring·mybatis
昵称为空C6 小时前
SpringBoot基于注解的数据库字段回填方案
spring boot·spring
掘根6 小时前
【Docker】docker compose
docker·容器·eureka
optimistic_chen6 小时前
【Java EE进阶 --- SpringBoot】Spring 核心 --- AOP
spring boot·笔记·spring·java-ee·aop·java注解
虎子_layor6 小时前
轻量级哈希扰动工具:Hashids,快速上手
java·spring
java_logo7 小时前
PERL Docker 容器化部署指南
linux·运维·docker·容器·eureka·centos·perl
杰克尼8 小时前
Springcloud_day01
spring boot·spring·mybatis
鸽鸽程序猿8 小时前
【项目】【抽奖系统】活动创建
java·spring
李慕婉学姐9 小时前
【开题答辩过程】以《割草机器人工作管理系统的设计与开发》为例,不会开题答辩的可以进来看看
java·spring·机器人
堕落年代9 小时前
Spring三级缓存通俗易懂讲解
java·spring·缓存