02. Spring Cloud Eureka Server 原理
2023-06-14 20:12:21 0 举报
AI智能生成
登录查看完整内容
Spring Cloud Eureka Server 原理
作者其他创作
大纲/内容
Spring Cloud Eureke Server 原理分析
先校验注册表中是否已经有此服务一般都没有,特殊情况才会有
updateRenewsPerMinThreshold()如果注册表中没有表示新注册服务,这里会计算自我保护阈值
如果注册请求的 overriddenStatus 状态不为 UNKNOWN && overriddenInstanceStatusMap 缓存中不包含就添加到 overriddenInstanceStatusMap 缓存中
从 overriddenInstanceStatusMap 缓存中获取状态给注册请求的 registrant 设置 overriddenStatus
getInstanceInfoOverrideRule()获取状态计算规则器
FirstMatchWinsCompositeRule循环所有拦截器链,匹配上就直接返回状态
DownOrStartingRule如果实例 status 状态是 DOWN 或者 STARTING 就直接返回
OverrideExistsRule如果 overriddenInstanceStatusMap 缓存中有状态,就直接返回
LeaseExistsRule从注册表中如果能够获取到实例 && 实例状态如果是 UP 或者 OUT_OF_SERVICE,就返回
AlwaysMatchInstanceStatusRule直接使用客户端的状态返回
rule.apply()这里是一个执行器链,挨个调用 apply() 方法校验
getOverriddenInstanceStatus()给注册请求的 registrant 设置计算出来的 status
将本次修改记录到 recentlyChangedQueue 队列中
super.register()先调用父类的方法完成服务注册
replicateToPeers()向集群中的其他节点发送数据同步请求事件类型是【Action.Register】
register()注册服务
addInstance()处理注册请求
ApplicationResource处理客户端请求
将新的状态保存到 overriddenInstanceStatusMap 缓存中
修改注册表中 InstanceInfo 的 overriddenStatus 信息
修改注册表中 InstanceInfo 的 status 信息
将本次修改记录到 recentlyChangedQueue 队列中
super.statusUpdate()先调用父类的方法完成状态变更
先判断是否是一个同步请求,如果是直接 return防止递归死循环
replicateInstanceActionsToPeers()获取集群中的所有其它节点,挨个同步(需要排除自己)防止递归死循环
replicateToPeers()向集群中的其他节点发送数据同步请求事件类型是【Action.StatusUpdate】
statusUpdate()更改状态
statusUpdate()处理状态变更请求
从 overriddenInstanceStatusMap 缓存中删除状态
修改注册表中 InstanceInfo 的 overriddenStatus 信息为 UNKNOWN 状态
修改注册表中 InstanceInfo 的 status 信息
super.deleteStatusOverride()先调用父类的方法完成状态删除
replicateToPeers()向集群中的其他节点发送数据同步请求事件类型是【Action.DeleteStatusOverride】
deleteStatusOverride()删除状态
deleteStatusUpdate()处理删除状态请求
getOverriddenInstanceStatus()计算该请求的 InstanceStatus 状态
如果续约的状态和上一步计算出来的状态不一致就把 status 状态改成上面计算出来的状态【即不相信 client 提交过来的状态,这个状态需要经过计算】
super.renew()先调用父类的方法完成续约
replicateToPeers()向集群中的其他节点发送数据同步请求事件类型是【Action.Heartbeat】
renew()先续约
如果客户端的传入的 lastDirtyTimestamp > 服务端缓存的 lastDirtyTimestamp返回 NOT_FOUND 状态这种情况是正常现象,需要同步,因为别人的时间更新
如果客户端的传入的 lastDirtyTimestamp < 服务端缓存的 lastDirtyTimestamp && 是 Replication 请求返回 CONFLICT 状态这种情况是冲突的,不需要同步,因为我自己的时间别别人的时间还要新
其余情况返回 OK 状态
validateDirtyTimestamp()根据客户端传入的 lastDirtyTimestamp 计算这里只用考虑集群之间的 Replication 请求
修改缓存 overriddenInstanceStatusMap 中的状态
storeOverriddenStatusIfRequired()如果是 NOT_FOUND 状态 && 是 Replication 请求
renewLease()处理续约请求
从注册表中删除该实例
从 overriddenInstanceStatusMap 缓存中删除
清除相关缓存
internalCancel()服务删除
updateRenewsPerMinThreshold()因为有服务下线,这里需要更新自我保护机制算法
super.cancel()先调用父类的方法完成服务删除
replicateToPeers()向集群中的其他节点发送数据同步请求事件类型是【Action.Cancel】
cancel()关闭服务
cancelLease()处理服务关闭请求
从 overriddenInstanceStatusMap 缓存中删除
将 overriddenStatus 状态设置为 UNKNOWN
将 status 状态设置为 UNKNOWN
super.deleteStatusOverride()先调用父类的方法完成覆盖状态删除注意这里并不会删除缓存
deleteStatusUpdate()处理客户端的【CANCEL_OVERRIDE】覆盖状态删除请求
InstanceResource处理客户端请求
构建缓存 key(ALL_APPS)
responseCache.get(cacheKey)从缓存中获取
getContainers()处理客户端获取全部应用信息请求
构建缓存 key(ALL_APPS_DELTA)
getContainerDifferential()处理客户端获取增量应用信息请求
直接从 registry 中获取所有数据封装成 InstanceInfo 返回
getApplicationsFromMultipleRegions()获取全量数据
从 recentlyChangedQueue 队列中遍历所有数据封装成 InstanceInfo 返回 当然这个队列也会定时清除
getApplicationDeltasFromMultipleRegions()获取增量数据
generatePayload()根据缓存 key 获取结果
ResponseCacheImpl缓存实现类
ApplicationsResource处理客户端请求
evictionTimer.schedule()开启定时清理任务
getCompensationTimeMs()计算补偿时间
如果禁用了自我保护机制,直接返回
getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold如果每分钟收到的续约数 > 自我保护机制的阈值,就表示没触发
isLeaseExpirationEnabled()先判断是否触发了自我保护机制如果触发了就直接跳过清理
lease.isExpired(additionalLeaseMs)从注册表中查找已经过期的实例
internalCancel()使用 Random 清除最小过期的实例数,不是全部清除
evict(compensationTimeMs)清理过期的实例
EvictionTask.run()具体的清理任务
super.postInit()调用父类的清理方法
registry.openForTraffic()开启清理任务
initEurekaServerContext()执行初始化方法
contextInitialized()执行初始化方法
start()它实现了 SmartLifecycle 接口所以在启动时会回调这个方法
EurekaServerInitializerConfiguration向容器中导入组件
EurekaServerAutoConfigurationSpring Boot 提供的 SPI
0 条评论
回复 删除
下一页