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

   这是第一次写源码的解析,主要是给自己留一个印象,有很多不充足的地方以后自己慢慢补充。这个spring cloud config源码的解析是以2.1.0.BUILD-SNAPSHOT为基础,时间是2018-10-05以前的代码来分析。spring cloud config主要有3个模块,分别是spring-cloud-config-server、spring-cloud-config-client、spring-cloud-config-monitor。

   首先我们看下spring-cloud-config-server模块,通过该模块的目录resources/META-INF/spring.factories配置文件可以看到一些启动配置如下

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.config.server.bootstrap.ConfigServerBootstrapConfiguration,\
org.springframework.cloud.config.server.config.EncryptionAutoConfiguration

# Application listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.config.server.bootstrap.ConfigServerBootstrapApplicationListener

# Autoconfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.config.server.config.ConfigServerAutoConfiguration,\
org.springframework.cloud.config.server.config.EncryptionAutoConfiguration

  我们首先看下org.springframework.boot.autoconfigure.EnableAutoConfiguration路径下的ConfigServerAutoConfiguration配置类,它用@Import来加载配置其他相关的配置类。

@Configuration
@ConditionalOnBean(ConfigServerConfiguration.Marker.class)
@EnableConfigurationProperties(ConfigServerProperties.class)
@Import({ EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class,
      ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class })
public class ConfigServerAutoConfiguration {

}

  首先来看一下EnvironmentRepositoryConfiguration这个类的实现

@Configuration
@EnableConfigurationProperties({ SvnKitEnvironmentProperties.class,
      JdbcEnvironmentProperties.class, NativeEnvironmentProperties.class, VaultEnvironmentProperties.class })
@Import({ CompositeRepositoryConfiguration.class, JdbcRepositoryConfiguration.class, VaultRepositoryConfiguration.class,
      SvnRepositoryConfiguration.class, NativeRepositoryConfiguration.class, GitRepositoryConfiguration.class,
      DefaultRepositoryConfiguration.class })
public class EnvironmentRepositoryConfiguration {
**
}

1.首先通过@Configuration注解说明它是一个配置文件属性,用于注入Spring中;

2.通过@EnableConfigurationProperties注解引入了properties文件,分别是

SvnKitEnvironmentProperties(spring.cloud.config.server.svn)、

JdbcEnvironmentProperties(spring.cloud.config.server.jdbc)、

NativeEnvironmentProperties(spring.cloud.config.server.native)、

VaultEnvironmentProperties(spring.cloud.config.server.vault),通过查看具体的properties文件我们可以看到它们对应的是其名字相应的perfix属性配置在*.yml或*.properties中的配置,但是在这里可以看到明显少了JGitEnvironmentProperties

配置文件的引入,这里没有关系,我们在后面可以看到在GitRepositoryConfiguration类中通过参数形式传入了;

3.通过@Import注解引入CompositeRepositoryConfiguration、JdbcRepositoryConfiguration、VaultRepositoryConfiguration、SvnRepositoryConfiguration、NativeRepositoryConfiguration、GitRepositoryConfiguration、DefaultRepositoryConfiguration

相关的仓库配置类为默认bean,这些bean就是我们常用的配置公共引入属性的来源地方;

4.在类中同时新增了以下bean:

1).ConfigServerHealthIndicator configServerHealthIndicator()健康端点

@Bean
@ConditionalOnProperty(value = "spring.cloud.config.server.health.enabled", matchIfMissing = true)
public ConfigServerHealthIndicator configServerHealthIndicator(
      EnvironmentRepository repository) {
   return new ConfigServerHealthIndicator(repository);
}

2).MultipleJGitEnvironmentProperties multipleJGitEnvironmentProperties()无参数的git bean

@Bean
@ConditionalOnMissingBean(search = SearchStrategy.CURRENT)
public MultipleJGitEnvironmentProperties multipleJGitEnvironmentProperties() {
   return new MultipleJGitEnvironmentProperties();
}

3).EnvironmentWatch environmentWatch()的consule watch的prefix为spring.cloud.config.server.consul.watch.enabled的是否启动的 bean

@Configuration
@ConditionalOnProperty(value = "spring.cloud.config.server.consul.watch.enabled")
protected static class ConsulEnvironmentWatchConfiguration {
   @Bean
   public EnvironmentWatch environmentWatch() {
      return new ConsulEnvironmentWatch();
   }
}

4).未生成EnvironmentWatch environmentWatch()的consule watch 的情况下生成bean

@Configuration
@ConditionalOnMissingBean(EnvironmentWatch.class)
protected static class DefaultEnvironmentWatch {
   @Bean
   public EnvironmentWatch environmentWatch() {
      return new EnvironmentWatch.Default();
   }
}

