1. 背景

我们都知道自我保护机制,都知道15分钟,85%的心跳阈值,那么这是如何计算的?源码中怎么体现的呢?今天来研究一下~

2.进入自我保护的模式的判断

public boolean isLeaseExpirationEnabled() {// eureka server自我保护功能是否已经过期if (!isSelfPreservationModeEnabled()) {// The self preservation mode is disabled, hence allowing the instances to expire.// 自我保护模式关闭的情况下,心跳过期功能是一直能够使用的return true;}// 当自我保护模式功能开启时,看看上一分钟发送的心跳数是否大于numberOfRenewsPerMinThreshold// numberOfRenewsPerMinThreshold 就是至少应该发送这么多心跳次数,eureka server才算正常,才不会进入保护模式// 上一分钟发送心跳次数是否大于进入自我保护的阈值return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
}

上面这个方法就是eureka 判断是否进入自我保护模式的方法,核心就是getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold 如果上一分钟收到的心跳数getNumOfRenewsInLastMin小于 每分钟应该收到的最小心跳数numberOfRenewsPerMinThreshold ,那么就进入自我保护模式。
       这个时候,基于心跳的自动踢出定时任务就失效了

3.计算粗糙的核心数据expectedNumberOfRenewsPerMin与numberOfRenewsPerMinThreshold

expectedNumberOfRenewsPerMin: 每分钟应该收到的心跳数

numberOfRenewsPerMinThreshold:每分钟应该收到的最少心跳数

这两个数据是自我保护模式判断的核心。但是eureka关于这两个数据的计算比较粗糙,而且散落在代码的各地。

总共有两个地方对这个数据执行了初始化:

1.com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#openForTraffic 在eureka server初始化完成时,这个时候已经从其他eureka server 拉取到注册表。


2. com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#updateRenewalThreshold 开启了定时任务,默认每15分钟执行一次。首次启动延迟15分钟执行(因为在openForTraffic中已经初始化过了

