Eureka概述

Eureka作为SpringCloud系列里面重要的成员,他在分布式系统中扮演者举足轻重的角色。在大型的服务系统中,有大量的服务系统后台接口互相调用,如果服务之间之间调用,会出现复杂难以维护的调用关系。此时服务注册和发现服务应运而生。Eureka是Netflix开源的一款提供服务注册和发现的产品。它具有以下特性:

  • 高可用:服务端支持集群部署,服务有自我保护机制。
  • 可配置:可动态添加或删除集群节点,也可以调整超时或者线程配置。
  • 弹性:Eureka客户端缓存了注册表的信息,即便服务端关闭也可以正常运行。
  • 多区域部署
  • 可监控:Eureka可跟踪客户端和服务器中的信息,用来性能监控和警报。

Eureka架构

Eureka官网架构如下:
Eureka架构

Eureka Server:服务端,也就是注册中心;
Application Service:Eureka 客户端,服务提供者;
Application Client:Eureka 客户端,服务消费者;

服务提供者启动后,向注册中心注册(register)服务,然后每30秒发送一次心跳(Renew)。如果Renew失败次数达到一定次数,注册中心就会下线服务,将该服务从注册信息中删除。消费者客户端启动后也会从注册中心拉取注册信息(Get Registry,每30秒一次)。 各个区域的注册中心也会将注册信息和续订同步到所有Eureka集群节点。

理解客户端服务端通信

默认情况下,客户端以 STARTING 状态启动,这使客户端实例可以做一些针对应用程序初始化的一些操作。
然后会处于 UP 状态,应用程序可以接受请求。同时应用程序也可以注册健康检查回调,可以选择将实例状态修改为 DOWN。

在 netflix 的应用中,还有一种OUT_OF_SERVICE 状态。主要用于将实例从流量中脱离,在出现问题时可轻松回滚。

客户端会在心跳发生后的30秒后,向 Eureka 服务端注册信息。之后每30秒发送一次心跳更新租约,告诉 Eureka 服务端该实例处在活跃中。如果 Eureka 服务端在90秒内没有收到续订,就会从注册表中删除实例信息。

客户端会从 Eureka 服务端获取注册列表,并缓存到本地。之后,客户端使用该信息去查找其他服务。之后每30秒增量从服务端更新注册信息。

客户端可以发送一个取消请求,会将该实例信息从 Eureka 服务端的注册表中删除。

注意:在Eureka的所有操作(Renew、Cancel、Register)可能需要一定的时间才能在Eureka 服务端得到体现,最后在所有客户端中体现。这事因为Eureka 服务端上的注册信息会定期刷新,然后同步到所有集群节点,最后同步到其他客户端。时延可能达到2分钟。

默认客户端和服务端的通信采用 Jersey 或 Jackson 或 JSON 有效负载与服务端进行通信。

理解 Eureka 集群点对点通信

Eureka 客户端会优先和处在同一区域的 服务端进行通信,如果失败,则客户端则会故障转移到其他区域的服务端。

一旦服务器开始接受流量请求,在服务端的所有操作都会复制到服务器知道所有其他对等节点。如果因为某些原因某个操作失败,会在下一次心跳进行协调,该心跳也会在所有服务器中进行复制。

当服务器启动时,它会从相邻的对等节点获取所有的注册信息。如果获取失败,则会继续尝试其他对等节点。如果获取实例信息成功,服务器会根据实例信息来设置续订(Renew)的阙值,在任何时候,一旦续订(Renew)的百分比低于该配置的的百分比(通常15分钟内低于85%),服务器就会通过停止实例过期来保护当前实例的注册表的信息,防止服务都不可用。

eureka.renewalPercentThreshold=[0.0, 1.0] 可设置自我保护开启的阙值;

eureka.enableSelfPreservation=false 设置是否启用自我保护

如果服务器无法从其他对等节点的服务器中获取实例信息,他会等待5分钟,客户端可以继续注册信息。服务器通过将流量仅倾斜到一组实例来努力不向客户端提供部分信息。

如果节点之间通信中断会发生什么:

  1. 对等节点之间心跳失败,导致服务器进入自我保护模式;
  2. 服务注册可能部分服务端有,部分没有;
  3. 网络通信恢复,对等直接之间差异的信息会恢复,保持最终的一致性;

参考资料

1):注册中心对比和选型:Zookeeper、Eureka、Nacos、Consul和ETCD

2):Understanding eureka client server communication