5).有回调类TransportConfigCallback的情况下的MultipleJGitEnvironmentRepositoryFactory gitEnvironmentRepositoryFactory()的带参bean

@Configuration
@ConditionalOnClass(TransportConfigCallback.class)
static class JGitFactoryConfig {

    @Bean
    public MultipleJGitEnvironmentRepositoryFactory gitEnvironmentRepositoryFactory(
            ConfigurableEnvironment environment, ConfigServerProperties server,
            Optional<ConfigurableHttpConnectionFactory> jgitHttpConnectionFactory,
            Optional<TransportConfigCallback> customTransportConfigCallback) {
        return new MultipleJGitEnvironmentRepositoryFactory(environment, server, jgitHttpConnectionFactory,
   customTransportConfigCallback);
    }
}

6).有回调类TransportConfigCallback和客户端类HttpClient的情况下的ConfigurableHttpConnectionFactory httpClientConnectionFactory()的bean

@Configuration
@ConditionalOnClass({ HttpClient.class, TransportConfigCallback.class })
static class JGitHttpClientConfig {
    @Bean
    public ConfigurableHttpConnectionFactory httpClientConnectionFactory() {
        return new HttpClientConfigurableHttpConnectionFactory();
    }
}

7).有异常类SVNException情况下的SvnEnvironmentRepositoryFactory svnEnvironmentRepositoryFactory() 的bean

@Configuration
@ConditionalOnClass(SVNException.class)
static class SvnFactoryConfig {
    @Bean
    public SvnEnvironmentRepositoryFactory svnEnvironmentRepositoryFactory(ConfigurableEnvironment environment,
                                                                           ConfigServerProperties server) {
        return new SvnEnvironmentRepositoryFactory(environment, server);
    }
}

8).带参的VaultEnvironmentRepositoryFactory vaultEnvironmentRepositoryFactory()的bean

@Configuration
static class VaultFactoryConfig {
    @Bean
    public VaultEnvironmentRepositoryFactory vaultEnvironmentRepositoryFactory(
            ObjectProvider<HttpServletRequest> request, EnvironmentWatch watch,
            Optional<VaultEnvironmentRepositoryFactory.VaultRestTemplateFactory> vaultRestTemplateFactory) {
        return new VaultEnvironmentRepositoryFactory(request, watch, vaultRestTemplateFactory);
    }
}

9).有客户端类HttpClient的情况下的VaultEnvironmentRepositoryFactory.VaultRestTemplateFactory vaultRestTemplateFactory()的bean

@Configuration
@ConditionalOnClass(HttpClient.class)
static class VaultHttpClientConfig {
    @Bean
    public VaultEnvironmentRepositoryFactory.VaultRestTemplateFactory vaultRestTemplateFactory() {
        return new HttpClientVaultRestTemplateFactory();
    }
}

10).有数据库模板类JdbcTemplat情况下的JdbcEnvironmentRepositoryFactory jdbcEnvironmentRepositoryFactory()带参bean

@Configuration
@ConditionalOnClass(JdbcTemplate.class)
static class JdbcFactoryConfig {
 @Bean
    @ConditionalOnBean(JdbcTemplate.class)
    public JdbcEnvironmentRepositoryFactory jdbcEnvironmentRepositoryFactory(JdbcTemplate jdbc) {
        return new JdbcEnvironmentRepositoryFactory(jdbc);
    }
}

11).NativeEnvironmentRepositoryFactory nativeEnvironmentRepositoryFactory()带参bean

@Configuration
static class NativeFactoryConfig {
    @Bean
    public NativeEnvironmentRepositoryFactory nativeEnvironmentRepositoryFactory(ConfigurableEnvironment environment,
                                                                                 ConfigServerProperties properties) {
        return new NativeEnvironmentRepositoryFactory(environment, properties);
    }
}

12).定义在不存在bean为EnvironmentRepository时拥有参数MultipleJGitEnvironmentRepositoryFactory和MultipleJGitEnvironmentProperties

的MultipleJGitEnvironmentRepository defaultEnvironmentRepository()带参bean,其中MultipleJGitEnvironmentProperties定义了prefix为spring.cloud.config.server.git

的git配置

@Configuration
@ConditionalOnMissingBean(value = EnvironmentRepository.class)//, search = SearchStrategy.CURRENT)
class DefaultRepositoryConfiguration {
   @Autowired
   private ConfigurableEnvironment environment;

   @Autowired
   private ConfigServerProperties server;

   @Autowired(required = false)
   private TransportConfigCallback customTransportConfigCallback;

