目录

Eureka自我保护机制

​自我保护开启条件

自我保护阀值的计算

自我保护阀值的计算公式

自我保护逻辑

自我保护开关

开发环境配置


Eureka注册中心中各个Eureka-Server节点都是平等的,没有ZK中角色的概念,即使N-1个节点挂掉也不会影响其他节点的正常运行。Eureka-Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

Eureka自我保护机制是为了防止误杀服务导致系统瘫痪而提供的一个机制。

何为误杀?

理论上每个服务都有故障的可能,那么自然Eureka注册中心也有故障的可能性。如果注册中心发生故障,服务就有可能不能正常续约,或者当网络分区故障发生时,微服务与Eureka-Server之间无法正常通信,而这个时候服务仍然是可以正常服务的,如果Eureka剔除任务将其剔除,则会造成误杀。

怎么判断Eureka Server故障了?

Eureka Server以一种谦虚的态度来判断是不是自己出了问题,也就是当大量的服务续约超时时,就认为是自己出现问题了。(如果少量服务续约超时,则认为是服务故障)

Eureka自我保护机制

自我保护开启条件

Eureka-Server通过判断是否有大量续约失败,来确定是否开启自我保护。这里提供了一个阀值numberOfRenewsPerMinThreshold和上一分钟的续约数进行对比,如果实际的续约数小于了自我保护阀值,则开启自我保护。

