这是第一次写源码的解析,主要是给自己留一个印象,有很多不充足的地方以后自己慢慢补充。这个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相关的实现代码的相关实现。
相关推荐
《Spring Cloud项目源码深度解析》 在当前的微服务架构领域,Spring Cloud以其强大的功能和易用性,成为开发者构建分布式系统的重要选择。本文将深入探讨基于Spring Cloud的项目源码,帮助读者理解其核心原理,提升...
### 一、SpringCloud简介与核心组件 #### 1.1 SpringCloud概述 SpringCloud是一套基于Spring Boot实现的微服务云应用开发工具集,它提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线...
《Spring Cloud配置源码解析与实战》 Spring Cloud作为微服务架构的重要组件,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话...
总的来说,《Spring Cloud实战源码》涵盖了Spring Cloud的核心组件,从入门到进阶,再到源码解析,帮助开发者全面掌握这一强大的微服务框架。通过学习,你可以构建出稳定、高效、可扩展的分布式系统。
1. **SpringCloud源码解析**: SpringCloud的源码分析有助于开发者了解其实现机制,从而更好地定制和优化自己的服务。源码中包含了Eureka服务发现、Zuul边缘服务、Hystrix断路器、 Ribbon客户端负载均衡、Feign声明...
总的来说,通过尚硅谷的SpringCloud源码解析和思维导图,开发者不仅可以深入了解SpringCloud的运作原理,还能提升对微服务架构设计的理解,为实际项目开发提供有力的支持。同时,对源码的学习也有助于培养解决问题和...
《SpringCloud源码解析——构建微服务架构的关键组件》 SpringCloud作为当今最热门的微服务框架之一,深受广大开发者喜爱。它集成了众多优秀的开源项目,为开发人员提供了便捷的微服务开发工具。本篇将围绕Spring...
《SpringCloud Config 源码解析与应用实践》 SpringCloud Config 是一个强大的微服务配置中心,它允许我们在运行时管理应用的配置,并且能够实时地推送到客户端。本篇文章将深入探讨 SpringCloud Config 的核心原理...
《基于SpringCloud的电商平台源码解析》 在现代互联网应用开发中,微服务架构已经成为主流。Spring Cloud作为一套完整的微服务解决方案,为开发者提供了构建分布式系统所需的工具集合,包括服务发现、配置中心、...
本资源为新手提供了一个完整的SpringCloud入门项目,包括源码、SQL脚本和详细的开发文档,非常适合想要快速了解和学习SpringCloud的新手。 1. **SpringCloud简介** SpringCloud是基于SpringBoot构建的服务治理框架...
《基于SpringCloud的分布式网上商城系统源码解析》 在当今互联网时代,电子商务系统的复杂性和规模日益增大,传统的单体架构难以应对高并发、高可用的业务需求。为了解决这些问题,开发人员开始转向分布式系统架构...
本篇文章将深入探讨“SpringCloud黑马商城后端代码”,解析其中的关键技术和实现细节。 首先,Spring Cloud是基于Spring Boot的一套微服务解决方案,它提供了服务注册与发现、配置中心、API网关、负载均衡、熔断器...
本篇将深入探讨Spring Cloud的核心组件和原理,结合"springcloud学习源码-yuanma.zip"中的源码,为你带来一次全面的学习体验。 首先,我们来了解Spring Cloud的基础知识。Spring Cloud是基于Spring Boot的微服务...
- Ribbon是SpringCloud中的客户端负载均衡器,用于在微服务架构中选择一个合适的服务器进行请求。教程中提到的`RoundRobinRule`是Ribbon的一种默认策略,即轮询策略。通过`P41_41_RoundRobinRule源码分析`,可以...
《SpringCloud微服务实战》这本书籍的源代码包含了大量的实践示例和配置,旨在帮助读者深入理解并掌握Spring Cloud在实际开发中的应用。Spring Cloud是一个基于Spring Boot实现的服务发现、配置管理和API网关等...
总的来说,这份"Spring Cloud.pdf"学习资料涵盖了Spring Cloud的基础知识、核心组件的使用、源码解析以及实战演示,对于想要深入学习和掌握Spring Cloud的开发者来说是一份宝贵的资源。通过系统学习并实践其中的示例...
断路器示意图 SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图: hystrix 1 一个微服务的超时...
《疯狂springCloud实战架构》是针对企业级分布式应用开发的一款强大框架——Spring Cloud的深度解析与实战指南。Spring Cloud作为微服务生态中的重要组件,它为开发者提供了在分布式系统(如配置管理、服务发现、...
1. 配置中心:可能使用了Spring Cloud Config来集中管理所有服务的配置,这样可以方便地在不同环境中切换配置。 2. 服务注册与发现:可能使用Eureka或Consul等服务注册与发现组件,确保服务之间的通信。 3. 安全配置...
源码解析可以帮助我们理解Zuul如何处理请求,以及过滤器链的执行流程。 3. **断路器** - Hystrix是Netflix开源的断路器库,用于防止服务雪崩。当服务调用失败或响应时间过长时,断路器会打开,避免后续请求继续失败...