SpringCloud Eureka笔记

EurekaServer 注册中心启动

eurekaServer autoconfiguration

关于自动配置原理,直接查看 @see AutoConfigurationImportSelector. 此类会被配置类解析类解析并
且加入到Spring容器。@See ConfigurationClassPostProcessor 引导进Spring容器该类可以会加载类
路径下META-INFO/spring.factories 文件中的需要做自动配置的类全限定类名。并且也加入到Spring容
器,环环相扣。因而可以进入Spring生命周期管理。

spi加载类名
自动配置原理

EurekaServer 服务注册

Springcloud注册中心的顶级父类
类的继承关系
默认注册实现类,对比类图。实际注册工作是交给 AbstractInstanceRegistry 完成的。
在这里插入图片描述
注册中心本质就是一个map

EurekaServer 核心对象

InstanceInfo:实例对象,用于收集保存服务客户端的详细信息。
Lease:InstanceInfo的进一步包装,包括注册时间,过期时间等等。
EurekaClient: 如果eurekaServer需要注册自己的话。把自己包装成一个eurekaClient。走一遍服务注
			  册的流程。
DefaultEndpoint:用于封装注册中心地址。
EurekaHttpClient:用于发起http请求。虽然经过多层包装,生成链式decorator。真正发起调用的是
				   JerseyApplicationClient
ApplicationInfoManager:应用管理器,可以发布注册中心状态变化的事件 StatusChangeEvent。驱动客
						户端注册到注册中心
EurekaServerConfig:与eurekaServer相关的配置项
EurekaClientConfig:与eurekaClient相关的配置项
EurekaServiceRegistry:
EurekaServerBootstrap:注册中心服务端的驱动类,已经生命周期管理。
InstanceRegistryProperties:与实例配置相关的配置项
PeerAwareInstanceRegistryImpl:初始化一个evictionTask,用于下线过期服务或者心跳状态低于阈
								值的实例
InstanceInfoReplicator:随eurekaclient的实例化而实例化,当监听到StatusChangeEvent时触发注
						册的动作
EurekaServerInitializerConfiguratio:初始化eurekaServer的配置类,实现了SmartLifecycle。
EurekaAutoServiceRegistration:实现了SmartLifecycle,重点关注它的事件驱动。


EurekaAutoServiceRegistration关注的事件:查看WebServerInitializedEvent事件

查看源码时会发现 EurekaServiceRegistry的register方法竟然于eurekaServer启动之前执行。但是不
要误会,此时还只是把将要注册的实例的期望状态改成Up。并还没有完成实际意义上的注册。心跳线程,获
取远端服务实例的线程,注册状态变更的事件等等都是在eurekaclient的构造方法中中配置好了。等需要
register的时候ApplicationManager发布一个状态变更的事件 StatusChangeEvent 就好了。既然如此,
什么时候又是谁发布了一个这样的事件呢。继续往下看。ApplicationManager

EurekaServer 如何注册自身到注册中心?

发布状态变更的事件
当监听到StatusChangeEvent 触发

eurekaClient的注册应该发生在eurekaServer准备就绪之后。那又是怎么保证的呢?事实上服务端一般
情况下跟客户端不在一个服务器上,是不会等到eurekaServer去发布这样的事件的。客户端的应用管理器去
发布这样的事件,事件触发向定时线程池提交向eurekaServer注册的任务。可能会重复注册吗?没有细看
,服务端做幂等判断?再者,心跳发送失败时也会发起注册。重复注册的场景是很多的。具体如何处理可以
查看服务端源码。ApplicationManager 驱动 InstanceInfoReplicator去发起注册。

eurekaClient,ApplicationManger,InstanceInfoReplicator之间的关系

EurekaServer 是如何注册自己的?

如上所讲,将自己的实例信息封装成一个InstanceInfo,以客户端的身份发起一次register 请求,服务
名,则是配置文件中的spring.application.name=xxxx

#InstantceResource.renewLease

服务续约,心跳

@See DiscoveryClient.HeartBeatThread

心跳线程,定时执行心跳,守护线程。此心跳的发起和服务注册一样都会被包装成责任链,在最终的实现类中发起sendHeartBeat.通过Jersey 发
起Put请求。如果心跳失败了,则会发起register。

Jersey心跳
如果心跳返回404 重新注册

下线,剔除(准确的说是实例下线)

@See AbstractInstanceRegistry.EvictionTask

此内部类实现了runable,和心跳线程一样都被设置成守护线程,定时执行evict剔除过期实例。值得注意
的是,如果eurekaServer开启了自我保护,则evict任务直接返回。EurekaServerConfigBean 与服务端
相关的配置都在此ConfigurationProperties中,可以根据实际情况配置。关于执行剔除实例任务的前提
是满足如下条件,上一分钟内的心跳次数大于0并且大于设定的平均每分钟的心跳次数。(此心跳次数
针对的是整个注册中心而不是某个实例)。那么由于在调试模式下,关闭了自我保护。并且卡住心跳线程
一分钟。也就是最近一分钟的心跳次数=0,则此次evicttionTask直接返回。

服务下线
初始化期望心跳个数和每分钟心跳个数阈值
在这里插入图片描述

定时任务专门负责刷新期望心跳和心跳平均值

当注册中心初始化以及实例个数变化,会更新这两个参数。而实例下线的时候是有可能参照上述两个参数
的。expectedNumberOfRenewsPerMin 为当前注册中心节点上实例个数的两倍。服务器配置的percent
threashold默认是0.85,可以修改。每当有实例注册上来,该期望值就会+2,有实例下线了期望值就会-2
而阈值一直都是期望值的0.85倍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值