标签:期望 阈值 自我 一分钟 Eureka 收到 源码 心跳 每分钟
正文
自我保护机制是指,eureka-sever如果在1min内,发现超过15%的大量服务实例下线了,会认为是自身出了问题,比如断网,导致服务实例client无法向自己发送心跳,这时不会将这些服务实例剔除。
自我保护机制的入口:
- com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#isLeaseExpirationEnabled
![image-20210626152124553](../../../../../Library/Application Support/typora-user-images/image-20210626152124553.png)
方法实现比较简单:
- 如果
isLeaseExpirationEnabled
方法返回true,则执行服务剔除的逻辑,否则直接返回。 - 如果
isSelfPreservationModeEnabled
返回false,说明没有打开自我保护机制,则方法直接返回true,执行服务剔除的逻辑。 - 默认情况下自我保护机制是打开的,则判断是否
getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold
逻辑比较简单,但是引入了两个变量:
- numberOfRenewsPerMinThreshold 每分钟期望收到的心跳数阈值
- getNumOfRenewsInLastMin 上一分钟实际收到的心跳数
每分钟期望收到的心跳数阈值
每分钟期望收到的心跳数阈值 = 每分钟期望心跳数 * renewalPercentThreshold
renewalPercentThreshold默认是0.85,也就是说,每分钟期望收到的心跳数阈值是每分钟期望心跳数的0.85倍。
每分钟期望心跳数在server启动的时候会从集群内其他节点拷贝过来,服务实例有上下线更新的时候会更新心跳数。
每15min还会执行每分钟期望收到的心跳数阈值的定时任务:
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#init
重新根据注册表计算一次准确的每分钟期望收到的心跳数阈值。
上一分钟实际收到的心跳数
在讲《服务踢除》的时候我们提到过com.netflix.eureka.registry.AbstractInstanceRegistry#postInit
方法,当时忽略了一些代码,现在我们重新看一下这个方法:
这个方法第一行启动了一个定时任务,用来每60s统计上一分钟内收到的心跳数。(eureka的源码中有的关键机制代码写的太隐蔽了,读起来很费劲,我认为好的开源项目的代码应该是很易读的
标签:期望,阈值,自我,一分钟,Eureka,收到,源码,心跳,每分钟 来源: https://www.cnblogs.com/klhans/p/14945979.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。