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 和 client 之间每隔 30 秒会进行一次心跳通信,告诉 server,client 还活着
在某一些时候注册在 Eureka 的服务已经挂掉了,但是服务却还留在 Eureka 的服务列表的情况。
自我保护机制
默认情况下,如果 Eureka Server 在一定时间内(默认 90 秒)没有接收到某个微服务实例的心跳,Eureka Server 将会移除该实例。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使 Eureka 集群更加的健壮、稳定的运行。
自我保护机制的工作机制是如果在 15 分钟内超过 85%的客户端节点都没有正常的心跳,那么 Eureka 就认为客户端与注册中心出现了网络故障,Eureka Server 自动进入自我保护机制,
自我保护机制时会出现以下几种情况:
1、Eureka Server 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前 Eureka Server 新的注册信息会被同步到其它节点中
Eurake 有一个配置参数 eureka.server.renewalPercentThreshold,定义了 renews 和 renews threshold 的比值,默认值为 0.85。当 server 在 15 分钟内,比值低于 percent,即少了 15%的微服务心跳,server 会进入自我保护状态,Self-Preservation。在此状态下,server 不会删除注册信息,这就有可能导致在调用微服务时,实际上服务并不存在。
这种保护状态实际上是考虑了 client 和 server 之间的心跳是因为网络问题,而非服务本身问题,不能简单的删除注册信息
解决建议是:
1、在生产上可以开自注册,部署两个 server
2、在本机器上测试的时候,可以把比值调低,比如 0.49
3、简单粗暴把自我保护模式关闭
eureka.server.enableSelfPreservation=false