public boolean isLeaseExpirationEnabled() {if(!isSelfPreservationModeEnabled()) {// The self preservation mode is disabled, hence allowing the instances to expire.return true;}return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
}

自我保护阀值的计算

有三个地方会重新计算自我保护阀值numberOfRenewsPerMinThreshold。

1、当新服务注册(register)时

synchronized (lock) {if (this.expectedNumberOfClientsSendingRenews > 0) {// Since the client wants to register it, increase the number of clients sending renewsthis.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews + 1;updateRenewsPerMinThreshold();}}

2、当服务退出(cancel)时

    public boolean cancel(final String appName, final String id, final boolean isReplication) {if (super.cancel(appName, id, isReplication)) {replicateToPeers(Action.Cancel, appName, id, null, null, isReplication);synchronized (lock) {if (this.expectedNumberOfClientsSendingRenews > 0) {// Since the client wants to cancel it, reduce the number of clients to send renewsthis.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;updateRenewsPerMinThreshold(); } }return true; }return false; }

3、TimerTask定时任务(默认15分钟)

 /*** Schedule the task that updates <em>renewal threshold</em> periodically.* The renewal threshold would be used to determine if the renewals drop* dramatically because of network partition and to protect expiring too* many instances at a time.**/private void scheduleRenewalThresholdUpdateTask() {timer.schedule(new TimerTask() {@Overridepublic void run() {updateRenewalThreshold();}}, serverConfig.getRenewalThresholdUpdateIntervalMs(),serverConfig.getRenewalThresholdUpdateIntervalMs());}

自我保护阀值的计算公式

protected void updateRenewsPerMinThreshold() {this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews* (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())* serverConfig.getRenewalPercentThreshold());}

自我保护阀值 = 服务总数 * 每分钟续约数 * 自我保护续约百分比阀值因子。

每分钟续约数 =(60S/客户端续约间隔)

最后自我保护阀值的计算公式为:

自我保护阀值 = 服务总数 * (60S/客户端续约间隔) * 自我保护续约百分比阀值因子。

备注:在老版本中阀值的计算有点错误,新版本中修复成现在的计算公式。

自我保护逻辑

Eureka Server提供了一个EvictionTask定时清理续约超时的服务。清理之前首先判断是否需要清理(isLeaseExpirationEnabled())。这个判断方法首先会判断是否开启了自我保护开关,如果开启了,则会继续判断上一分钟的续约数是否小于自我保护阀值,如果上一分钟的续约数(numOfRenewsInLastMin)小于自我保护阀值(numberOfRenewsPerMinThreshold),则开启自我保护机制,不再进行服务的剔除。

public boolean isLeaseExpirationEnabled() {if (!isSelfPreservationModeEnabled()) {// The self preservation mode is disabled, hence allowing the instances to expire.return true;}return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;}

备注1:numberOfRenewsPerMinThreshold是对所有服务总阀值的计算,而不是单个服务的计算。

备注2: Eureka默认的自我保护阀值因子是85%,可以通过renewalPercentThreshold修改。

自我保护开关

Eureka自我保护机制,通过配置eureka.server.enable-self-preservation来true打开/false禁用自我保护机制,默认打开状态,建议生产环境打开此配置。

开发环境配置

开发环境中如果要实现服务失效能自动移除,只需要修改以下配置。

1、 注册中心关闭自我保护机制,修改检查失效服务的时间。

eureka:server: # 该配置可以移除这种自我保护机制,防止失效的服务也被一直访问 (Spring Cloud默认该配置是 true)enable-self-preservation: false#该配置可以修改检查失效服务的时间,每隔30s检查失效服务,并移除列表 (Spring Cloud默认该配置是 60s)eviction-interval-timer-in-ms: 3000

2、 微服务修改减短服务心跳的时间。

# 告知服务端30秒还未收到心跳的话,就将该服务移除列表,默认90秒
lease-expiration-duration-in-seconds: 30
# 每隔10s发送一次心跳,默认30秒
lease-renewal-interval-in-seconds: 10

以上配置建议在生产环境使用默认的时间配置。

Spring Cloud实战项目Jbone地址

github地址:https://github.com/417511458/jbone

码云地址:https://gitee.com/majunwei2017/jbone

转自:小马过河 - 深入理解Eureka - Eureka自我保护机制

深入理解Eureka自我保护机制相关推荐

  1. 深入理解Eureka 自我保护机制(五)

    对自我保护的理解: 自我保护的作用是保证服务的稳定性,也就是怕过多的服务心跳失败,是Eureka服务端的问题,而不是客户端的问题,所以为了避免将正常的服务剔除,所以加了保护机制,当然保护机制的话也有可 ...

  2. eureka:自我保护机制_对自我怀疑的开发人员:您足够好吗?

    eureka:自我保护机制 by Sihui Huang 黄思慧 对自我怀疑的开发人员:您足够好吗? (To self-doubting developers: are you good enough ...

  3. eureka自我保护时间_Spring Cloud Eureka 自我保护机制

    自我保护出现 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行. 默认情况下,如果Eureka Serve ...

  4. Spring Cloud Eureka 自我保护机制

    Spring Cloud Eureka 自我保护机制 Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这 ...

  5. eureka自我保护时间_SpringCloud Eureka自我保护机制

    自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行. 默认情况下,如果Eureka Serve ...

  6. SpringCloud Eureka自我保护机制

    转载自 SpringCloud Eureka自我保护机制 自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他 ...

  7. SpringCloud Eureka自我保护机制介绍及配置

    概述:谈到Eureka的自我保护机制时,我们需要知道其中一些客户端和服务端的概念.比如客户端的心跳发送时间间隔.服务续约时间:服务端的服务剔除时间间隔.阈值更新时间间隔. 客户端心跳发送时间间隔(eu ...

  8. Eureka自我保护机制

    本文来说下Eureka自我保护机制 文章目录 为什么要有自我保护机制 重要变量 变量更新 Eureka-Server初始化 cancle主动下线 客户端注册 定时器 自我保护机制 开启 解除 本文小结 ...

  9. Spring Cloud Eureka 自我保护机制(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY)

    在本地启动一个Euraka-Server服务(服务注册中心)和一个Euraka-Client服务(服务注册者-应用服务)两个服务.过了一会儿后,在Euraka-Server界面显示:EMERGENCY ...

  10. 天荒地老修仙功-第六部第二篇:Spring Cloud Eureka自我保护机制

    Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果 ...

最新文章

  1. ELK不香了?企业级日志平台后起之秀 Graylog
  2. 输入今天是星期几的序号,给今天和昨天赋予枚举值,并输出昨天是星期几的枚举值
  3. Linux cmake使用入门
  4. 【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】...
  5. NeurIPS 2021 | 简单且通用的多视图对比图聚类方法
  6. flex布局_Flex布局,真香
  7. 构建企业数字化转型协同力有多难?青云发布workly.ai誓要解决这些棘手的问题!...
  8. 史上最详细nodejs版本管理器nvm的安装与使用(附注意事项和优化方案)
  9. 创建型模式之工厂方法模式
  10. matplotlib的学习
  11. 用VS开发PHP扩展
  12. 腾讯智图让我的webp压缩感觉像白忙活一样
  13. Linux 用户管理
  14. 拉普拉斯变换(复习笔记)
  15. 按指定次数重复显示 Excel 单元格
  16. [51nod1457]小K vs. 竹子
  17. 你可以不喜欢我,但无法否定我
  18. MP3/MP4原理电路图下载全搜集
  19. PMP项目进度管理-在线甘特图
  20. 雍正王朝里康熙临终予四爷言

热门文章

  1. .NET CORE敏捷开发框架,企业信息化自主化解决方案
  2. Electron设置窗口图标、设置桌面快捷方式图标
  3. JavaScript 学习笔记 p61 - 69
  4. iReport表达式
  5. 求椭圆的切线方程------很有对称美
  6. 脱壳基础篇——常用六操作
  7. unity3d让模型不受3dCamera FOV的影响
  8. 【matlab】clc,close,close all,clear,clear all作用
  9. Docker 配置国内镜像加速器
  10. Hijack攻击揭秘