Eureka 是 Netflix 开源的服务发现组件,Spring Cloud 将其集成,提供了基于 Java 的微服务体系中客户端服务发现的能力。它的核心思想是 "注册与发现"。
一、核心架构图
下图清晰地展示了 Eureka 的核心架构和组件交互:

二、核心角色
从架构图中可以看出,Eureka 包含三个核心角色:
-
Eureka Server(服务端)
-
作用:服务注册中心,一个独立的部署单元,通常以集群模式部署。
-
功能:
-
提供服务注册功能,接收来自 Eureka Client 的注册信息。
-
存储和管理所有可用的服务实例信息,即服务注册表(Registry)。
-
提供心跳监控,剔除故障的实例。
-
提供服务查询接口,供消费者获取服务列表。
-
-
-
Eureka Client(客户端 - 服务提供者)
-
作用:将自己的服务注册到 Eureka Server,并使自身服务信息对消费者可用。
-
功能:
-
在应用启动时,向 Eureka Server 注册 自身信息(如服务名、IP、端口等)。
-
定期向 Eureka Server 发送心跳(默认30秒一次)以续约,表明自己"健康存活"。
-
当服务关闭时,向 Eureka Server 发送取消注册 请求,从注册列表中移除自己。
-
-
-
Eureka Client(客户端 - 服务消费者)
-
作用:从 Eureka Server 获取服务提供者列表,并基于该列表发起远程调用。
-
功能:
-
在应用启动时或需要时,从 Eureka Server 拉取(Fetch) 服务注册表,并缓存在本地。
-
定期(默认30秒一次)从 Eureka Server 增量更新 本地缓存的服务列表。
-
结合客户端负载均衡器(如 Ribbon),从本地服务列表中选择一个实例进行调用。
-
-
三、核心实现原理与工作机制
1. 服务注册(Register)
-
流程:
-
服务提供者(Eureka Client)在启动时,读取配置的
eureka.client.service-url.defaultZone
,找到 Eureka Server 的地址。 -
向 Eureka Server 发送 POST 请求,携带自身的元数据信息(如
appName
、instanceId
、ipAddr
、port
等)。 -
Eureka Server 接收到注册请求后,将实例信息存储在一个双层的
ConcurrentHashMap
结构中(第一层 key 是服务名appName
,第二层 key 是实例IDinstanceId
)。
-
- 核心数据结构 :服务注册表
Registry
。
2. 心跳续约与健康检查(Renew)
-
流程:
-
服务提供者注册成功后,会启动一个定时任务,每隔30秒(默认) 向 Eureka Server 发送一次 PUT 请求,即"心跳"。
-
Eureka Server 接收到心跳后,会更新该实例的"最后续约时间"(
lastUpdateTimestamp
)。
-
-
- 如果 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)
-
流程:
-
当服务提供者正常关闭(如执行
SpringApplication.exit()
)时,会向 Eureka Server 发送一个 DELETE 请求。 -
Eureka Server 接收到请求后,会立即将该实例从注册表中移除。
-
-
作用:保证服务列表的实时性,避免消费者调用到已下线的实例。
5. 自我保护机制(Self Preservation)
这是 Eureka 一个非常重要且独特的特性。
服务下线(Cancel)
-
流程:
-
当服务提供者正常关闭(如执行
SpringApplication.exit()
)时,会向 Eureka Server 发送一个 DELETE 请求。 -
Eureka Server 接收到请求后,会立即将该实例从注册表中移除。
-
-
作用:保证服务列表的实时性,避免消费者调用到已下线的实例。
5. 自我保护机制(Self Preservation)
这是 Eureka 一个非常重要且独特的特性。
、Eureka Server 集群的工作原理
Eureka Server 通过互相注册的方式组成集群,以实现高可用。
-
对等复制(Peer to Peer Replication):
-
每个 Eureka Server 都是对等的节点,没有主从之分。
-
当某个 Eureka Client 向其中一个 Eureka Server 节点注册时,该节点会将这个注册请求转发(Replicate) 到集群中的其他所有节点。
-
同样,心跳、下线等操作也会被同步复制。
-
-
最终一致性 :Eureka 集群的数据同步是异步的,这意味着在某个时刻,集群中各节点的数据可能不是严格一致的,但最终会达成一致。这种弱一致性模型牺牲了强一致性,换来了高可用性和分区容错性(符合 CAP 理论中的 AP)。
总结
特性 | 实现机制 | 设计目标 |
---|---|---|
服务注册 | 客户端启动时向 Server 发送 POST 请求 | 中心化服务信息管理 |
服务发现 | 客户端拉取并缓存 Server 的注册表 | 快速、低延迟的本地调用 |
健康监控 | 客户端定时发送心跳,Server 超时剔除 | 自动感知和处理故障实例 |
高可用 | Server 组成集群,通过 P2P 复制数据 | 消除单点故障 |
容错性 | 自我保护机制 | 防止网络波动导致的服务列表清空,保证 AP |
Eureka 通过其简单的客户端心跳、服务端缓存和独特的自我保护机制,提供了一个非常健壮和容错的服务发现解决方案,特别适合部署在可能发生网络不稳定的云环境中。