赞
踩
Eureka服务实例的下线包含两种情况,第一种就是正常的服务实例下线,第二种是服务实例故障,然后自动摘除故障的服务实例
先来说说第一种情况,当一个eureka client正常的服务下线时,会自己调用一个shutdown()方法来执行下线的逻辑,里面包含了一些资源的释放,组件的关闭,主要是又会去调用一个cancelLease的接口,这里的Lease其实维护的是心跳的信息,eureka client和eureka server之间需要维护心跳,才能知道对方是不是还活着,还在正常工作
在cancelLease这个接口中,会将要下线的服务实例从注册表中删除,同时会在Lease,也就是心跳信息中维护一个evictionTimestamp变量作为实例的下线时间,通过evictionTimestamp就能判断一个实例是否已经下线了
最后还会利用到多级缓存的机制,简单来说就是将下线的服务实例丢到了一个最近变更队列recentChangedQueue中,然后由一个定时任务,每隔30秒将readWriteCacheMap(读写缓存)和readOnlyCacheMap(只读缓存)进行一个同步,下次所有的eureka client来拉取增量注册表的时候,就会发现readOnlyCacheMap里没有,会找readWriteCacheMap也会发现没有,然后就会从注册表里抓取增量注册表,recentChangedQueue中所包含的已经下线的实例就会从服务注册表中删除掉
如果上面的多级缓存相关的东西看不懂的话,有兴趣的同学可以参考一下Eureka的注册表拉取及多级缓存机制简析
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。