这是第一次写源码的解析,主要是给自己留一个印象,有很多不充足的地方以后自己慢慢补充。这个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 config/bus源码解读,,包含server端,client端,bus的运行原理
1.Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为服务端和客户端。 2.服务端为分布式配置中心,是一个独立的微服务应用;客户端为分布式系统中的基础设置或微服务...
课程的源码是尚硅谷的springcloud教程源码,SpringCloud各种核心组件,到最终的微服务架构总结,帮助大家快速入门、上手并精通微服务框架SpringCloud。 课程中对比了 Dubbo 和 SpringCloud,并深入讲授SpringCloud...
spring cloud config&bus;整合例子包能运行,包含rabbitmq
Spring Cloud Config(本地配置中心或git配置中心)搭建源码
一个关于Spring Cloud Config的简单Demo,解压后用idea打开即可
基于SpringCloud的快递驿站系统源码 基于SpringCloud的快递驿站系统源码 基于SpringCloud的快递驿站系统源码 基于SpringCloud的快递驿站系统源码 基于SpringCloud的快递驿站系统源码 基于SpringCloud的...
SpringCloud——分布式配置中心(Spring Cloud Config)之高可用的分布式配置中心
springcloud Eureka源码解读.docx
spring cloud config 代码示例,详细见http://www.cnblogs.com/shamo89/p/8016908.html
《深入理解Spring Cloud与微服务构建》学习笔记(二十)~配置中心Spring Cloud Config
基于Spring Cloud微服务化电商平台,每个模块单独封装,如有某个模块不能满足业务,可以单独进行改造,无需关心其他模块功能, 各个模块之间通过Fegin调用,多业务系统并行开发,可以用来学习了解Spring Cloud各个...
spring-cloud config超级详细demo,包括集群搭建,eureka于config的结合使用
一个完整结构 spring cloud 分布式项目 基于spring boot
基于spring cloud 和vue全家桶的开源电商源码基于spring cloud 和vue全家桶的开源电商源码基于spring cloud 和vue全家桶的开源电商源码基于spring cloud 和vue全家桶的开源电商源码基于spring cloud 和vue全家桶的...
Spring Cloud(九)高可用的分布式配置中心 Spring Cloud Config 集成 Eureka 服务 spring-cloud-config-eureka-refresh Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh ...
springcloud config配置中心
Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新 spring cloud bus能管理和传播分布式系统间的消息,就像分布式执行器,可用于广播状态更改、时间推送等,也可以当做微服务间的通信通道 spring ...
springcloud Eureka源码解读 方便新手接触认识spring cloud微服务