Eureka
2020-04-25 13:40:59 0 举报
Eureka流程
作者其他创作
大纲/内容
ApplicationResource#addInstance1.注册服务信息
初始化
AbstractInstanceRegistry#getCompensationTimeMs1.1分钟获取一次所以每次进入的方法都会递增一分钟
HeartbeatThread#run1.启动心跳线程
EurekaServerBootstrap#initEurekaServerContext1.从相邻节server节点拷贝注册表2.更新服务状态和最小续约数
EurekaTransport#scheduleServerEndpointTask1.初始化请求类
AbstractInstanceRegistry#AbstractInstanceRegistry1.启动启动一个定时任务,默认30s中执行一次。如果注册时间大于当前时间的180s,就会移除这个队列
Eureka-Server
EurekaClientAutoConfiguration
增量更新AbstractInstanceRegistry#getApplicationDeltasFromMultipleRegions1.从recentlyChangedQueue中获取注册信息,从名字可以看出来 这是最近改变的client注册信息的队列2.使用writeLock,因为这里是获取增量注册信息,是从队列中获取,如果不加写锁,那么获取的时候又有新数据加入队列中,新数据会获取不到的
AbstractInstanceRegistry#internalCancel1、加上读锁,支持多服务实例下线2、通过appName获取注册表信息map3、通过appId移除对应注册表信息4、recentCanceledQueue添加该服务实例5、更新Lease中的服务实例下线时间6、recentlyChangedQueue添加该服务实例7、invalidateCache() 使注册表的读写缓存失效
spring.factories
DiscoveryClient#renew
PeerAwareInstanceRegistryImpl#scheduleRenewalThresholdUpdateTask启动一个刷新期望最小续约数的任务(期望最小续约数=存活服务数量*2*0.85),90s执行一次
PeerAwareInstanceRegistryImpl#init()开启缓存同步任务与更新续约数任务
ResponseCacheImpl#generatePayload1.全量更新2.增量更新
restful风格的http调用
DefaultEurekaServerContext#initialize@PostConstruct注解1.更新eureka-server集群的信息2.开启缓存同步任务与更新续约数任务
@Configuration@Import(EurekaServerInitializerConfiguration.class)EurekaServerAutoConfiguration
AbstractInstanceRegistry#isLeaseExpirationEnabled1.这个方法是判断是否需要自我保护的,里面逻辑其实也很简单,获取山一分钟所有实例心跳的次数和numberOfRenewsPerMinThreshold (期望的每分钟所有实例心跳次数x85%) 进行对比,如果大于numberOfRenewsPerMinThreshold 才允许摘除实例,否则进入自我保护模式
Eureka-Client
peerEurekaNodes#start启动一个更新peerEurekaNodes可用服务节点(根据配置文件中的url刷新列表)的定时任务,10分钟执行一次
DiscoveryClient#shutDown()
DiscoveryClient#unregister1.注销服务
ResponseCacheImpl#getValue1.调用只读缓存,如果只读缓存为空调用读写缓存2.调用读写缓存,如果读写缓存为空执行只读缓存数组的build方法
PeerAwareInstanceRegistryImpl#regist()1.调用父类regist方法
AbstractInstanceRegistry#postInit启动一个服务驱逐任务(驱逐任务的判断条件为:心跳间隔超过90*2),60s执行一次
EurekaServerBootstrap#initEurekaEnvironment1.初始化数据中心名称2.初始化环境名称
DiscoveryClient#initScheduledTasks1.启动获取注册列表线程池任务2.启动心跳检测线程池任务3.启动注册本client注册任务
InstanceInfoReplicator#start1.将任务添加到线程池启动
InstanceResource#renewLease
DiscoveryClient#CloudEurekaClient1.创造eurekaTransport类支持进项网络通信的组件2.初始化各类功能的线程池
AbstractJersey2EurekaHttpClient1.用来获取注册信息
1.初始化EurekaInstanceConfig:EurekaInstanceConfigBean2.初始化EurekaClientConfig:EurekaClientConfigBean3.初始化EurekaServiceRegistry:EurekaServiceRegistry4.初始化EurekaAutoServiceRegistration:EurekaAutoServiceRegistration5.初始化EurekaClient:CloudEurekaClient6.初始化ApplicationInfoManager:ApplicationInfoManager7.初始化EurekaRegistration:EurekaRegistration
InstanceInfoReplicator#run1.启动client的注册方法
AbstractInstanceRegistry#evict
DiscoveryClient#getAndUpdateDelta1.增量更新
获取queue
DiscoveryClient#refreshRegistry
ApplicationsResource#getContainers
1.初始化ServerCodecs:CloudServerCodecs2.初始化PeerAwareInstanceRegistry:InstanceRegistry3.初始化PeerEurekaNodes:RefreshablePeerEurekaNodes4.初始化EurekaServerContext:DefaultEurekaServerContext5.初始化EurekaServerBootstrap:EurekaServerBootstrap6.初始化EurekaServerConfig:EurekaServerConfigBean
管理者
EvictionTask#run
PeerAwareInstanceRegistryImpl#sync()从相邻eureka-server节点拷贝注册表(根据从其他服务获取到的applications将这些服务信息注册到本机,根据配置的eureka.server.registrySyncRetries可重试次数配置同步次数)
Lease#renew1.设置表的renew属性的lastUpdateTimestamp 为最新时间+duration
关闭服务
CloudEurekaClient#register使用eurekaTransport生成request调用请求
依赖
注册监控EurekaMonitors.registerAllStats();
全量更新AbstractInstanceRegistry#getApplicationsFromMultipleRegions1.从regist数组中取出服务列表
EurekaTransport#registrationClient1.生成AbstractJersey2EurekaHttpClient
DiscoveryClient#fetchRegistry
InstanceRegistry#InstanceRegistry1.初始化时候会调用父类构造器
CacheRefreshThread#run1.线程池定时调用
AbstractJersey2EurekaHttpClient#register1.发送请求,类似于:http://localhost:8080/v2/apps/ServiceA2.发送的是post请求,服务实例的对象被打成了一个json发送3.eureka server就知道了这个servIce服务,有一个服务实例
AbstractInstanceRegistry#getDeltaRetentionTask1.recentlyChangedQueue
AbstractInstanceRegistry#renew1.获取对应的服务2.完成续约
Lease#isExpiredlastUpdateTimestamp renew成功后就会刷新这个时间,可以理解为最近一次活跃时间,查看 Lease.renew方法:lastUpdateTimestamp = System.currentTimeMillis() + duration;duration可以查看为:LeaseInfo中的DEFAULT_LEASE_RENEWAL_INTERVAL=90s 默认为90s 这段逻辑为 当前时间 > 上一次心跳时间 + 90s + 补偿时间 如果服务如果宕机了,那么最少180s 才会被注册中心摘除掉
DiscoveryClient#getAndStoreFullRegistry1.全量更新
EurekaServerBootstrap#contextInitialized1.初始化eureka环境:initEurekaEnvironment();2.初始化eureka上下文:initEurekaServerContext();
PeerAwareInstanceRegistryImpl#openForTraffic(1)更新期望最小续约数(2)将服务状态置为启动
InstanceResource#cancelLease
DiscoveryClient#shutDown()1.关闭所有线程池
EurekaServerInitializerConfiguration#start1:调用eurekaServerBootstrap#contextInitialized2:讲tomcat的servletContext上下文传进bootstrap
ResponseCacheImpl#ResponseCacheImpl1.初始化readWriteCacheMap读写缓存,使用google的GuavaCache,刷新时间180s,如果没有数据的时候则会调用build中的方法2.启动定时器,30s定时更新只读缓存
CloudEurekaClient#CloudEurekaClientsuper方法,调用父类构造器
@ConfigurationEurekaClientAutoConfiguration
AbstractInstanceRegistry#regist1.将请求过的实例放入registry的map集合中2.一个服务名称可能对应多个实例
AbstractInstanceRegistry#initializedResponseCache新建ResponseCacheImpl类,其构造方法会进行处理,初始化readWriteCacheMap,启动一个缓存刷新任务(同步readWriteCacheMap到readOnlyCacheMap),30s执行一次
ResponseCacheImpl#getGZIP
0 条评论
下一页