   @Bean
   public MultipleJGitEnvironmentRepository defaultEnvironmentRepository(
           MultipleJGitEnvironmentRepositoryFactory gitEnvironmentRepositoryFactory,
         MultipleJGitEnvironmentProperties environmentProperties) throws Exception {
      return gitEnvironmentRepositoryFactory.build(environmentProperties);
   }
}

 13).定义在不存在bean为EnvironmentRepository且当前数据来源配置环境为native时,拥有参数NativeEnvironmentRepositoryFactory和NativeEnvironmentProperties

的NativeEnvironmentRepository nativeEnvironmentRepository()带参的bean

@Configuration
@ConditionalOnMissingBean(EnvironmentRepository.class)
@Profile("native")
class NativeRepositoryConfiguration {
   @Bean
   public NativeEnvironmentRepository nativeEnvironmentRepository(NativeEnvironmentRepositoryFactory factory,
         NativeEnvironmentProperties environmentProperties) {
        return factory.build(environmentProperties);
   }
}

 14).数据来源配置环境为git的MultipleJGitEnvironmentRepository bean

@Configuration
@Profile("git")
class GitRepositoryConfiguration extends DefaultRepositoryConfiguration {
}

15).数据来源配置环境为subversion拥有参数SvnKitEnvironmentProperties和SvnEnvironmentRepositoryFactory的SvnKitEnvironmentRepository svnKitEnvironmentRepository()带参bean

@Configuration
@Profile("subversion")
class SvnRepositoryConfiguration {
   @Bean
   public SvnKitEnvironmentRepository svnKitEnvironmentRepository(SvnKitEnvironmentProperties environmentProperties,
                                                                   SvnEnvironmentRepositoryFactory factory) {
      return factory.build(environmentProperties);
   }
}

  16).数据来源配置环境为vault拥有参数VaultEnvironmentRepositoryFactory

和VaultEnvironmentProperties的VaultEnvironmentRepository vaultEnvironmentRepository带参bean

@Configuration
@Profile("vault")
class VaultRepositoryConfiguration {
   @Bean
   public VaultEnvironmentRepository vaultEnvironmentRepository(VaultEnvironmentRepositoryFactory factory,
                                                                 VaultEnvironmentProperties environmentProperties)
            throws Exception {
      return factory.build(environmentProperties);
   }
}

  17).有数据库模板类JdbcTemplate且数据来源配置环境为jdbc,拥有参数JdbcEnvironmentRepositoryFactory

和JdbcEnvironmentProperties的JdbcEnvironmentRepository jdbcEnvironmentRepository()带参bean

@Configuration
@Profile("jdbc")
@ConditionalOnClass(JdbcTemplate.class)
class JdbcRepositoryConfiguration {

   @Bean
   @ConditionalOnBean(JdbcTemplate.class)
   public JdbcEnvironmentRepository jdbcEnvironmentRepository(JdbcEnvironmentRepositoryFactory factory,
                                                JdbcEnvironmentProperties environmentProperties) {
      return factory.build(environmentProperties);
   }
}

  18).数据来源配置环境为composite拥有参数Environment的CompositeEnvironmentBeanFactoryPostProcessor compositeEnvironmentRepositoryBeanFactoryPostProcessor()带参bean

@Bean
public static CompositeEnvironmentBeanFactoryPostProcessor compositeEnvironmentRepositoryBeanFactoryPostProcessor(
      Environment environment) {
   return new CompositeEnvironmentBeanFactoryPostProcessor(environment);
}

  19).数据来源配置环境为composite本地多环境仓库下优先使用SearchPathCompositeEnvironmentRepository searchPathCompositeEnvironmentRepository()的bean

@Primary
@Bean
@ConditionalOnSearchPathLocator
public SearchPathCompositeEnvironmentRepository searchPathCompositeEnvironmentRepository(
      List<EnvironmentRepository> environmentRepositories) throws Exception {
   return new SearchPathCompositeEnvironmentRepository(environmentRepositories);
}

  20).数据来源配置环境为composite非本地多环境下优先使用CompositeEnvironmentRepository compositeEnvironmentRepository()的bean

@Primary
@Bean
@ConditionalOnMissingSearchPathLocator
public CompositeEnvironmentRepository compositeEnvironmentRepository(
      List<EnvironmentRepository> environmentRepositories) throws Exception {
   return new CompositeEnvironmentRepository(environmentRepositories);
}

 在下一篇我们主要了解下git相关的实现代码的相关实现。

0
0
分享到:
评论

