Eureka 的实现原理说一下?
Eureka 的实现原理说一下?
回答重点
Eureka的实现原理,大概可以从这几个方面来看:
1)服务注册与服务发现:当一个服务实例启动之后,它会向 Eureka Server 发送服务注册请求,将自己的服务信息注册到注册中心中,Eureka Server 收到这些注册信息之后,会将其保存到内存中,提供 Rest 接口供其他服务查询。服务消费者可以通过查询服务实例列表来获取可用的服务作为服务实例,然后实现服务的发现。
2)服务负载均衡:Eureka 客户端在调用其他服务的时候,会从本地缓存获取服务的注册信息,如果缓存中没有对应的注册信息,则会向 Eureka Server 发送服务的查询请求,Eureka Server 就会返回一个可用的服务实例列表给 Eureka 客户端,然后 Eureka 客户端会使用负载均衡算法从中选择一个服务实例进行调用。
3)服务的健康检查:Eureka 一般会通过心跳机制来检测服务是否处于健康状态。服务实例会定期向 Eureka Server 发送心跳,表名自己处于健康可用的状态。如果 Eureka Server 在一段时间内没有收到某个服务实例的心跳(默认是 90 秒),则会直接将服务标记为不可用,然后直接从服务列表中移除。
这就是 Eureka 的实现原理了,其实注册中心像 Nacos、Consul 等,这些的实现机制其实都差不多,主要就是不同注册中心可能有所差异而已。
扩展知识
Eureka 的服务注册流程详解
- 服务实例注册:当服务启动时,Eureka Client 会将自身的信息(如服务名、IP 地址、端口、健康检查路径等)发送给 Eureka Server 进行注册。Eureka Server 将这些信息保存在注册表中,并将注册成功的确认信息返回给客户端。
- 元数据存储:Eureka Server 的注册表是存储在内存中的数据结构,用于记录所有服务实例的信息。Eureka Server 会定期将这些数据同步到其他集群节点,确保多个 Eureka Server 之间的数据一致性。
Eureka 的服务续约与剔除策略
- 心跳续约机制:Eureka Client 会定期向 Eureka Server 发送心跳(
RENEW请求),告知自身仍然处于活跃状态。心跳的默认间隔时间是 30 秒,如果 Eureka Server 在 90 秒内未收到心跳,就会将服务实例标记为失效。 - 剔除策略:当服务实例被标记为失效后,Eureka Server 会将其从注册表中移除,以确保其他客户端获取到的服务列表是最新的、健康的。
- 超时剔除与自我保护:Eureka 的默认超时时间为 90 秒(3 次心跳间隔),但在自我保护模式下,这个剔除行为会被延迟,确保在网络不稳定时,服务依然可用。
Eureka 的自我保护模式是什么
如果 Eureka Server 在一段时间内没有收到某个服务实例的心跳(默认是 90 秒),则会直接将服务标记为不可用,然后直接从服务列表中移除
但是当 Eureka Server 在短时间内检测到大量服务实例不可用时,它会启动自我保护机制,暂时停止剔除失效的实例,以防止因为网络问题或短暂的系统波动导致大量服务下线。
当 Eureka Server 接收到的心跳数低于期望值(心跳率的 85%)时,自我保护机制会自动开启。在此期间,Eureka Server 仍然会接受新的服务注册和查询,但不会移除失效实例。
当网络恢复正常,Eureka Server 接收到的心跳数恢复到期望值后,自我保护机制会自动关闭,恢复正常的服务剔除逻辑。
Eureka 的自我保护机制的优缺点
优点:
- 提高系统容错能力:在网络抖动或短时间内大规模的实例失效时,自我保护机制可以防止服务的误剔除,提升系统的稳定性和容错能力。
- 避免数据丢失:在网络不稳定时,Eureka Server 会保留已经注册的实例信息,即使它们暂时不可用。这在数据中心发生网络隔离时尤为重要,能够防止服务被误认为已失效。
缺点:
- 短时间内可能提供错误的服务列表:当自我保护机制开启时,Eureka Server 不会剔除失效实例,这意味着客户端可能会从注册表中获取到不可用的服务实例,导致调用失败。
- 恢复时间长:自我保护机制在网络恢复正常后会自动关闭,但这个过程中可能会延长不可用实例的剔除时间。