spring cloud eureka client 启动分析

1.自动装配原则下client加载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6P4iHP2-1622762589454)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0f20abe2-eb06-4130-86ee-f98e89e423cd/Untitled.png)]

配置类简单描述:

1.EurekaClientConfigServerAutoConfiguration :如果配置服务器和eureka 实例在同一个服务上,这里需要处理一下服务实例的元数据信息

2.EurekaDiscoveryClientConfigServiceAutoConfiguration:eureka 与 配置中心的联合使用处理

3.EurekaClientAutoConfiguration:eureka client 服务启动的核心

4.RibbonEurekaAutoConfiguration:eureka 与 ribbon整合的核心

5.EurekaDiscoveryClientConfiguration:eureka client配置类

6.EurekaDiscoveryClientConfigServiceBootstrapConfiguration: 通过服务发现找到配置服务器的启动类



2.这里我们首先看看eureka client配置类EurekaDiscoveryClientConfiguration

2.1 eureka 启动开关判断

这里我们看到Marker,这个是不是很眼熟,跟Eureka server 服务启用的的标识类名称一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qgkQNPA-1622762589456)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a9b2eaad-595b-469b-a9f0-1454127a6a49/Untitled.png)]

但是有个区别就是,这里只需要开启eureka.client.enabled = true 就会自动开启eureka client。而不需要向eureka server一样,需要@EnableEurekaServer来开启。


2.2 eureka client 配置刷新

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-851bhZlY-1622762589457)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7c40ab63-55df-4253-883c-9a25ac157210/Untitled.png)]


2.3 eureka client 之actuator检查

将eureka client的健康状态交给actuator监控采集中心

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljYV51Uc-1622762589458)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d9b9cf47-c29b-405e-96b1-a4b9059a012a/Untitled.png)]



3. EurekaClientAutoConfiguration eureka client 启动核心类


3.1 令人头疼的注解堆

@Configuration
@EnableConfigurationProperties // 开启从springboot 配置中读取配置信息的功能
@ConditionalOnClass(EurekaClientConfig.class) // 启动条件1: EurekaClientConfig这个类要存在
@Import(DiscoveryClientOptionalArgsConfiguration.class) // 这个跟spring.factories重复了
@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class) // 这个在EurekaDiscoveryClientConfiguration已经初始化到spring容器中了
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true) // 跟EurekaDiscoveryClientConfiguration启用的判断条件一直
// 在这里类之前加载
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
		CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })
// 在这些类之后加载
@AutoConfigureAfter(name = {"org.springframework.cloud.autoconfigure.RefreshAutoConfiguration",
		"org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration",
		"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration"})
public class EurekaClientAutoConfiguration {

这里总结一下:

  1. 通过ConditionalOnClass和ConditionalOnBean和ConditionalOnProperty来判断是否加载eureka client
  2. 通过AutoConfigureBefore和AutoConfigureAfter进行配置加载顺序编排

3.2 初始化Eureka 服务实例配置信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y4n2xr0-1622762589459)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1159aa09-dcf6-4290-9376-e3c8f6fe0f90/Untitled.png)]


3.3 初始化DiscoveryClient的增强类(EurekaDiscoveryClient)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LWfwYB8-1622762589459)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/246a7f9e-e547-4232-97b6-5519e14e3b52/Untitled.png)]

但是这里的EurekaDiscoveryClient只是一个增强类,具体的eureka client 是作为参数传递进来的那个client,这个的初始化尤为关键。


3.4 初始化服务注册处理类

@Bean
	public EurekaServiceRegistry eurekaServiceRegistry() {
		return new EurekaServiceRegistry();
	}

3.5 初始化自动服务注册处理类

在spring容器加载完成之后,自动端口检测和服务注册,并发布服务实例注册事件

这个也是一个事件监听器:

**WebServerInitializedEvent :**web容器初始化完成事件,这个时候就知道我们的web服务监听了哪个端口,这样eureka 提供服务的端口也就指定了。

ContextClosedEvent:spring上下文关闭事件,这个时候会执行服务下线操作。这些都是spring的各个关键阶段对外发布的事件,这里对其进行了处理。

@Bean
	@ConditionalOnBean(AutoServiceRegistrationProperties.class)
	@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
	public EurekaAutoServiceRegistration eurekaAutoServiceRegistration(ApplicationContext context, EurekaServiceRegistry registry,
																	   EurekaRegistration registration) {
		return new EurekaAutoServiceRegistration(context, registry, registration);
	}


4. EurekaClientAutoConfiguration的内部类EurekaClientConfiguration在干啥?


4.1 初始化 eureka client (重点)

这个是DiscoveryClient的子类,是整个Eureka Client的核心。其走的初始化流程是eureka原生的DiscoveryClient。在之前的eureka server原生源码中已经讲过。这里不再赘述。这里面的东西很多,想了解的可以去瞅瞅。

@Bean(destroyMethod = "shutdown")
		@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT)
		public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config) {
			return new CloudEurekaClient(manager, config, this.optionalArgs,
					this.context);
		}

4.2 初始化服务实例管理器

@Bean
		@ConditionalOnMissingBean(value = ApplicationInfoManager.class, search = SearchStrategy.CURRENT)
		public ApplicationInfoManager eurekaApplicationInfoManager(
				EurekaInstanceConfig config) {
			InstanceInfo instanceInfo = new InstanceInfoFactory().create(config);
			// 将自身服务实例交给服务实例管理器管理
			return new ApplicationInfoManager(config, instanceInfo);
		}

4.3 eureka 注册信息存储器

这里面存储了eurekaClient,eureka client配置信息,自身服务实例管理器,健康检查器等

@Bean
		@ConditionalOnBean(AutoServiceRegistrationProperties.class)
		@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
		public EurekaRegistration eurekaRegistration(EurekaClient eurekaClient,
													 CloudEurekaInstanceConfig instanceConfig,
													 ApplicationInfoManager applicationInfoManager,
													 @Autowired(required = false) ObjectProvider<HealthCheckHandler> healthCheckHandler) {
			return EurekaRegistration.builder(instanceConfig)
					.with(applicationInfoManager)
					.with(eurekaClient)
					.with(healthCheckHandler)
					.build();
		}


5.EurekaClientAutoConfiguration的内部类RefreshableEurekaClientConfiguration在干啥?

这个类主要是当配置文件发生变化后,eureka client 进行重新创建,服务进行重新注册,心跳信息进行重新包装,服务实例管理器ApplicationInfoManager插入最新实例信息,包括服务实例注册信息存储器EurekaRegistration都要重新构造一遍。

这就是spring cloud eureka client 对配置中心配置自动刷新的支持。



6.小结

eureka client的初始化内容比较多,而且做了比较多的一个封装。其中为了配合@RefreshScope 自动刷新也做了很多事情。总的来说跟eureka client 原生的初始化没有太大区别,都是走的DiscoveryClient的构造函数进行初始化的,这个是核心。其他的都是为了配合spring 做了一些变动。比如InstanceRegistry,这个就是对PeerAwareInstanceRegistryImpl的封装,在这里加入了spring相关的东西。
总而言之,spring cloud的源码阅读起来,其实是比eureka server原生要麻烦一点的。毕竟相互注入的对象初始化比较难找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值