Eureka客户端强制关闭, 注册中心界面中客户端依然以UP状态存在

当手动强制关闭服务时,而非调用程序关闭时,发现Eureka提供的注册中心界面中仍然保留有已关闭的客户端信息,但无法正常访问。大约在三个心跳周期(90s)后出现警告提醒:

1
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

以上代码说明Eureka进入了自我保护模式。


产生原因在于,Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。


以上问题,可以通过关闭自我保护模式来注销已关闭的客户端。

1
2
3
4
5
# 关闭自我保护功能
eureka.server.enableSelfPreservation=false
# 配置心跳检测时长
eureka.instance.leaseRenewalIntervalSeconds=1
eureka.instance.leaseExpirationDurationInSeconds=2

在当出现以上情况后,注册中心界面会出现以下文字,并发现被关闭的客户端已成功注销。

1
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

可以通过Log文件查看客户端被注销的过程:

1
2
3
4
2017-03-09 10:56:09.872  INFO 4132 --- [nio-1111-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance COMPUTE-SERVICE/localhost:compute-service:2223 with status UP (replication=false)
2017-03-09 10:59:57.768 INFO 4132 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Evicting 1 items (expired=1, evictionLimit=1)
2017-03-09 10:59:57.770 WARN 4132 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : DS: Registry: expired lease for COMPUTE-SERVICE/localhost:compute-service:2223
2017-03-09 10:59:57.771 INFO 4132 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry : Cancelled instance COMPUTE-SERVICE/localhost:compute-service:2223 (replication=false)

参考资料:

[1] http://www.cnblogs.com/moonandstar08/p/6435710.html