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 | # 关闭自我保护功能 |
在当出现以上情况后,注册中心界面会出现以下文字,并发现被关闭的客户端已成功注销。
1 | THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS. |
可以通过Log文件查看客户端被注销的过程:
1 | 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) |
参考资料: