Eureka

117 阅读4分钟

Eureka

Eureka是Spring Cloud Netflix子项目之一,用于服务注册与发现。它是一个RESTful的服务,主要负责在分布式系统中实现服务注册和发现功能。

Eureka的基本概念

  • Eureka Server: 服务注册中心,所有微服务实例都会在这里注册,以便其他服务可以发现和调用。
  • Eureka Client: 服务消费者和服务提供者,既可以注册自身信息到Eureka Server,也可以从Eureka Server获取其他服务的信息。
  • Service Registry: 服务注册表,Eureka Server内部维护的一张表,记录了所有注册的服务实例。

Eureka的工作原理

  • 服务注册: 服务实例启动时,将自己的元数据(如主机、端口、状态、服务ID等)注册到Eureka Server。Eureka Client会周期性地(默认30秒)发送心跳来续约,表明服务实例是健康的。

  • 服务发现: 服务消费者向Eureka Server查询可用服务实例的列表,并根据负载均衡策略选择一个实例进行调用。消费者会定期从Eureka Server更新服务列表(默认30秒)。

  • 服务续约: 已注册的服务实例需要定期向Eureka Server发送续约请求(心跳),表明它们仍然在线。如果Eureka Server在一定时间内(默认90秒)没有收到某个实例的续约请求,就会将该实例从注册表中移除。

  • 服务下线: 服务实例在正常关闭时,会发送下线请求给Eureka Server,Eureka Server会将其从服务注册表中删除。

  • 故障处理: Eureka有自我保护机制,当Eureka Server检测到一定比例的客户端不可用(默认85%)时,不会立即剔除它们,以防止网络分区造成的误判。

Eureka的具体细节

Eureka-Client获取已注册的服务信息

Eureka Client获取已注册的服务信息可以分为全量获取和增量获取两种方式。

全量获取

全量获取是指Eureka Client从Eureka Server获取所有已注册的服务实例信息。在服务初次启动时,Eureka Client会进行一次全量获取,以便初始化本地缓存。

全量获取的流程

  • 客户端启动时:Eureka Client首次启动时,会从Eureka Server获取整个注册表。这一步是同步的,确保客户端在启动时就能获取到最新的服务实例信息。

  • 获取注册表:Eureka Client通过REST API调用Eureka Server的/eureka/apps端点,获取完整的服务注册表。

  • 初始化本地缓存:Eureka Client将获取到的服务注册表缓存到本地,以便后续使用。

增量获取

增量获取是指Eureka Client从Eureka Server获取自上次获取以来发生变化的服务实例信息。这种方式可以减少网络流量,提高获取服务实例信息的效率

增量获取的流程

  • 客户端启动后:在客户端启动后,首次全量获取之后,Eureka Client会定期进行增量获取,以便更新本地缓存的服务实例信息。

  • 增量获取请求:Eureka Client通过REST API调用Eureka Server的/eureka/apps/delta端点,获取增量的服务实例信息。增量获取的内容包括新增的服务实例、更新的服务实例和删除的服务实例。

  • 更新本地缓存:Eureka Client将增量获取的服务实例信息应用到本地缓存,确保缓存中的服务实例信息始终是最新的。

Eureka-Client 在初始化过程中,创建获取注册信息线程,固定间隔向 Eureka-Server 发起获取注册信息( fetch ),刷新本地注册信息缓存

在第一次全量获取之后,后续心跳连接不会增量获取,走全量获取的条件

// 禁用增量获取 
clientConfig.shouldDisableDelta() 12: || 
(!Strings.isNullOrEmpty(clientConfig.getRegistryRefreshSingleVipAddress()))  || forceFullRegistryFetch  || 
(applications == null) ||
(applications.getRegisteredApplications().size() == 0) ||
(applications.getVersion() == -1)

Eureka-Server

响应缓存实现类 com.netflix.eureka.registry.ResponseCacheImpl,响应缓存实现类。 在 ResponseCacheImpl 里,将缓存拆分成两层 :

  • 只读缓存readOnlyCacheMap )
  • 固定过期 + 固定大小读写缓存readWriteCacheMap )

缓存过期策略

  • 应用实例注册、下线、过期时,只过期 readWriteCacheMap

  • readWriteCacheMap 写入一段时间( 可配置 )后自动过期。

  • 定时任务对比 readWriteCacheMapreadOnlyCacheMap 的缓存值,若不一致,以前者为主。通过这样的方式,实现了 readOnlyCacheMap 的定时过期。 注意:应用实例注册、下线、过期时,不会很快刷新到 readWriteCacheMap 缓存里。默认配置下,最大延迟在 30 秒。

总结

Eureka Client在获取已注册的服务信息时,通过全量获取和增量获取两种方式来保证本地缓存的服务实例信息是最新的。全量获取用于初次获取完整的服务注册表,而增量获取则用于定期更新本地缓存的服务实例信息,以减少网络流量和提高效率。通过适当的配置,可以优化服务注册与发现的性能,确保系统的稳定性和高效性。

参考