Eureka Server端源码
2021-10-10 12:49:18 0 举报
Eureka Server端源码
作者其他创作
大纲/内容
EurekaServerAutoConfiguration
启动一个定时任务,每60s统计所有client的续约次数(心跳)作为是否触发服务信息回收的依据之一
MeasuredRate#run方法
设置启动状态
扫描所有jar包的spring.factories文件
已过期 添加到过期实例集合中
1.修改eureka状态为up2.启动定时任务,清理60秒没有心跳的客户端 默认每30秒发送心跳,1分钟就是2次
处理服务的 InstanceStatus
遍历注册表中所有服务实例查看是过期
PeerAwareInstanceRegistryImpl
scheduleRenewalThresholdUpdateTask();自我保护机制定时任务15分钟执行一次
计算剔除服务个数
spring.application.name应用名
如已存在lease
Eureka Server注解
gMap.get(registrant.getId())
recentCanceledQueue.add
@Import(AutoConfigurationImportSelector.class)
Lease<InstanceInfo>服务实例信息
@SpringBootApplicationSpringBoot项目启动
同时加载eureka server对应的自动装配类,单前提条件是容器存在Marker这个Bean
FilterRegistrationBean初始化拦截器,通过他来实现eurekaServer对外的restFull接口
instanceId唯一实例 ID
internalCancel服务下架
updateRenewsPerMinThreshold更新每分钟应该收到心跳的阈值,低于该阈值会触发自我保护机制
激活Eureka Server
@Import
EurekaServerInitializerConfiguration.this.running = true
SmartLifecycle
每分钟期望的续约数 :期望Eureka Client发送的续约数 * (60 秒 / 预计客户端间隔秒数续约[默认 30 秒]) * 0.85期望 Eureka Client 发送的续约数,这个值会根据服务的动作进行更新:服务注册 + 1与服务下线 - 1) 来进行判断的比如:现在注册中心有 20 个服务那么:每分钟期望的续约数 = 20 * (60 / 30) * 0.85 更新numberOfRenewsPerMinThreshold值
随机剔除过期实例集合中的toEvict个服务
EurekaServerInitializerConfiguration
初始化EurekaServer配置
PeerEurekaNodes
更新服务最新更新时间
remove后返回id对应的具体实例信息
EurekaServerBootstrap初始化SpringCloud包装的原生Eureka启动类,后台通过它来EurekaSever
未开启
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
启动和自我保护模式机制相关的定时任务
updateRenewalThreshold
gMap=registry.get(registrant.getAppName());
PeerAwareInstanceRegistryImpl调用相邻节点的http接口获取服务实例
this.registry.syncUp()服务同步
EurekaController初始化获取EurekaServe信息的接口
然后启动了一个定时线程,每隔10分钟更新集群节点
把所有实例注册到本地AbstractInstanceRegistry
initEurekaEnvironment初始化运行环境
添加到最近取消续约队列
gMap = registry.get(appName)从注册表取出服务名对应的实例
@Bean
publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
判断是否开启了自我保护机制
设置响应缓存过期
@EnableAutoConfiguration
继承此接口当Spring容器加载所有bean并完成初始化之后,会接着回调实现该接口的类中对应的start方法
super.postInit();#AbstractInstanceRegistry
invalidateCache
根据当前节点的最新更新时间和注册节点的最新更新时间比较,如果前者的时间晚于后者的时间,那么注册实例就以已存在的实例为准
加载EnableAutoConfiguration对应的所有实现类
eurekaServerBootstrap.contextInitialized
PeerEurekaNodes初始化集群服务节点集合作用是当有收到节点注册时,需要通知同一个集群的所有节点
创建时会调用@PostConstruct注解修饰initialize方法
this.numberOfReplicationsLastMin.start();计算每分钟应用的续约数
new DefaultEurekaServerContext
isExpired
初始化读写缓存
获得读锁
registry.openForTraffic服务剔除 60s执行一次
启动一个只拥有一个线程的线程池,第一次进去会读取其他集群节点的信息(复制)
初始Eureka Server同时启动Eureka Server
@EnableEurekaServer
@BeaneurekaServerConfig
taskExecutor.scheduleWithFixedDelay(peersUpdateTask定时集群服务同步
自动装配注解
开启服务剔定时任务
leaseToCancel = gMap.remove(id);
刷选缓存ResponseCacheImpl
如果找不到,代表是一个新注册,则更新其每分钟期望的续约数量及其阈值
new Marker()
initializedResponseCache();
AbstractInstanceRegistry.EvictionTask最终执行此类的run方法
官方文档说是90秒代码中其实累加了2次所有应该是180s
发送Eureka Start 事件
EurekaServerMarkerConfiguration
动态的更新每分钟期望的续约数
start
publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
expiredLeases.add(lease)过期实例集合
registrant.setActionType(ActionType.ADDED);
registrant.setLastUpdatedTimestamp();
首次进来,更新集群节点信息
updatePeerEurekaNodes(resolvePeerUrls());
this.registry.init(this.peerEurekaNodes);
调用JDK提供的定时器工具Timer类执行延迟周期任务第二个参数表示延迟多长时间第三个period表示间隔时间,连续执行任务之间的时间
一个应用名可以有多个实例
eurekaClient.getApplications()
创建一个新 Lease 并放入 Map 中
PeerAwareInstanceRegistry初始化集群注册表
@Import初始化标记类,主要这个类初始化后后面自动装配的类才被加载到Spring容器中
发布注册事件
先根据应用名从注册表获取如果没有就初始化放入 registry 中
peerEurekaNodes.start();
this.updateRenewsPerMinThreshold();
调用
根据当前注册的ID找到对应的 Lease并发注册场景下,可能已经存在
首先判断 Eureka Server 是否开启了自我保护机制 如果没有开启直接返回 true,可以进行服务过期处理然后判断每分钟期望的续约数大于 0 并且实际每分钟的续约数大于每分钟期望的续约数 numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold
initEurekaServerContext初始化上上下文
从相邻的eureka节点复制注册表
0 条评论
回复 删除
下一页