Eureka原理详解
按照10.1小节与10.2小节的介绍,对于读者来说入门已经够了,而且前面我们也构建了 Eureka 的框架。但是在实际场景中,对 Eureka 的应用肯定会更加复杂,在开发中只知道基础是不够的。为了在实际中可以更好满足业务需求,本节将会对基础的框架、机制做一些说明。
基础框架
Eureka 主要用于服务治理,因此它主要包含两大部分,服务注册中心与客户端。而客户端又可以根据需要抽象为服务提供者与服务消费者。当然,这里的服务提供者与服务消费者没有被固定,有时候,应用可以充当消费者也可以充当提供者。
根据图10.3,已经对基础框架做了一个抽象的解释,在这里就不再进行讲解。
为了说明服务治理机制,下面将会介绍 Eureka 运行图,并根据图讲解服务治理中的机制原理,如图10.16所示。

在图10.16中,使用了两个服务注册中心、两个服务提供者,以及一个服务消费者,来展示服务治理机制。
机制
服务注册中心
失效剔除:在正常情况下,服务提供者下线时,将会提醒服务注册中心下线,然后服务注册中心会将服务的实例从服务列表剔除。但在网络故障等情况下,并没有将下线的请求信息发送给服务注册中心,服务注册中心不知道已下线,此时消费者来调用服务可能就会出现问题。因此在服务注册中心中,是有一套机制处理这种情况的。
在 Eureka Server 启动时,一个定时任务将会被创建,每 60s(默认)便去清单中剔除超时 90s(默认)的服务实例。关于 60s 与 90s 的值的配置,到后面再讲解。
自我保护:在服务注册中心的信息面板上,很多时候会遇见下面的情况,如图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