Eureka源码浅读---自我保护机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eureka源码浅读---自我保护机制相关的知识,希望对你有一定的参考价值。
参考技术A Eureka源码采用1.7.2版本
本人小白,此文为本人阅读源码笔记,如果您读到本文,您需要自己甄别是否正确,文中的说明只代表本人理解,不一定是正确的!!!
自我保护机制设计的初衷是防止服务注册服务因为本地网络故障,长时间未接受到心跳请求,造成错误的移除大量服务实例,其实调用服务还是可用的
自我保护机制是和自动故障移除联系在一起的,针对的移除实例也是自动故障移除
在服务故障移除的方法中有这样一个判断,当返回false时候,直接返回,不进行故障实例的摘除
进入该方法
关于获取上一分钟心跳总数,Eureka Server内部采用的是定时线程进行统计,使用两个AtomicLong进行保存当前和上一分钟的心跳总数
该方法初始化了运行了定时调度的线程进行统计,默认执行间隔为1min,执行流程:
那么当前的心跳总数是怎么计算的呢,直接看心跳的renew()方法,是否嵌入了计数器累计操作
如上所示,当接收到心跳时,当前心跳计数器进行了递增操作
而getNumOfRenewsInLastMin()获取上一分钟心跳总数就是获取lastBucket数量,再找下该定时任务启动的入口
和自动故障移除的定时同时启动的,那么lastBucket代表了上一分钟的心跳总数
接下来,我们需要看看期望每分钟最小心跳总数的由来:
numberOfRenewsPerMinThreshold最开始的初始化计算是在Eureka Server初始化计算的,使用当前Server拉取到的服务实例总数 * 0.85
在openForTraffic()方法中使用初始化拉取的服务实例总数作为基数标准进行计算,(int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold()) -> count * 2 * 0.85,
集群模式下,count为其他节点中已注册的服务实例总数,单节点就为0
下面我们看看在注册中心接收到注册,下线等请求执行时,维护numberOfRenewsPerMinThreshold
注册,当前实例数量+2,下线,当前实例数量-2,然后再次*0.85,计算期望每分钟最小心跳数
在Eureka Server中有专门的定时任务进行更新numberOfRenewsPerMinThreshold,默认每15min执行一次
主要流程如下:
注意,自动服务故障移除没有进行numberOfRenewsPerMinThreshold的更新
<font color= \'blue\'>服务故障实例的摘除需要判断当前是否处于自我保护模式,而自我保护模式的默认是开启(isSelfPreservationModeEnabled),需要判断上一分钟的心跳总数是否大于期望每分钟最小心跳数,如果在15分钟内,累计丢失了15%以上的节点心跳,那么Eureka Server就会认为当前所处的网络环境异常,从而处于自动保护模式,故障实例将不会移除,再等待15min后,进行expectedNumberOfRenewsPerMin的基于当前服务实例的重新计算后,自我保护模式才会关闭!</font>
自我保护服务开启模拟:
F版本SpringCloud 5—Eureka集群和自我保护机制
前言
上篇文章中,通过代码搭建了Eureka注册中心和客户端,是Eureka的简单应用,在本文中将会讲解更多关于Eureka服务端的应用以及原理。
Eureka 自我保护机制
进入自我保护机制的标志【重点】
在使用Eureka的过程中,有时候会在Eureka服务端的页面上看到如下的内容:
在监控页面上会看到一行红字儿,这些红字儿什么意思呢?代表着Eureka注册中心进入了自我保护机制。
什么是自我保护机制【重点】
默认情况下,如果Eureka Server在一定时间内没有接受到服务实例的心跳,Eureka将会注销该实例(默认90秒).但是当网络分区发生故障时,微服务客户端和Eureka Server 无法正常通信。以上行为可能变得特别危险了,因为微服务本身是健康的,此时不能注销该服务实例。
Eureka通过自我保护机制来解决这个问题,当Eureka Server在短时间丢失过多的服务实例(可能发生了网络分区的故障),那么Eureka Server进入自我保护模式,一旦进入此模式,Eureka Server将会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不再注销任何的服务实例),当网络故障恢复后,Eureka Server会自动退出自我保护模式。
综上,自我保护模式是一种应对网络故障的安全保护措施,它的架构哲学是宁可同时保留所有的微服务,也不盲目注销任何健康的微服务,使用自我保护模式可以让Eureka,更加健壮,稳定。
一句话:大面积出现客户端失联的时候,Eureka 注册中心进入自我保护模式,不注销任何实例
自我保护机制的配置
在Eureka Server中配置关闭自我保护机制
#关闭自我保护机制 默认开启
eureka.server.enable-self-preservation=false
如果想及时剔除失效的eureka服务除了关闭自我保护机制外,可以调低eureka的心跳值
eureka-server服务端
配置文件中我们添加如下配置
#关闭保护机制,以确保注册中心将不可用的实例正确剔除
eureka.server.enable-self-preservation=false
#(代表是5秒,单位是毫秒,清理失效服务的间隔 )
eureka.server.eviction-interval-timer-in-ms=5000
客户端
配置文件中我们添加如下配置
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
# 配置说明
# lease-renewal-interval-in-seconds 每间隔10s,向服务端发送一次心跳,证明自己依然”存活“
# lease-expiration-duration-in-seconds 告诉服务端,如果我20s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=20
注册中心高可用「注册中心集群」
注册中心集群 防止单点故障
Eureka可以通过运行多个实例并互相注册实现高可用部署,Eureka Server实例会彼此同步信息。
创建并配置Eureka集群
1.创建第二个Eureka服务端 eureka-server-8800
2.修改pom文件
3.创建并修改启动类
package com.lby;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author luxiaoyang
* @create 2020-03-30-20:36
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer8800 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer8800.class,args);
}
}
4.写配置文件
5.修改注册中心eureka-server-8801的配置文件
注册中心之间的基本逻辑是:互相注册
此时我们就拥有了一个Eureka注册中心的集群
演示注册中心集群的效果
1.启动所有的注册中心和客户端
2.查看Eureka注册中心管理页面
查看注册中心 8800 的管理页面,可以看到客户端可以正常注册
查看注册中心 8801 的管理页面,可以看到客户端也可以正常注册
3.关闭一个注册中心8800,注册中心8801不受任何影响,整个微服务的集群也不受任何影响,客户端可以正常注册
总结
以上就是Eureka注册中心高可用和自我保护机制的相关内容。
恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。
要掌握SpringCloud更多的用法,请持续关注本系列教程。
求关注,求点赞,求转发
以上是关于Eureka源码浅读---自我保护机制的主要内容,如果未能解决你的问题,请参考以下文章