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 在一定的时候内,没有接受到某个微服务的心跳,就会注销该实例,默认时间是90秒。但是当网络发生故障的情况下,微服务和EurekaServer就无法通讯,这样就很危险,因为微服务本身是健康的,此时不应该注销该服务,而EurekaServer通过注销该服务来达到自我保护机制,当网络健康的时候,EurekaServer就会自动退出自我保护机制。

这个时候,再次将客户端微服务启动后,就会发现微服务已经被注销了。就像一开始在EurekaServer的Application列表,可以看到3个微服务,过了一会,就变成2个,且提示上面的红色文字。

这里的DS Replicas显示是集群信息,这里注册到peers,过一段时间,网络环境好一点或者刚刚被注销的微服务、重启EurekaServer服务,可以被搜索到的时候,我们刷新下,服务出现了

当然EurekaServer也可以关闭自我保护机制

server端,关闭注册中心自我保护机制

eureka.server..enable-self-preservation: false

注册中心清理间隔,单位为毫秒

enruka.server.evication-interval-timer-in-ms: 10000

client端,开启健康检查(需要spring-boot-starter-actuator依赖)

eureka.client.healthcheck.enabled:true

设置租期更新时间,默认30秒

eureka.instance.lease-renewal-interval-seconds=10

设置租期到期时间,默认90秒

eureka.instance.lease-expiration-duration-in-seconds=15

添加配置后,EurekaServer会提示THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

意思是自我保护机制已经关闭,如果碰到网络故障,将不会保护过期实例

生产环境建议使用默认配置

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