Eureka Service源码流程图
2022-07-11 16:13:36 17 举报
Eureka Service源码流程图
作者其他创作
大纲/内容
false
从一级缓存中拿出所有的注册表实例
registrant.setOverriddenStatus(overriddenStatusFromMap)设置注册信息中服务状态为缓存中的状态
ApplicationResource#addInstance注册(注册完依次给集群间eureka同步)
replicateInstanceActionsToPeers
3、FilterRegistrationBeanEureka所有的操作都是http来做的
EurekaServerBootstrap#initEurekaServerContext服务剔除入口
是否开了ReadOnlyCash
replicateToPeers(向其他eureka服务同步)
registry.entrySet()
集群间数据同步次数递增
如果注册时间还小于人家已经存在的时间,那肯定是好早之前的请求,现在才达到,会被无视掉,注册实例信息会被替换为已经存在的实例信息
lease.isExpired
InstanceResource#renewLease续约
\"true\".equals(isReplication)判断集群之间是否需要同步
super.renew
更新服务续约的时间戳
不进行集群间数据同步
true
是
eurekaServerBootstrap.contextInitialized()
2、EurekaServerContext
getContainerDifferential增量拉取(ALL_APPS_DELTA)
Lease<InstanceInfo> existingLease = gMap.get(registrant.getId())缓存中取出当前服务的注册信息
readWriteCashMap2
InstanceInfo instanceInfo = leaseToRenew.getHolder()
ApplicationResource#addInstance
CLIENT
ApplicationResource#addInstance服务注册
成功
PeerAwareInstanceRegistryImpl集群同步
ApplicationsResource#getContainers全量拉取注册中心数据
集群为空或者该请求本身就是同步请求
依次向每个eureka同步
eureka为单节点 || 请求是数据同步
续约时设置的过期时间为续期时的时间戳 + 过期时间(默认90s)这里在判断当前时间 是否大于服务过期时间 + 一个过期时间,也就是默认可以让它不续期两次,超过两个就会被踢除
isReplication?
true
leaseToRenew.renew()将实例过期时间改为当前时间+ 剔除最大容忍时间(90s)
this.registry.openForTraffic
int registryCount = this.registry.syncUp();向其它eureka节点拉去注册表
register1
ResponseCacheImpl#getValue
ResponseCacheImpl#getGZIP
if (!isLeaseExpirationEnabled())判断是否剔除(判断自我保护是否开启和触发)
剔除不会集群同步,每个Eureka都有自己的剔除任务
踢除数量 = 总数 - 最少保留数
EurekaClient启动时全量拉取,后面定时任务进行增量拉取
没有去二级缓存中取
InstanceResource#renewLease续约(一直集群同步)
1、EurekaServerInitializerConfiguration
AbstractInstanceRegistry#register
循环依次做过期判断
existingLease.getHolder() != null
加入到过期集合expiredLeases中
Eureka Service做的事情
如果循环的节点是自己 不会再向自己同步
isReadOnly
1、接受注册2、接受心跳3、获取注册表信息4、下线5、如果部署多个节点做集群同步
evict(触发剔除的时间戳)具体的剔除逻辑
通过serviceId判断是否相等找到自己的实例InstanceInfo信息 eg:serviceId=10.1.180.112:SERVICE-API
先删除一级缓存中的信息再删除二级缓存(readWriteCacheMap)中的注册信息这一块如果还开了三级缓存的话,那注册表的信息其实还能被拉取到,二三级缓存30s才会同步一次数据
启动:封装和server交互的配置初始化3个任务(续约、缓存刷新、状态改变监听,按需注册)运行:初始化三个定时任务,发送心跳,刷新缓存,状态改变监听(按需注册,我自己实例信息和server端不一致)
从readOnlyCash中取
public void start()
续约成功?
InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus验证当前服务的状态是 UP还是DOWN
EurekaServerAutoConfiguration
从readwriteCash中区
lease.serviceUp()如果状态为UP设置服务的启动时间、最后更新时间为当前时间戳
publishEvent发布一个续约的事件
注册
数据三分钟过期,谷歌的guava包的缓存,获取没有会去一级缓存中取数据
让缓存实例失效
AbstractInstanceRegistry.EvictionTask剔除的Timer任务类
过期数量 > 0
InstanceStatus overriddenStatusFromMap = overriddenInstanceStatusMap.get(registrant.getId())从缓存汇总获取当前服务的状态
只为了拿到实例发一个注册事件
existingLease != null
拉取
eureka值得借鉴的地方:1.注册表数据采用三级缓存来进行保存,一级缓存只负责用户注册操作,降低了eureka的压力。2.二三级缓存是一个读写分离的设计思想,三级缓存只负责用户的拉取操作,二级缓存既支持读又支持从一级缓存中取数据,避免了读写冲突加锁的问题。3.为了防止误踢,引入了自我保护的机制4.将所有的属性都以配置方式提供,让用户可以根据自己的实际情况来读取配置5.注册、续约、通过一个参数来实现了请求和集群同步请求两类请求5.getOverriddenInstanceStatus这里使用了模板方法模式和策略模式
获取不到去register中获取,并缓存起来
getContainers全量拉取(ALL_APPS)
super.postInit();开启剔除定时任务EvictionTask
PeerAwareInstanceRegistryImpl#openForTraffic
保留服务数 = 总数 * 自我保护阈值默认0.85
overriddenStatusFromMap != null
initEurekaServerContext()
30s同步一次
ResponseCacheImpl#ResponseCacheImpl实例化方法同步定时器代码
existingLease != null注册信息已经存在注册表
ApplicationsResource拉取注册表信息
服务注册客户端注册时向registrer中注册,并且让该服务在readWriteCashMap中的缓存失效font color=\"#ff0000\
getSortedApplications()获取注册表中所有的实例信息
1.关闭自我保护(服务多时开启,不多不开)2.缩短服务剔除时间3.关闭readOnlyCache4.缩短二三级缓存的数据同步时间客户端打乱服务注册的顺序,eureka源码默认只向第一个eureka获取数据,如果配置4个eureka,第四个会不生效
replicateToPeerseureka集群之间进行同步
该类实现了SmartLifecycle,所以启动会执行start()主要干的事情:1、从其他peer拉去注册表信息2、启动定时剔除任务3、自我保护
不进行同步
InstanceResource#renewLease下线
PeerAwareInstanceRegistryImpl#init#initializedResponseCache()初始化缓存
InstanceRegistry#register#handleRegistration
super.postInit()服务剔除定时器启动
gMap == null
getLocalRegistrySize()获取注册表注册的服务总数
readOnlyCashMap3
当前请求是不是别的eureka节点来进行数据同步的 是就不用继续向附近的eureka同步。
node.register(info)
60s执行一次,剔除90s x 2 时间内未续期的服务
判断当前注册的时间小于存在的注册信息
获取注册有效期,默认90s
只更新租约的时间戳lastUpdateTimestamp
registrant.getOverriddenStatus() != UNKNOW
InstanceRegistry#renew
PeerAwareInstanceRegistryImpl#register
InstanceRegistry#register
否
收藏
收藏
0 条评论
下一页