`
357029540
  • 浏览: 734964 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论
阅读更多

        通过前面文章的分析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个类的注入,后面章节我们继续剩下的类的注入讲解。

 
 
 

  • 大小: 15.6 KB
  • 大小: 21.9 KB
  • 大小: 14.7 KB
  • 大小: 53.2 KB
0
0
分享到:
评论

相关推荐

    Spring Cloud Eureka源码分析

    《Spring Cloud Eureka源码分析》 Spring Cloud Eureka是Netflix公司开源的一个服务发现组件,它是基于REST的服务,用于在分布式系统中定位服务,以实现负载均衡和中间层服务器的故障转移。Eureka的设计目标是提供...

    Spring Cloud Eureka源码分析.pdf

    为什么要看源码: 1、提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提 升自己的技术功底 2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有...

    基于spring cloud项目源码源码.rar

    1. Eureka源码:研究Eureka的工作机制,包括服务注册、心跳机制、服务发现等,理解如何维护服务实例的健康状态。 2. Ribbon源码:查看Ribbon如何根据服务发现的信息选择合适的服务器,并实现负载均衡策略。 3. ...

    狂神Spring Cloud源码

    3. `springcloud-consumer-hystrix-dashboard`可能是一个使用Hystrix Dashboard的消费者服务,用于监控服务的运行状态和熔断情况。 4. `springcloud-Eurake-7001`可能是Eureka服务器的实例,负责服务注册与发现,...

    spring cloud eureka集群模拟源码实现

    你可以在这个项目的基础上,按照上述步骤和源码分析,扩展到多节点的Eureka集群。 总的来说,构建Spring Cloud Eureka集群是一项关键任务,它涉及到服务注册、发现、健康检查和治理等多个方面。通过源码实现,不仅...

    spring-cloud实战源码

    《Spring Cloud实战源码》是针对Java开发者的一本深度指南,旨在帮助读者全面理解并熟练掌握Spring Cloud框架的使用和核心原理。Spring Cloud是构建分布式系统的服务发现、配置管理、负载均衡、熔断机制等解决方案的...

    尚硅谷SpringCloud视频 + 源码 百度网盘

    ### 一、SpringCloud简介与核心组件 #### 1.1 SpringCloud概述 SpringCloud是一套基于Spring Boot实现的微服务云应用开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线...

    springcloud 源码+解读

    SpringCloud的源码分析有助于开发者了解其实现机制,从而更好地定制和优化自己的服务。源码中包含了Eureka服务发现、Zuul边缘服务、Hystrix断路器、 Ribbon客户端负载均衡、Feign声明式客户端、Spring Cloud Config...

    spring cloud eureka 服务搭建

    **源码分析** 对于深入理解 Eureka 的工作原理,可以查看其源码。Eureka Server 的核心类包括 `EurekaServerContext` 和 `EurekaServerConfig`,它们负责处理服务的注册、注销和心跳等功能。Eureka Client 的关键类...

    spring cloud实战源码

    9. **源码分析**: 分享的源码是作者手敲并通过编译验证的,意味着你可以深入研究每个服务的实现细节,理解Spring Cloud的原理和最佳实践。通过阅读和运行这些代码,开发者可以提升自己在实际项目中的应用能力。 ...

    SpringCloud+SpringBoot+Eureka源码

    总结来说,"SpringCloud+SpringBoot+Eureka源码"项目旨在通过源码学习,深入了解如何利用SpringBoot快速构建微服务,并借助SpringCloud的Eureka实现服务间的注册与发现。通过对源码的探索,我们可以更好地掌握微服务...

    SpringCloud之Eureka入门篇

    在压缩包文件中,`SpringCloud-Consumer`可能包含了服务消费者项目的源代码,`EureKaserver`则是Eureka Server的源码,而`SpringCloud-Service`则可能是服务提供者的源码。通过分析这些代码,你可以更深入地理解...

    尚硅谷周阳老师SpringCloud学习源码

    综上所述,"尚硅谷周阳老师SpringCloud学习源码"涵盖了SpringCloud的多个关键组件,通过学习这些源码,开发者能够深入理解微服务架构中的服务治理、API网关、断路器、配置中心、消息驱动等核心概念,进一步提升...

    SpringCloud源码-01.zip

    本篇将围绕SpringCloud的核心组件进行源码分析,包括Eureka服务注册与发现、Ribbon客户端负载均衡、Hystrix断路器、Zuul路由网关以及Config分布式配置中心,旨在帮助读者深入理解这些组件的工作原理。 一、Eureka:...

    SpringCloud 15个完整例子

    SpringCloud是中国Java开发者广泛使用的微服务框架,它包含了一系列组件,用于构建分布式系统。这个压缩包文件"SpringCloud 15个完整例子"提供了一系列从基础到进阶的示例项目,帮助用户深入理解并实践SpringCloud的...

    Spring和SpringCloud视频

    这些视频课程结合源码分析和课件学习,可以帮助开发者深入理解SpringBoot和SpringCloud的核心原理,并掌握实际应用中的最佳实践。对于想要在微服务领域深入发展的IT专业人士来说,这是一个非常有价值的资源。通过...

    springcloud demo项目源码

    源码分析** 在"demo1"中,我们可能看到以下关键组件的实现: - 服务启动类:包含`@EnableEurekaClient`注解,表示该服务会注册到Eureka服务器。 - API接口定义:定义了微服务对外提供的业务接口。 - 控制器:实现...

    基于Java的SpringCloud注册中心Eureka设计源码分析

    本项目为基于Java的SpringCloud注册中心Eureka设计源码,包含54个文件,其中Java源文件26个,PNG图片文件11个,Git忽略文件6个,XML和YAML配置文件各5个,Markdown文档1个。该源码旨在构建一个适用于SpringCloud...

    基于springcloud的电商平台源码.zip

    《基于SpringCloud的电商平台源码解析》 在现代互联网应用开发中,微服务架构已经成为主流。Spring Cloud作为一套完整的微服务解决方案,为开发者提供了构建分布式系统所需的工具集合,包括服务发现、配置中心、...

    尚硅谷SpringCloud的源码及思维导图

    尚硅谷提供的SpringCloud源码分析资源,为开发者深入理解这一框架提供了宝贵的资料。本文将围绕SpringCloud的核心组件、设计模式以及源码解析进行详细介绍,并结合思维导图,帮助读者构建清晰的知识体系。 首先,...

Global site tag (gtag.js) - Google Analytics