`
357029540
  • 浏览: 725863 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics