Netflix Eureka - 增量拉取注册表(一致性hash比对机制)

262 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  1. eureka server启动以及初始化

  2. eureka client启动以及初始化

  3. eureka client发送服务实例的注册

  4. eureka server接收服务实例的注册

  5. eureka client抓取全量注册表

  6. eureka server注册表多级缓存机制

  7. eureka server注册表多级缓存过期机制(主动、定时、被动)

  8. eureka server一致性Hash对比机制


读写缓存 - 定时过期(180秒)

只读缓存 - 被动过期(30秒(整30秒))

定时抓取增量注册表(30秒)

定时删除超过3分钟的服务实例变更记录(30秒)


增量拉取注册表(一致性hash比对机制)

Eureka Client 发送增量拉取注册表请求
Eureka Server 处理增量拉取注册表请求
Eureka Server 最近服务实例变更记录队列
Eureka Client 一致性Hash值对比

eureka client启动的时候,会去抓取一次全量的注册表,同时会启动一个定时调度的线程,每隔30秒,会发送一次请求到eureka server,抓取增量的注册表

增量的注册表:跟上一次抓取的注册表相比,有变化的部分,给抓取过来就可以了,不需要每次都抓取全量的注册表

增量抓取注册表流程:

  1. CacheRefreshThread定时任务,每隔30秒执行一次增量抓取注册表任务

DiscoveryClient构造函数内构造【ScheduledExecutorService scheduler】调度器

DiscoveryClient构造函数内调用initScheduledTasks()函数,初始化CacheRefreshThread任务的执行策略【注册表抓取间隔30秒】

(2)因为本地已经有了缓存的Applications,所以再次抓取注册表的时候,走的是增量抓取的策略

(3)调用eurekaTransport.queryClient.getDelta()方法,发送GET请求【http://localhost:8080/v2/apps/delta】

(4)在eureka server端,走多级缓存的机制,缓存Key(ALL_APPS_DELTA),根据缓存键Key的属性值不同,确定调用registry.getApplicationDeltas()获取增量注册表【recentlyChangedQueue】

recentlyChangedQueue:最近有变化的服务实例

(5)deltaRetentionTimer定时器,默认是30秒一次。移除超过3分钟的服务实例变更记录,即recentlyChangedQueue,只保留最近3分钟的服务实例变更记录。

AbstractInstanceRegistry构造函数内构造【deltaRetentionTimer】定时器,初始化getDeltaRetentionTask

任务的执行策略【增量保持定时器间隔30秒】

(7)eureka client每次30秒,去抓取注册表的时候,就会返回最近3分钟内发生过变化的服务实例

(8)抓取到的delta的注册表,跟本地的注册表进行合并,完成服务实例的增删改

(9)对更新完合并完以后的注册表,会计算一个hash值;delta的注册表包含一个eureka server端的全量注册表的hash值;此时会将eureka client端的合并完的注册表的hash值,跟eureka server端的全量注册表的hash值进行一个比对;如果说不一样的话,说明本地注册表跟server端不一样了,此时就会重新从eureka server拉取全量的注册表到本地来更新到缓存里去