新入门的同学可能会问为什么有时候会出现如下提示:
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 server开启了SELF PRESERVATION模式,导致registry的信息不会因为过期而被剔除掉,直到退出SALF PRESERVATION模式。
针对SALF PRESEVATION的问题,在测试环境可以将自我保护模式关闭:
#是否开启自我保护机制
eureka.server.enable-self-preservation=false
关闭自我保护机制后会提示:
RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
在实际的生产过程中,经常会有网络抖动等问题造成服务实例与Eureka Server的 心跳未能如期保持,但是服务实例本身是健康的,这个时候如果按照租约剔除机制剔除的话,会造成误判,如果大范围误判的话,可能会导致整个服务注册列表的大部分注册信息被删除,从而没有可用服务。Eureka为了解决这个问题引入SALF PRESERVATION机制,当最近一分钟接收到的续约的次数小于等于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。对于开发测试环境,开启这个机制有时候反而会影响系统的持续集成,因此也可以通过参数eureka.server.enable-self-preservation关闭该机制。