Eureka架构设计
2021-03-28 09:36:51 3 举报
Eureka的启动流程
作者其他创作
大纲/内容
同步isReplicatiion = ftrue
最近一分钟的心跳次数
否
60s执行间隔
7:初始化EurekaServerContext
7.1:启动EurekaServer集群
拉取
将读写缓存中的值同步到只读缓存中
web.xml容器启动,初始化监听器
cache miss
减
重新拉取全量注册表
强制向EurekaServer发起注册
实例摘除任务
客户端
根据运行环境加载不同的配置文件
contextInitialized方法
ServletContextListener
+ contextInitialized(params):returnType
3.2:初始化网络通讯组件EurekaTransport
是
运行环境(test)
服务的故障感知和下线
读写缓存(180s过期)
只读缓存
3:读取eureka-client-test.properties配置文件
EurekaTransport -> EurekaHttpClient网络通讯组件向EurekaServer发起Post注册请求
失效读写缓存
2、服务续约/发送心跳任务(30s一次)
EurekaClient配置
部分资源释放
4:构造感知eureka server集群的注册表(PeerAwareInstanceRegistry)
释放客户端各种资源
也可以设置参数手动禁用保护
服务实例:APP01
数据中心配置
3.1:构建EurekaClient的实例(DiscoveryClient)
注册表
2.1:读取eureka-server-test.properties配置文件
心跳 +90s,这里判断的时候也+90s,90 * 2 = 180s,有可能3-4分钟不发心跳才会感知到服务故障。
上线+1
EurekaClient本地注册表
备用注册表
正常预期为0,但是可能由于gc、unix时钟导致超时执行
Eureka Server B注册表
获取
instanceId01:Lease<InstanceInfo>
1分钟1次
MeasuredRatecurrentBucket:保存当前1分钟内的心跳lastBucket: 上一分钟的心跳(每分钟都会把currentBucket设置为0)
8.1.1:获取步骤3.2 EurekaClient从其他EurekaServer拉取的的注册表
刷新实例信息状态
合并后EurekaClient注册表的hash值
1
instanceId02:Lease<InstanceInfo>
isReplication=false,指的是没有通不过的Eureka实例,此时会同步给所有EurekaServer;IsReplication=true,代表是别的EurekaServer同步过来的实例,此时就不会同步给其他EruekaServer了。
cancelLease
定时任务
过期的服务实例,执行实例摘除操作
调用
60 / 客户端心跳的间隔(30s)
大于
当前时间
✖️
0
EurekaServer角色
移除掉变化超过180s的实例
多级缓存过期机制:1、主动过期:注册表有变更,主动过期读写缓存2、定时过期:读写缓存每过180s会自动过期3、被动过期:每30s将读写缓存中的值同步到只读缓存中
增量注册表
2
实例信息复制器:InstanceInfoReplicatorisDirty = trueDirtyTimestamp = 当前时间
最近下线的时间戳 > 0或者当前时间 > 最近更新时间 + 90s + 补偿时间(renew的bug导致这里要多加90s)
register-with-eureka & shouldEnforceRegistrationAtInit是否在初始化的时候强制注册到其他EurekaServer上,默认false
2.3:构造服务实例的管理器ApplicationInfoManager
默认每隔500ms,将各种请求任务打成一个batch,batch最大是250个,节省网络开销
isReplicatiion = fasle
3、集群实例信息复制任务
EurekaClient角色
2、初始化EurekaServer上下文
数据中心(default)
1、初始化Eureka环境
EurekaServer注册表的hash值
从注册表中移除服务实例,并更新下线时间
自我保护机制是否开启
获取全量注册表失败
EurekaServer配置
6:构造EurekaServer的上下文并放到EurekaServerContextHolder供应用全局使用
主动shutdown
3.3:线程池的创建(1)负责线程调度的(2)负责发送心跳的 (3)负责刷新注册表的
发起取消注册请求
3.4:启动定时调度任务
启动的时候从其他EurekaServer同步
是否从只读缓存拉取注册表
instanceId03:Lease<InstanceInfo>
30s执行一次
期望发送心跳的客户端数量
Eureka Server A(web项目)
onDemandUpdate
判断条件
注入
最近变更的服务实例队列ConcurrentLinkedQueue
7.2:初始化EurekaServer注册表
EurekaServer C
不会执行实例摘除任务
8:从相邻的eureka节点拷贝注册表
9:Eureka统计项监控
EurekaBootStrap
2.2:构造服务实例:Instance Info(构造器模式)
下线-1
EurekaServerContextHolder
配置管理器(单例 + double check + volatile)
心跳的阈值(0.85)
5: eureka server集群的节点生命周期管理组件(PeerEurekaNodes)
lastUpdateTimestamp = 当前时间 + 90s(bug)
合并本地注册表
EurekaServer Context(Server配置、注册表、集群节点生命周期管理组件、服务实例的管理器)
每分钟发送心跳次数的阈值
(注册、下线、故障摘除)的服务实例会入队
每60s执行一次
上次执行时间
update
8.2:获取补偿的时间(比预期晚多久执行)
1、拉取增量注册表的任务(30s一次)
配置实例
EurekaServer D
服务阈值的监控
延迟40S执行
8.1.2:直接调用register方法,放到自己本地注册表,完成注册表的同步(Eureka Server角色)
获取全量注册表
一致性hash对比机制
fetch-registry是否获取注册表
jersey网络通讯框架
更新注册表中实例的最后一次更新时间
batch下线、心跳、注册
对比hash是否一致
最近一分钟心跳统计任务
4、服务状态变更的监听器
1、一个任务执行周期最多有15%的实例会被摘除。2、要摘除的实例都是随机挑选出来的举例:一共20个实例,其中6个实例过期了,但是按照比例只能摘除15%的实例,因此本次任务执行最多摘除3个。
0 条评论
回复 删除
下一页