相关推荐

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

    《Spring Cloud项目源码深度解析》 在当前的微服务架构领域,Spring Cloud以其强大的功能和易用性,成为开发者构建分布式系统的重要选择。本文将深入探讨基于Spring Cloud的项目源码,帮助读者理解其核心原理,提升...

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

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

    spring cloud 配置源码.zip

    《Spring Cloud配置源码解析与实战》 Spring Cloud作为微服务架构的重要组件,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话...

    spring-cloud实战源码

    总的来说,《Spring Cloud实战源码》涵盖了Spring Cloud的核心组件,从入门到进阶,再到源码解析,帮助开发者全面掌握这一强大的微服务框架。通过学习,你可以构建出稳定、高效、可扩展的分布式系统。

    springcloud 源码+解读

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

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

    总的来说,通过尚硅谷的SpringCloud源码解析和思维导图,开发者不仅可以深入了解SpringCloud的运作原理,还能提升对微服务架构设计的理解,为实际项目开发提供有力的支持。同时,对源码的学习也有助于培养解决问题和...

    SpringCloud源码-01.zip

    《SpringCloud源码解析——构建微服务架构的关键组件》 SpringCloud作为当今最热门的微服务框架之一,深受广大开发者喜爱。它集成了众多优秀的开源项目,为开发人员提供了便捷的微服务开发工具。本篇将围绕Spring...

    springcloud-config-master.rar

    《SpringCloud Config 源码解析与应用实践》 SpringCloud Config 是一个强大的微服务配置中心,它允许我们在运行时管理应用的配置,并且能够实时地推送到客户端。本篇文章将深入探讨 SpringCloud Config 的核心原理...

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

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

    适合新手入门的springcloud完整项目资源,附带sql和详细的开发文档,可直接导入运行。

    本资源为新手提供了一个完整的SpringCloud入门项目,包括源码、SQL脚本和详细的开发文档,非常适合想要快速了解和学习SpringCloud的新手。 1. **SpringCloud简介** SpringCloud是基于SpringBoot构建的服务治理框架...

    SpringCloud黑马商城后端代码

    本篇文章将深入探讨“SpringCloud黑马商城后端代码”,解析其中的关键技术和实现细节。 首先,Spring Cloud是基于Spring Boot的一套微服务解决方案,它提供了服务注册与发现、配置中心、API网关、负载均衡、熔断器...

    基于springcloud的分布式网上商城系统源码.zip

    《基于SpringCloud的分布式网上商城系统源码解析》 在当今互联网时代,电子商务系统的复杂性和规模日益增大,传统的单体架构难以应对高并发、高可用的业务需求。为了解决这些问题,开发人员开始转向分布式系统架构...

    springcloud学习源码-yuanma.zip

    本篇将深入探讨Spring Cloud的核心组件和原理,结合"springcloud学习源码-yuanma.zip"中的源码,为你带来一次全面的学习体验。 首先,我们来了解Spring Cloud的基础知识。Spring Cloud是基于Spring Boot的微服务...

    2020最新版SpringCloud(H版&alibaba)框架开发教程全套完整版从入门到精通(41-80讲).rar

    - Ribbon是SpringCloud中的客户端负载均衡器,用于在微服务架构中选择一个合适的服务器进行请求。教程中提到的`RoundRobinRule`是Ribbon的一种默认策略,即轮询策略。通过`P41_41_RoundRobinRule源码分析`,可以...

    <>源代码

    《SpringCloud微服务实战》这本书籍的源代码包含了大量的实践示例和配置,旨在帮助读者深入理解并掌握Spring Cloud在实际开发中的应用。Spring Cloud是一个基于Spring Boot实现的服务发现、配置管理和API网关等...

    springcloud的所有技能都在这里面了

    总的来说,这份"Spring Cloud.pdf"学习资料涵盖了Spring Cloud的基础知识、核心组件的使用、源码解析以及实战演示,对于想要深入学习和掌握Spring Cloud的开发者来说是一份宝贵的资源。通过系统学习并实践其中的示例...

    springCloud

    断路器示意图 SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图: hystrix 1 一个微服务的超时...

    疯狂springCloud实战架构

    《疯狂springCloud实战架构》是针对企业级分布式应用开发的一款强大框架——Spring Cloud的深度解析与实战指南。Spring Cloud作为微服务生态中的重要组件,它为开发者提供了在分布式系统(如配置管理、服务发现、...

    spring cloud实战项目

    1. 配置中心:可能使用了Spring Cloud Config来集中管理所有服务的配置,这样可以方便地在不同环境中切换配置。 2. 服务注册与发现:可能使用Eureka或Consul等服务注册与发现组件,确保服务之间的通信。 3. 安全配置...

    从零开始搭建SpringCloud第七节源码

    源码解析可以帮助我们理解Zuul如何处理请求,以及过滤器链的执行流程。 3. **断路器** - Hystrix是Netflix开源的断路器库,用于防止服务雪崩。当服务调用失败或响应时间过长时,断路器会打开,避免后续请求继续失败...

Global site tag (gtag.js) - Google Analytics