通过前面文章的分析EurekaClientAutoConfiguration类中EurekaClientConfigBean和EurekaInstanceConfigBean的配置属性说明,我们在看看EurekaServiceRegistry这个类bean的注入,进入该类我们看到它实现了ServiceRegistry接口
这个接口是我们spring cloud提供的用于服务注册的接口,在接口上面它同时提供了EurekaRegistration实例对象的依赖,进入到EurekaRegistration类可以了解到该类实现了Registration接口
通过代码我们发现它实现了接口中返回值的信息初始化,同时在其内部类Builder中在对象没有初始化的时候初始化对象赋值,并返回EurekaRegistration对象。
public EurekaRegistration build() { Assert.notNull(instanceConfig, "instanceConfig may not be null"); if (this.applicationInfoManager == null) { InstanceInfo instanceInfo = new InstanceInfoFactory() .create(this.instanceConfig); this.applicationInfoManager = new ApplicationInfoManager( this.instanceConfig, instanceInfo); } if (this.eurekaClient == null) { Assert.notNull(this.clientConfig, "if eurekaClient is null, EurekaClientConfig may not be null"); Assert.notNull(this.publisher, "if eurekaClient is null, ApplicationEventPublisher may not be null"); this.eurekaClient = new CloudEurekaClient(this.applicationInfoManager, this.clientConfig, this.publisher); } return new EurekaRegistration(instanceConfig, eurekaClient, applicationInfoManager, healthCheckHandler); }
我们在回到EurekaServiceRegistry类中,可以看到它有以下方法
它实现了服务注册,取消注册,状态设置等方法,我们先分析下register()方法:
通过私有方法maybeInitializeClient()获取当前注册的实例对象以及服务器上面返回的所有注册信息
private void maybeInitializeClient(EurekaRegistration reg) { // force initialization of possibly scoped proxies reg.getApplicationInfoManager().getInfo(); reg.getEurekaClient().getApplications(); }
最后在register()方法里面设置状态为UP及健康检查的连接地址。在deregister()方法中则只是将状态值设置为DOWN作为注销标志。
接下来我们了解下ApplicationInfoManager bean的注入,它通过我们前面已经注入过的EurekaClientConfigBean获取client配置信息,通过InstanceInfoFactory类的create()方法将配置信息复制到Netflix的InstanceInfo对象中,然后将InstanceInfo对象传递给ApplicationInfoManager,进入到ApplicationInfoManager类,看看它的结果如下图
根据上面的方法我们主要看下重要的一些实现
1.initComponent()
该方法是初始化EurekaInstanceConfig和InstanceInfo对象,这个方法主要用在非bean注入方式的时候,在获取InstanceInfo对象对象的时候,我们可以了解到EurekaConfigBasedInstanceInfoProvider类是单例模式的,同时get()方法是同步实现的。
2.StatusChangeListener
这个类相关的目前没有看到有任何的实现,所以相关的方法就不介绍了
3.refreshDataCenterInfoIfRequired()
这个方法从名称可以知道是刷新数据中心信息的,它用于表示新的数据连接地址被配置了,把当前实例对象设置为脏数据,然后在相应的应用引用的时候重新进行配置
public void refreshDataCenterInfoIfRequired() { String existingAddress = instanceInfo.getHostName(); String existingSpotInstanceAction = null; if (instanceInfo.getDataCenterInfo() instanceof AmazonInfo) { existingSpotInstanceAction = ((AmazonInfo) instanceInfo.getDataCenterInfo()).get(AmazonInfo.MetaDataKey.spotInstanceAction); } String newAddress; if (config instanceof RefreshableInstanceConfig) { // Refresh data center info, and return up to date address newAddress = ((RefreshableInstanceConfig) config).resolveDefaultAddress(true); } else { newAddress = config.getHostName(true); } String newIp = config.getIpAddress(); if (newAddress != null && !newAddress.equals(existingAddress)) { logger.warn("The address changed from : {} => {}", existingAddress, newAddress); updateInstanceInfo(newAddress, newIp); } if (config.getDataCenterInfo() instanceof AmazonInfo) { String newSpotInstanceAction = ((AmazonInfo) config.getDataCenterInfo()).get(AmazonInfo.MetaDataKey.spotInstanceAction); if (newSpotInstanceAction != null && !newSpotInstanceAction.equals(existingSpotInstanceAction)) { logger.info(String.format("The spot instance termination action changed from: %s => %s", existingSpotInstanceAction, newSpotInstanceAction)); updateInstanceInfo(null , null ); } } } private void updateInstanceInfo(String newAddress, String newIp) { // :( in the legacy code here the builder is acting as a mutator. // This is hard to fix as this same instanceInfo instance is referenced elsewhere. // We will most likely re-write the client at sometime so not fixing for now. InstanceInfo.Builder builder = new InstanceInfo.Builder(instanceInfo); if (newAddress != null) { builder.setHostName(newAddress); } if (newIp != null) { builder.setIPAddr(newIp); } builder.setDataCenterInfo(config.getDataCenterInfo()); instanceInfo.setIsDirty(); }
3.refreshLeaseInfoIfRequired()
这个方法是指过期时间的刷新,当配置的过期时间与默认配置的不相同时就进行刷新操作。
public void refreshLeaseInfoIfRequired() { LeaseInfo leaseInfo = instanceInfo.getLeaseInfo(); if (leaseInfo == null) { return; } int currentLeaseDuration = config.getLeaseExpirationDurationInSeconds(); int currentLeaseRenewal = config.getLeaseRenewalIntervalInSeconds(); if (leaseInfo.getDurationInSecs() != currentLeaseDuration || leaseInfo.getRenewalIntervalInSecs() != currentLeaseRenewal) { LeaseInfo newLeaseInfo = LeaseInfo.Builder.newBuilder() .setRenewalIntervalInSecs(currentLeaseRenewal) .setDurationInSecs(currentLeaseDuration) .build(); instanceInfo.setLeaseInfo(newLeaseInfo); instanceInfo.setIsDirty(); } }
以上就是本节的主要内容,我们主要了解了EurekaServiceRegistry和ApplicationInfoManager 这2个类的注入,后面章节我们继续剩下的类的注入讲解。
相关推荐
《Spring Cloud Eureka源码分析》 Spring Cloud Eureka是Netflix公司开源的一个服务发现组件,它是基于REST的服务,用于在分布式系统中定位服务,以实现负载均衡和中间层服务器的故障转移。Eureka的设计目标是提供...
为什么要看源码: 1、提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提 升自己的技术功底 2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有...
1. Eureka源码:研究Eureka的工作机制,包括服务注册、心跳机制、服务发现等,理解如何维护服务实例的健康状态。 2. Ribbon源码:查看Ribbon如何根据服务发现的信息选择合适的服务器,并实现负载均衡策略。 3. ...
3. `springcloud-consumer-hystrix-dashboard`可能是一个使用Hystrix Dashboard的消费者服务,用于监控服务的运行状态和熔断情况。 4. `springcloud-Eurake-7001`可能是Eureka服务器的实例,负责服务注册与发现,...
你可以在这个项目的基础上,按照上述步骤和源码分析,扩展到多节点的Eureka集群。 总的来说,构建Spring Cloud Eureka集群是一项关键任务,它涉及到服务注册、发现、健康检查和治理等多个方面。通过源码实现,不仅...
《Spring Cloud实战源码》是针对Java开发者的一本深度指南,旨在帮助读者全面理解并熟练掌握Spring Cloud框架的使用和核心原理。Spring Cloud是构建分布式系统的服务发现、配置管理、负载均衡、熔断机制等解决方案的...
### 一、SpringCloud简介与核心组件 #### 1.1 SpringCloud概述 SpringCloud是一套基于Spring Boot实现的微服务云应用开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线...
SpringCloud的源码分析有助于开发者了解其实现机制,从而更好地定制和优化自己的服务。源码中包含了Eureka服务发现、Zuul边缘服务、Hystrix断路器、 Ribbon客户端负载均衡、Feign声明式客户端、Spring Cloud Config...
**源码分析** 对于深入理解 Eureka 的工作原理,可以查看其源码。Eureka Server 的核心类包括 `EurekaServerContext` 和 `EurekaServerConfig`,它们负责处理服务的注册、注销和心跳等功能。Eureka Client 的关键类...
9. **源码分析**: 分享的源码是作者手敲并通过编译验证的,意味着你可以深入研究每个服务的实现细节,理解Spring Cloud的原理和最佳实践。通过阅读和运行这些代码,开发者可以提升自己在实际项目中的应用能力。 ...
总结来说,"SpringCloud+SpringBoot+Eureka源码"项目旨在通过源码学习,深入了解如何利用SpringBoot快速构建微服务,并借助SpringCloud的Eureka实现服务间的注册与发现。通过对源码的探索,我们可以更好地掌握微服务...
在压缩包文件中,`SpringCloud-Consumer`可能包含了服务消费者项目的源代码,`EureKaserver`则是Eureka Server的源码,而`SpringCloud-Service`则可能是服务提供者的源码。通过分析这些代码,你可以更深入地理解...
综上所述,"尚硅谷周阳老师SpringCloud学习源码"涵盖了SpringCloud的多个关键组件,通过学习这些源码,开发者能够深入理解微服务架构中的服务治理、API网关、断路器、配置中心、消息驱动等核心概念,进一步提升...
本篇将围绕SpringCloud的核心组件进行源码分析,包括Eureka服务注册与发现、Ribbon客户端负载均衡、Hystrix断路器、Zuul路由网关以及Config分布式配置中心,旨在帮助读者深入理解这些组件的工作原理。 一、Eureka:...
SpringCloud是中国Java开发者广泛使用的微服务框架,它包含了一系列组件,用于构建分布式系统。这个压缩包文件"SpringCloud 15个完整例子"提供了一系列从基础到进阶的示例项目,帮助用户深入理解并实践SpringCloud的...
这些视频课程结合源码分析和课件学习,可以帮助开发者深入理解SpringBoot和SpringCloud的核心原理,并掌握实际应用中的最佳实践。对于想要在微服务领域深入发展的IT专业人士来说,这是一个非常有价值的资源。通过...
源码分析** 在"demo1"中,我们可能看到以下关键组件的实现: - 服务启动类:包含`@EnableEurekaClient`注解,表示该服务会注册到Eureka服务器。 - API接口定义:定义了微服务对外提供的业务接口。 - 控制器:实现...
本项目为基于Java的SpringCloud注册中心Eureka设计源码,包含54个文件,其中Java源文件26个,PNG图片文件11个,Git忽略文件6个,XML和YAML配置文件各5个,Markdown文档1个。该源码旨在构建一个适用于SpringCloud...
《基于SpringCloud的电商平台源码解析》 在现代互联网应用开发中,微服务架构已经成为主流。Spring Cloud作为一套完整的微服务解决方案,为开发者提供了构建分布式系统所需的工具集合,包括服务发现、配置中心、...
尚硅谷提供的SpringCloud源码分析资源,为开发者深入理解这一框架提供了宝贵的资料。本文将围绕SpringCloud的核心组件、设计模式以及源码解析进行详细介绍,并结合思维导图,帮助读者构建清晰的知识体系。 首先,...