Eureka作为分布式系统的注册中心,主要作用是用于服务治理,Eureka分为Eureka Server和Eureka Client。
(1)Eureka Server—注册中心服务端:服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会在服务注册表中存储该服务的信息。服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表。
(2)Eureka Client—注册中心客户端:Eureka Client 是一个 Java 客户端,用于简化与 Eureka Server 的交互。Eureka Client 会拉取、更新和缓存 Eureka Server 中的信息。因此当所有的 Eureka Server 节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者,但是当服务有更改的时候会出现信息不一致。
(3)服务注册后,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。
(4)微服务默认每30秒,就会从eureka服务端获取一次最新的服务列表。如果某台微服务down机,或者添加了几台机器,此时eureka server会通知订阅他的客户端,并让客户端更新服务列表,而且还会通知其他eureka server更新此信息。
(5)心跳检测,微服务每30秒向eureka server发送心跳,eureka server若90s之内都没有收到某个客户端的心跳,则认为此服务提供者出了问题,会从注册的服务列表中将其删除,并通知订阅它的客户端更新服务列表,而且还会通知其他eureka server更新此信息。
(6)保护机制:默认情况下,如果 Eureka Server 在一定的 90s 内没有接收到某个微服务实例的心跳,会注销该实例。但是在微服务架构下服务之间通常都是跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,网络故障,导致此实例被注销。固定时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性。为了解决这个问题,Eureka 开发了自我保护机制。
Eureka进入自我保护机制后,将不再从注册表中移除因长时间没收到心跳而应该过期的服务,并且仍然能够接收新服务的注册和查询请求,但是不会被同步到其他节点上,当网络稳定时,当前实例新的注册信息会被同步到其他节点中。
Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。当个别客户端出现心跳失联时,则认为是客户端的问题,剔除掉客户端;当 Eureka 捕获到大量的心跳失败时,则认为可能是网络问题,进入自我保护机制;当客户端心跳恢复时,Eureka 会自动退出自我保护机制。
如果在保护期内刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,即会调用失败。对于这个问题需要服务消费者端要有一些容错机制。
(7)工作流程
1)Eureka Server 启动成功,等待服务注册,每个Eureka Server 都存在独立完整的服务注册表信息
2)Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务
3)Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常
4)当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例
5)单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端
6)当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式
7)Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地
8)服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存
9)Eureka Client 获取到目标服务器信息,发起服务调用
10)Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除
(8)Eureka Server 之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server 都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。