这是第一次写源码的解析,主要是给自己留一个印象,有很多不充足的地方以后自己慢慢补充。这个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相关的实现代码的相关实现。