Eureka原理详解

按照10.1小节与10.2小节的介绍,对于读者来说入门已经够了,而且前面我们也构建了 Eureka 的框架。但是在实际场景中,对 Eureka 的应用肯定会更加复杂,在开发中只知道基础是不够的。为了在实际中可以更好满足业务需求,本节将会对基础的框架、机制做一些说明。

基础框架

Eureka 主要用于服务治理,因此它主要包含两大部分,服务注册中心与客户端。而客户端又可以根据需要抽象为服务提供者与服务消费者。当然,这里的服务提供者与服务消费者没有被固定,有时候,应用可以充当消费者也可以充当提供者。

根据图10.3,已经对基础框架做了一个抽象的解释,在这里就不再进行讲解。

为了说明服务治理机制,下面将会介绍 Eureka 运行图,并根据图讲解服务治理中的机制原理,如图10.16所示。

image 2024 04 01 08 15 03 323
Figure 1. 图10.16 Eureka运行图

在图10.16中,使用了两个服务注册中心、两个服务提供者,以及一个服务消费者,来展示服务治理机制。

机制

服务注册中心

失效剔除:在正常情况下,服务提供者下线时,将会提醒服务注册中心下线,然后服务注册中心会将服务的实例从服务列表剔除。但在网络故障等情况下,并没有将下线的请求信息发送给服务注册中心,服务注册中心不知道已下线,此时消费者来调用服务可能就会出现问题。因此在服务注册中心中,是有一套机制处理这种情况的。

在 Eureka Server 启动时,一个定时任务将会被创建,每 60s(默认)便去清单中剔除超时 90s(默认)的服务实例。关于 60s 与 90s 的值的配置,到后面再讲解。

自我保护:在服务注册中心的信息面板上,很多时候会遇见下面的情况,如图10.17所示。

image 2024 04 01 08 16 42 875
Figure 2. 图10.17 自我保护

那么这种情况是怎么出现的呢?我们在调试开发时,因为在 Eureka Server 上会维持一个心跳,如果在运行时,统计心跳失败的比例在 15 分钟内低于 85%,则服务注册中心将会自动启动自我保护机制。

在自我保护机制中,当前的注册信息会被保护起来,使得这些信息不会过期。在实际情况中,网络不稳定常会造成心跳的失败,因此自我保护还是必要的。但是在调试的过程中,还是需要将自我保护机制关闭,因为在调试中,很多时候会调用到不存在的服务实例。

如果要关闭保护机制,将默认值 true 修改为 false 即可,如下。

eureka.server.enable-self-preservation=false

服务提供者

服务注册:它是 Eureka 的基本功能,在使用过程中引用依赖之后,只要加上注解就可以使得客户端到服务注册中心进行注册。客户端在启动之后,会马上发送请求,并按照配置信息注册到服务注册中心,在请求中会带上服务的元数据信息。

服务续约:在服务注册之后,服务提供者需要使用心跳维护这些注册的服务。在服务注册中心上刚才提到过,会存在服务剔除。为了防止服务剔除,服务提供者使用心跳进行维护,这个过程被称为服务续约。30s 为续约时间,也是心跳时间;90s 为服务时效时间。具体设置如下。

eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90

服务消费者

服务下线:在图10.16中,有一个下线,在这里说明一下。当服务进行关闭时,客户端程序会触发一个服务消息的请求给 Eureka Server,提醒这是一个正常的服务关闭操作,然后服务注册中心就可以把服务实例从列表中剔除。

获取服务:启动服务消费者应用,将会触发一个请求给服务注册中心,将服务注册中心上的服务清单获取下来,并在客户端维护,这也是为了性能考虑。然后,有可能服务有一些变化,就需要定期更新本地维护的清单。我们可以使用配置项控制刷新时间,默认是 30s,如下。

eureka.client.registry-fetch-interval-seconds=30