获取注册表中的数据
Applications apps = eurekaClient.getApplications();
int count = 0;
for (Application app : apps.getRegisteredApplications()) {for (InstanceInfo instance : app.getInstances()) {// 非亚马逊云的都注册了if (this.isRegisterable(instance)) {++count;}}
}
// 这里的计算就比较粗糙 使用的是默认心跳30秒,那么每分钟默认心跳数是2,那么每分钟期待的就是注册数*2
this.expectedNumberOfRenewsPerMin = count * 2;
// 0.85 * expectedNumberOfRenewsPerMin
// 上面都计算出来,这里还又计算了一遍,这里默认设定的阈值比例为0.85
this.numberOfRenewsPerMinThreshold = (int) ((count * 2) * serverConfig.getRenewalPercentThreshold());

那么这两个数据是只在这计算一次吗?

其实并不是,这里是每15分钟会计算一次的,这里的计算结果还会会在其他的行为中进行增删改查。

我们需要知道的是,自我保护机制是应对的网络故障,或客户端非自然下线的情况。 主要是针对于心跳检查。那么在这15分钟的计算周期内,如果出现注册register,自主下线cancel 这种自主的行为还是不会受到自我保护机制的影响的,该上线上线,该下线下线。

注册register

下线cancel

方法:com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#cancel

4.15分钟的由来

private void scheduleRenewalThresholdUpdateTask() {timer.schedule(new TimerTask() {@Overridepublic void run() {updateRenewalThreshold();}}, serverConfig.getRenewalThresholdUpdateIntervalMs(),//启动后延迟15分钟后开始执行updateRenewalThreshold线程任务serverConfig.getRenewalThresholdUpdateIntervalMs());// 每15分钟执行一次
}

上面就是15分钟的由来,可以通过getRenewalThresholdUpdateIntervalMs 来进行设置

这个是在DefaultEurekaServerContext初始化时开启了该定时任务

具体调用链路:

com.netflix.eureka.DefaultEurekaServerContext#initializecom.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#initcom.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#scheduleRenewalThresholdUpdateTask

5.最后一分钟统计数据的由来

这个统计我想应该来自于eureka server 接收 eureka client 心跳时进行统计的。

在第一点中有关于进入保护模式的判断,getNumOfRenewsInLastMin() 就是获取上一分钟接收的心跳数。

这个由什么来进行统计的呢?是由com.netflix.eureka.registry.AbstractInstanceRegistry#renewsLastMin来处理的,这是在创建PeerAwareInstanceRegistryImpl对象时启动的,设定的时长是1分钟重置一次。

什么时候新增的呢?

在发送心跳续约信息时处理的

com.netflix.eureka.registry.AbstractInstanceRegistry#renew

6. 自我保护何时解除

自我保护机制是动态判断的,只要renewsLastMin统计的数量大于numberOfRenewsPerMinThreshold就自动解除了自我保护机制了

7.自我保护机制优缺点

自我保护好处:

防止网络波动情况下,大面积服务下线导致服务瘫痪。这个网络波动主要是指的eureka client 与eureka server 或者 eureka server 与 eureka server之间。 这样可以让客户端使用自己的本地缓存继续进行服务。

自我保护的坏处:

不规范的kill服务,还有0.85这个值,其实都会造成真正的服务下线了,但是无法被剔除。是否是网络波动其实不好判断。

【源码】eureka 如何开启自我保护机制?相关推荐

  1. Eureka工作原理(Eureka简介Eureka ServerEureka Client自我保护机制分布式系统中的CAP理论Eureka 工作流程)

    一.Eureka简介 Eureka Server(注册中心,相当于zookeeper) Eureka Client: Provider Consumer 多个Eureka就叫集群.集群之间会定时通过r ...

  2. Eureka服务治理 - 自我保护机制

    什么是自我保护机制? 在Eureka中,有两种角色: EurekaServer(注册中心服务端) EurekaClient(注册客户端) 自我保护机制其实就是当EurekaServer与EurekaC ...

  3. activeMQ的源码分析 -TCP通讯机制

    2019独角兽企业重金招聘Python工程师标准>>> activeMQ的源码分析 -TCP通讯机制 博客分类: MQ <IGNORE_JS_OP style="WO ...

  4. caffe源码分析--SyncedMemory 内存管理机制

    caffe源码分析–SyncedMemory 内存管理机制 ​ SyncedMemory 是caffe中用来管理内存分配和CPU.GPU数据及同步的类,只服务于Blob类.SyncedMemory 对 ...

  5. vue-router 源码阅读 - 文件结构与注册机制

    文章目录 0. 前备知识 1. 文件结构 2. 入口文件 2.1 rollup 出口与入口 2.2 Vue.use 3. 路由注册 3.1 install 3.2 VueRouter 前端路由是我们前 ...

  6. EOS源码备忘-Push Transaction机制

    这里我们讨论EOS Push Transaction 的逻辑,这块EOS与Eosforce实现有一些区别,我们会着重点出. 关于wasm相关的内容我们会有一片专门的文档分析. 我们这里通常将Trans ...

  7. nginx 源码安装并开启gzip静态压缩

    前言 Nginx 使用 yum (Centos7) 在线安装方式无法开启 gzip 静态压缩,只能采用源码安装并开启 gzip 静态压缩(gzip_static). 安装下载工具 yum instal ...

  8. cloud源码-eureka

    Eureka的一些概念 Register:服务注册 当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址.端口,运行状况指示符URL,主页等. Renew:服务续约 ...

  9. java B2B2C源码电子商务平台 - Zuul回退机制

    1.在一些不稳定因素导致路由后面的微服务宕机或者无响应时,zuul 就会累计大量的请求,久而久之基本上所有的请求都会超时,但是请求链接数却不断的在增加,不断的占用资源池不能结束知道超时消耗殆尽导致zu ...

最新文章

  1. libpcap-mmap分析(五)
  2. laravel 分词搜索匹配度_SEO除了“中文分词”还有“文本分析”- 搜狗蜘蛛池博客...
  3. Protobuf序列化的原理-负数的存储
  4. WPF实现下拉框带图文和水印
  5. BZOJ-1798 维护序列
  6. file_operations结构体分析 (设备文件的操作)
  7. 【ROS学习笔记】(十)ROS中的坐标系管理系统
  8. Light Field 光场以及Matlab光场工具包(LightField ToolBox)的使用说明
  9. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决办法
  10. docker安装oracle11g最全步骤
  11. UDP Socket编程
  12. Android将毫秒转为时分秒
  13. 手机播放云服务器中的视频文件在哪里,手机播放云服务器中的视频文件
  14. 建模案例1:北京二手房房价影响因素
  15. 费氏数列 中第n项数值的计算并打印
  16. 领导与管理的区别与联系
  17. GIS方法类期刊和论文的综述(Introduction)怎么写?
  18. 虚幻4游戏开发_4_导入fbx和编辑
  19. 关闭各种广告弹窗……
  20. Redis应用场景-排行榜

热门文章

  1. SSM框架 思维导图
  2. netty源码分析5-NioEventLoopGroup
  3. 微信openid和已有系统的用户绑定
  4. Git提交的时候检查代码格式
  5. EM算法(期望最大化算法)理论概述
  6. linux syscall 输出函数,Golang:如何在Linux上使用syscall.Syscall?
  7. 服务器型号变更说明,服务器规格变更类
  8. ios如何 自定义键盘
  9. 【大数据风控】解决Python conda install 导入toad和scorecard的报错
  10. 【深度学习】DenseNet