Eureka源码
2022-04-13 11:19:23 1 举报
Eureka源码主要功能流程图
作者其他创作
大纲/内容
4、将注册请求同步peer2
基于eureka client配置和服务实例管理器来构造一个EurekaClient
peer1:8761peer2:8761peer3:8761
浏览器打开控制台可看到eureka-server服务实例status.jsp(eureka-resource工程里)
从注册表中移除该服务实例
eureka整体架构设计
否
4、收到batch的请求后进行任务拆分并分发到相应的处理方法
根据服务名和实例id,获取对应的租约
是
eureka-server(web工程)通过web容器来启动,监听器中执行Bootstrap,初始化eureka-server
AbstractJersey2EurekaHttpClient 发送http请求,调用eureka server的restful接口
1、从eureka-client.properties读取服务实例配置2、构造服务实例(InstanceInfo)3、构造服务实例管理器(ApplicationInfoManager)
是否使用readOnly缓存?
存入readOlny缓存
数据中心是啥东东?
启动一堆调度任务1、定时抓取注册表的任务2、定时发送心跳的调度任务3、定时复制实例信息的调度任务4、注册一个状态变更的监听器
Eureka-core
peer1:8761
12、服务下线
下线
初始化环境(数据中心,运行环境)
ApplicationResource
ReplicationTaskProcessor后台线程
注册
peer1:8761peer3:8761
peer2:8761
5、拉取注册表
9、同步下线请求
3、服务注册
Eureka-client
eureka server集群机制
从相邻eureka server节点拷贝注册表
每次发送心跳,MeasureRate计算出最近一分钟的心跳次数
DiscoveryClient类在销毁前会执行shutdown方法
多级缓存机制
3、while循环从batchWorkQueue中取batch,然后调用 Jersey2ApplicationClient发送同步请求
acceptorQueue
存入readWrite缓存
初始化了网络通信组件EurekaTransport
eureka server web.xml 里面的配置jersey servlet拦截所有的请求,将注册请求分发给ApplicationResources
batchingDispatcher
自我保护机制
InstanceResource
batch
peer2:8761peer3:8761
将本次的缓存全量注册表,计算一个hash值跟server端传过来的全量注册表的hash值,进行比对
是否为null?
2、同步注册表
返回注册表信息
将自已作为服务实例从eureka-client.properties中读取服务实例配置构造了服务实例信息(InstanceInfo)构造服务实例信息管理器(ApplicationInfoManager)
定时执行服务注册逻辑
eureka lient
如果两个hash值不一样,说明同步错了,就重新拉取全量的注册表
5、eureka-server将自已作为一个服务,有2个服务实例启动了
Jersey2ApplicationClient
1、eureka server启动时进行服务注册
从readWrite缓存读
期望心跳次数-2
Eureka sever启动流程
定时检查服务服务是否宕机
batchWorkQueue
每30秒抓取增量注册表
1个网络请求发送1个batch
心跳、下线
peer1:8761peer2:8761
2、eureka server启动时注册表拉取
将这个注册请求转发给了ApplicationResource的addInstance()方法
期望心跳次数+2
PeerReplicationResource#batchReplication
心跳
服务注册
如果抓取注册表以及服务注册的话,会创建两个ThresholdLevelsMetric,还有一些Monitor,先看起来是进行监控的一些东西
9、增量抓取注册表,recentChangeQueue最近3分钟的变化的服务实例
服务实例删除状态添加到最近变更队列中
服务下线
Eureka client启动流程
注册监控
4、同步注册表
6、第一次全量抓取注册表
7、同步续约请求
10、默认每隔30秒进行一次心跳
EurekaServerContext进行初始化(1)更新eureka server集群信息(2)基于eureka server集群信息初始化注册表信息
注销状态变更监听
11、最近一分钟的心跳是否大于预期的心跳
6、服务续约
初始化了2个线程池1、发送心跳2、刷新缓存
从readOnly缓存读
8、服务下线
增量抓取做一致性哈希校验
eureka server集群
发送心跳
acceptorExecutor
7、选择一个eureka server完成注册
peer3:8761
服务续约
保存到本地注册表
定时任务EvictionTask,60秒执行一次,如果某个服务实例故障了,就会摘除。摘除前先判断一下 最近一分钟心跳次数<期望心跳次数,就进入自我保护机制不会摘除服务实例
将自已作为eureka client从eureka-client.properties中读取服务eureka client配置基于服务实例和eureka client配置构造了EurekaClient(DiscoveryClient)
processingOrder
从注册表读
4、将注册请求同步peer3
2、默认每隔500ms将processingOrder中的任务打成一个batch,batch最大是250
第一次抓取全量注册表 和 每30秒抓取增量注册表执行的程序代码一样,但获取到的数据不一样区别是cacheKey不一样,前者是ALL_APPS,后者是ALL_APPS_DELTA,最终前者是从注册表(registry)读,后者是从最近变更队列读(recentlyChangedQueue )。
第一次抓取全量注册表
从最近变更队列读
注册完成就可以服务管理界面看到
从eureka-client.properties读取eureka client配置
摘除服务实例时应该将期望心跳次数-2,但这里没有,应该是eureka的一个bug
构造感知eureka server集群的注册表PeerAwareInstanceRegistry
更新租约中的 evictionTimestamp=当前时间戳
尝试去抓取注册表,如果抓取不成功,会从备用的注册表地址去抓取
关闭资源
将服务实例、服务实例管理器、Eureka client配置、网络通信配置都保存一下
3层队列异步批处理机制
将最近3分钟有变化的增量注册表同步到本地注册表
acceptorRunner后台线程
构造一个eureka server集群信息PeerEurekaNodes
1、执行服务注册的逻辑2、执行获取注册表
1、将自已作为服务注册
3、将自已作为服务注册
ServiceA,服务A启动的时候,作为一个eureka client去启动
eureka server启动时从其它 eureka server 拉取注册表,将服务实例*2*0.85=每分钟期望心跳次数如果没有eureka server,那么刚开始期望的心跳次数就是0
更新租约中的 lastUpdateTimestamp=当前时间戳+90秒
readOnly缓存定时任务,每隔30秒将readWrite缓存同步到readOnly缓存中去readWrite缓存服务注册、下线、故障会自动过期服务对应的缓存180秒后缓存数据会自动过期
1、eureka client初始化的时候2、调度执行了一个InstanceInfoReplicator组件3、执行服务注册的逻辑
1、while循环从acceptorQueue里取,将取到的放到processingOrder中
8、同步服务注册的请求
读取 eureka-server.properties配置文件
基于euerka server配置、注册表、eureka server集群、服务实例、来构造一个eureka sever服务上下文EurekaServerContext
将自已注册一个监控
将实例信息放到,一个map中{ \"服务\": { \"服务实例1\":Lease<InstanceInfo> }}
注意这里的流程仅包含主流程,还有一些异常流程未包含,比如各个环节处理失败的情况
取消eureka client的定时任务
定时执行抓取增量注册表逻辑
0 条评论
回复 删除
下一页