在使用eureka过程中,查看监控界面,出现:
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.
Renews threshold:server期望在每分钟中收到的心跳次数
Renews (last min):上一分钟内收到的心跳次数。
自我保护机制的工作机制是如果在15分钟内超过15%(100%-85%)的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,
Eureka Server自动进入自我保护机制
Eurake有一个配置参数eureka.server.renewalPercentThreshold,定义了renews 和renews threshold的比值,默认值为0.85。可以修改这个参数
这里涉及三个方面:
1. Eureka server和client之间每隔30秒会进行一次心跳通信,告诉server,client还活着。
2. 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。
3. 如果在15分钟内超过15%(100%-85%)的客户端节点都没有正常的心跳,则自动进入自我保护机制
自我保护机制时会出现以下几种情况:
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中
stackoverflow上看到一个解释的比较清楚的:
https://stackoverflow.com/questions/33921557/understanding-spring-cloud-eureka-server-self-preservation-and-renew-threshold#
每个实例都需要将其租约更新到Eureka Server,频率为每30秒一次,可以在其中定义eureka.instance.leaseRenewalIntervalInSeconds。 续订(最后一分钟):表示在最后一分钟从Eureka实例收到的续订数量 续订阈值:Eureka服务器预期每分钟从Eureka实例收到的续订。 例如,如果registerWithEureka设置为false,eureka.instance.leaseRenewalIntervalInSeconds则设置为30并运行2 Eureka实例。两个Eureka实例每分钟将向Eureka服务器
发送4次更新,Eureka服务器最小阈值为1(用代码编写),因此阈值为5(这个数字将乘以一个因子eureka.server.renewalPercentThreshold,稍后将讨论)。 问题1: SELF PRESERVATION MODE旨在避免网络连接故障。Eureka实例A和B之间的连接很好,但是由于连接问题,B很难在短时间内将租约更新到Eureka服务器,此时Eureka服务器不能简单地启动实例B.如果是,则实例尽管B可用,但无法从Eureka服务器获得注册服务。所以这就是SELF PRESERVATION MODE的目的,最好将其打开。 问题2: 最小阈值1写在代码中。registerWithEureka设置为false,因此没有Eureka实例寄存器,阈值将为1。 在生产环境中,通常我们部署两个Eureka服务器并将registerWithEureka设置为true。所以门槛将是2,Eureka服务器将续租两次/分钟,所以RENEWALS ARE LESSER THAN THRESHOLD不会有问题。 问题3: 你是对的。eureka.instance.leaseRenewalIntervalInSeconds定义每分钟发送到服务器的续订次数,但它将乘以eureka.server.renewalPercentThreshold上面提到的因子,默认值为0.85。 问题4: 是的,这是正常的,因为阈值初始值设置为1.因此,如果registerWithEureka设置为false,则续订总是低于阈值。 我有两个建议: 部署两台Eureka服务器并启用registerWithEureka。 如果您只想在demo / dev环境中部署,则可以设置eureka.server.renewalPercentThreshold为0.49,因此当您单独启动Eureka服务器时,阈值将为0。
可参考文章:
http://www.cnblogs.com/bjlhx/p/8903006.html