本文已参与「新人创作礼」活动,一起开启掘金创作之路。
-
eureka server启动以及初始化
-
eureka client启动以及初始化
-
eureka client发送服务实例的注册
-
eureka server接收服务实例的注册
-
eureka client抓取全量注册表
-
eureka server注册表多级缓存机制
-
eureka server注册表多级缓存过期机制(主动、定时、被动)
-
eureka server一致性Hash对比机制
读写缓存 - 定时过期(180秒)
只读缓存 - 被动过期(30秒(整30秒))
定时抓取增量注册表(30秒)
定时删除超过3分钟的服务实例变更记录(30秒)
增量拉取注册表(一致性hash比对机制)
Eureka Client 发送增量拉取注册表请求
Eureka Server 处理增量拉取注册表请求
Eureka Server 最近服务实例变更记录队列
Eureka Client 一致性Hash值对比
eureka client启动的时候,会去抓取一次全量的注册表,同时会启动一个定时调度的线程,每隔30秒,会发送一次请求到eureka server,抓取增量的注册表
增量的注册表:跟上一次抓取的注册表相比,有变化的部分,给抓取过来就可以了,不需要每次都抓取全量的注册表
增量抓取注册表流程:
- 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拉取全量的注册表到本地来更新到缓存里去