Netflix Eureka - 服务下线

72 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


Netflix Eureka 目录汇总

  1. eureka server启动以及初始化

  2. eureka client启动以及初始化

  3. 服务注册

    3.1 可重入读写锁-读锁

  4. 服务发现

    4.1. 全量抓取注册表

    4.2. 注册表多级缓存机制

    4.3. 注册表多级缓存过期机制(主动、定时、被动)

    4.4. 增量抓取注册表

     4.4.1. 一致性Hash对比机制
    
     4.4.2. 可重入读写锁-写锁
    
  5. 服务续约

  6. 服务下线


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中感知到下线的服务实例,在自己本地缓存中删除下线的服务实例