Eureka中读写锁的奇思妙想,学废了吗? (2)

EurekaClient每隔30s去注册中心拉取注册表增量信息,拿回来后和本地缓存的注册信息进行比对,一顿增删改查操作后覆盖缓存中的注册信息数据。下面是增量获取注册表信息的代码示例,这里会从recentlyChangedQueue中获取存在变化的实例信息,最后还会设置一个appHashCode值:

image-20210626235121440

即使是获取增量注册表数据,也会从注册中心的缓存中获取,当EurekaClient对注册表进行register/cancel... 等操作时,会先去更新注册表中的数据,然后将改变的实例信息存放到一个队列中:recentlyChangedQueue ,这个队列只会存储最近三分钟有变化的节点信息,最后去清除EurekaServer中的readWriteCacheMap缓存信息

image-20210626234548457

这里有一个重要的点需要注意:EurekaClient拉取的注册表增量信息 时还包含一个注册表全量信息的hash值,也就是上面代码中提到的appHashCode, 这个hash可以看做是所有注册实例数量的status分组后构成的:hash=count+status

image-20210626234457027

为什么需要有这个hash校验的操作?这里是为了保证EurekaClient在获取增量更新后的数据和注册中心的注册表数据保持一致时做的一个校验。我们可以想象一下,EurekaClient 在获取到增量数据后一顿增删改查,按理说最终修改后的数据应该和注册表保持一致,但是由于某些原因并没有保持一致,那么后续再去做增量获取就毫无意义了!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfsjf.html