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

相关推荐
哞哞不熬夜4 小时前
JavaEE--SpringIoC
java·开发语言·spring boot·spring·java-ee·maven
gordon~94 小时前
Spring 的bean是安全的吗
java·安全·spring·bean
木易 士心5 小时前
Spring AI 核心架构解析:构建企业级 AI 应用的 Java 新范式
java·spring
顾漂亮6 小时前
JVM底层攻坚
java·jvm·spring
珹洺18 小时前
Java-Spring入门指南(二十七)Android Studio 第一个项目搭建与手机页面模拟器运行
java·spring·android studio
laopeng30119 小时前
基于Spring AI Deep Researcher Agent
java·人工智能·spring
小猪咪piggy20 小时前
【微服务】(1) Spring Cloud 概述
java·spring cloud·微服务
m0_7369270420 小时前
Spring Boot自动配置与“约定大于配置“机制详解
java·开发语言·后端·spring
安卓开发者21 小时前
Docker命令大全:从入门到精通
docker·容器·eureka