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