SpringCloud Eureka笔记

EurekaClient and EurekaServer

  • EurekaServer 注册中心启动
    • eurekaServer autoconfiguration
  • EurekaServer 服务注册
    • EurekaServer 核心对象
    • EurekaServer 如何注册自身到注册中心?
    • EurekaServer 是如何注册自己的?
  • 服务续约,心跳
    • @See DiscoveryClient.HeartBeatThread
  • 下线,剔除(准确的说是实例下线)
    • @See AbstractInstanceRegistry.EvictionTask

EurekaServer 注册中心启动

eurekaServer autoconfiguration

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

SpringCloud Eureka笔记_第1张图片
SpringCloud Eureka笔记_第2张图片

EurekaServer 服务注册

Springcloud注册中心的顶级父类
SpringCloud Eureka笔记_第3张图片
默认注册实现类,对比类图。实际注册工作是交给 AbstractInstanceRegistry 完成的。
SpringCloud Eureka笔记_第4张图片
SpringCloud Eureka笔记_第5张图片

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关注的事件:SpringCloud Eureka笔记_第6张图片

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

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

SpringCloud Eureka笔记_第7张图片
SpringCloud Eureka笔记_第8张图片

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

SpringCloud Eureka笔记_第9张图片

EurekaServer 是如何注册自己的?

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

#InstantceResource.renewLease

服务续约,心跳

@See DiscoveryClient.HeartBeatThread

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

SpringCloud Eureka笔记_第10张图片
SpringCloud Eureka笔记_第11张图片

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

@See AbstractInstanceRegistry.EvictionTask

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

SpringCloud Eureka笔记_第12张图片
SpringCloud Eureka笔记_第13张图片
SpringCloud Eureka笔记_第14张图片

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

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

你可能感兴趣的:(spring,java,eureka)