本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Netflix Eureka 目录汇总
-
eureka server启动以及初始化
-
eureka client启动以及初始化
-
服务注册
3.1 可重入读写锁-读锁
-
服务发现
4.1. 全量抓取注册表
4.2. 注册表多级缓存机制
4.3. 注册表多级缓存过期机制(主动、定时、被动)
4.4. 增量抓取注册表
4.4.1. 一致性Hash对比机制 4.4.2. 可重入读写锁-写锁 -
服务续约
-
服务下线
Netflix Eureka 时间间隔简要
服务注册-
服务发现-
读写缓存-定时过期(180秒)
只读缓存-被动过期(30秒(整30秒))
定时抓取增量注册表(30秒)
定时删除超过3分钟的服务实例变更记录(30秒)
服务续约(30秒)
服务下线
服务下线
调用EurekaClient.shutdown(),将服务实例停止。
@PostConstruct:被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的inti() 方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
@PreDestroy:被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
服务下线流程
(1)调用DiscoveryClient.shutdown()方法
(2)调用DiscoveryClient.unregister()方法取消注册。底层调用eurekaTransport.registrationClient.cancel()方法,发送DELETE请求【http://localhost:8080/v2/apps/ServiceA/instanceId001】
(3)调用registry.cancel()方法,调用父类super.interlCancel()方法
【`/v2/apps/ServiceA`】定位到eureka core项目的【`ApplicationsResource.getApplicationResource()`】方法
【`instanceId001`】定为到【ApplicationResource.getInstanceInfo()】方法
【DELETE】定为到【InstanceResource.cancelLease()】方法
(4)根据appName和instanceId,将服务实例从eureka server的注册表中移除掉
(5)调用(Lease<InstanceInfo>)leaseToCancel.cancel()方法,设置服务实例下线时间(evictionTimestamp)。
evictionTimestamp代表服务实例被清理掉,服务实例下线的时间戳,初始化为0。
通过判断evictionTimestamp是否为零决定服务实例是否下线。
(6)将服务实例状态设置为DELETE放入最近状态变化队列(recentlyChangeQueue)中去,使eureka client拉取增量注册表的时候,可以拉取到这个服务实例下线的状态变化记录。
(7)服务实例变更,必须将之前的缓存都清理掉,从readWriteCacheMap中清理掉。
(8)eureka server 多级缓存中只读缓存,定时每隔30秒,将readWriteCacheMap和readOnlyCacheMap进行一个同步。
(9)eureka client拉取增量注册表时,发现readOnlyCacheMap里没有,会找readWriteCacheMap,也会发现没有,然后就会从注册表里抓取增量注册表,此时就会将上面那个recentCHangedQuuee中的记录返回
服务下线机制
(1)在注册中心,将服务实例从注册表中移除,下线的服务放入recentChangedQueue中去
(2)服务拉取增量注册表时,从recentChangedQueue中感知到下线的服务实例,在自己本地缓存中删除下线的服务实例