Eureka 学习 源码分析09 client获取注册信息

Eureka-Client 获取注册信息,分成全量获取增量获取。默认配置下,Eureka-Client 启动时,首先执行一次全量获取进行本地缓存注册信息,而后每 30 秒增量获取刷新本地缓存( 非“正常”情况下会是全量获取 )。

调用 #fetchRegistry(false) 方法,从 Eureka-Server 全量获取注册信息

Eureka 学习 源码分析09 client获取注册信息

30秒增量获取注册信息,并且会刷新本地缓存

2.3 刷新注册信息缓存

获取注册信息成功,设置注册信息的应用实例数,最后获取注册信息时间

2.4 发起获取注册信息

调用 #fetchRegistry(false) 方法,从 Eureka-Server 获取注册信息

Eureka 学习 源码分析09 client获取注册信息

第 19 至 23 行 :对比本地缓存最新的的当前应用实例在 Eureka-Server 的状态,若不同,更新本地缓存注意,只更新该缓存变量,不更新本地当前应用实例的状态( instanceInfo.status ) ),触发 StatusChangeEvent 事件,事件监听器执行

2.4.1 全量获取注册信息,并设置到本地缓存

调用 #getAndStoreFullRegistry() 方法,全量获取注册信息,并设置到本地缓存

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3. Eureka-Server 接收全量获取

3.1 接收全量获取请求

com.netflix.eureka.resources.ApplicationsResource,处理所有应用的请求操作的 Resource ( Controller )。

接收全量获取请求,映射 ApplicationsResource#getContainers() 方法

Eureka-Server 启动完成,但是未处于就绪( Ready )状态,不接受请求全量应用注册信息的请求

3.2 响应缓存 ResponseCache

com.netflix.eureka.registry.ResponseCache,响应缓存接口

Eureka 学习 源码分析09 client获取注册信息

缓存过期策略如下:

  • 应用实例注册、下线、过期时,过期 readWriteCacheMap 。
  • readWriteCacheMap 写入一段时间( 可配置 )后自动过期。
  • 定时任务对比 readWriteCacheMap 和 readOnlyCacheMap 的缓存值,若不一致,以前者为主。通过这样的方式,实现了 readOnlyCacheMap 的定时过期。

注意:应用实例注册、下线、过期时,不会很快刷新到 readWriteCacheMap 缓存里。默认配置下,最大延迟在 30 秒。

为什么可以使用缓存?

在 CAP 的选择上,Eureka 选择了 AP ,不同于 Zookeeper 选择了 CP

3.3 缓存读取

调用 ResponseCacheImpl#get(...) 方法( #getGzip(...) 类似 ),读取缓存

3.4 主动过期读写缓存

应用实例注册、下线、过期时,调用 ResponseCacheImpl#invalidate() 方法,主动过期读写缓存( readWriteCacheMap )

调用 #invalidate(keys) 方法,逐个过期每个缓存键值

3.5 被动过期读写缓存

读写缓存( readWriteCacheMap ) 写入后,一段时间自动过期

3.6 定时刷新只读缓存

定时任务对比 readWriteCacheMap 和 readOnlyCacheMap 的缓存值,若不一致,以前者为主。通过这样的方式,实现了 readOnlyCacheMap 的定时过期

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

增量获取注册信息

Eureka-Client 获取注册信息,分成全量获取增量获取。默认配置下,Eureka-Client 启动时,首先执行一次全量获取进行本地缓存注册信息,而后每 30 秒增量获取刷新本地缓存( 非“正常”情况下会是全量获取 )。

Eureka-Client 将变化的应用集合和本地缓存的应用集合进行合并后进行计算本地的应用集合一致性哈希码。若两个哈希码相等,意味着增量获取成功;若不相等,意味着增量获取失败,Eureka-Client 重新和 Eureka-Server 全量获取应用集合。

Eureka 比较应用集合一致性哈希码,和日常我们通过哈希码比较两个对象是否相等类似

调用 DiscoveryClient#getAndUpdateDelta(...) 方法,增量获取注册信息,并刷新本地缓存

3.1 合并应用集合

调用 #updateDelta(...) 方法,将变化的应用集合和本地缓存的应用集合进行合并

Eureka 学习 源码分析09 client获取注册信息