Eureka Server 在运行期间会去统计心跳失败的比例在5分钟内是否低于85%,如果低于85%,Eureka Server 会认为当前实例的客户端与自己的心跳连接出现了网络故障,那么Eureka Server 会把这些实例保护起来,让这些实例不会过期导致实例被剔除。
这样做的目的是为了减少网络不稳定或者网络分区的情况下,Eureka Server 将健康的服务剔除下线的问题。使用自我保护机制可以使得 Eureka 集群更加健壮和稳定地运行。
2、处于自我保护阶段会出现如下两种情况 1、 Eureka Server 不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务。
2、 Eureka Server 仍然能够接受新服务的注册和查询请求,但不会被同步到其他节点上,保证当前节点依然可用。
Renews threshold :Eureka Server 期望每分钟收到客户端实例续约的总数
Renews (last min) :最后一分钟收到的客户端实际的续约总数
当 Renews < Renews threshold 时会触发 Eureka Server 的自我保护机制。
下图是触发了 Eureka 的自我保护机制后的现象:
Renews threshold = 服务总数 * 每分钟续约数量(60s/客户端的续约间隔)* 自我保护续约百分比阈值因子
服务总数为4,客户端的续约间隔默认为30s,自我保护续约百分比阈值因子默认为85%,带入计算可得 4 * 2 * 0.85 = 6.8 —>> 取整得 6。
如果 Renews 大于 6 表示 Eureka Server 处于正常状态。
更新 Renews threshold 的几个地方:
1、Eureka Server 启动的时候
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#openForTraffic
2、服务注册的时候
com.netflix.eureka.registry.AbstractInstanceRegistry#register
3、取消注册的时候
com.netflix.eureka.registry.AbstractInstanceRegistry#internalCancel
4、每15分钟定时刷新
5、弊端和处理方式com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#scheduleRenewalThresholdUpdateTask
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#updateRenewalThreshold
一旦触发了自我保护机制,可能会造成一些错误服务的调用,如果 不希望此类情况的出现,我们可以采取以下处理方式
处理方式一
在 Eureka Server 中添加配置 eureka.server.enable-self-preservation=false
处理方式二
降低自我保护续约百分比阈值 eureka.server.renewal-percent-threshold=0.5