spring cloud config配置中心源码分析之注解@EnableConfigServer

Posted 一天不进步,就是退步!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring cloud config配置中心源码分析之注解@EnableConfigServer相关的知识,希望对你有一定的参考价值。

spring cloud config的主函数是ConfigServerApplication,其定义如下:

@Configuration
@EnableAutoConfiguration
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ConfigServerApplication.class)
                .properties("spring.config.name=configserver").run(args);
    }

}

其中

@Configuration是spring定义的注解,使用注解,配置信息的载体由 XML 文件转移到了 Java 类中。

@EnableAutoConfiguration是spring boot定义的注解,控制spring applicationContext的自动配置的开关。

@EnableConfigServer是spring cloud定义的注解,

@EnableConfigServer定义如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ ResourceRepositoryConfiguration.class, EnvironmentRepositoryConfiguration.class, 
        ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class })
public @interface EnableConfigServer {

}

1. ResourceRepositoryConfiguration

定义如下:

@Configuration
@EnableConfigurationProperties(ConfigServerProperties.class)
@ConditionalOnMissingBean(ResourceRepository.class)
public class ResourceRepositoryConfiguration {

    @Bean
    @ConditionalOnBean(SearchPathLocator.class)
    public ResourceRepository resourceRepository(SearchPathLocator service) {
        return new GenericResourceRepository(service);
    }
}

 返回ResourceRepository,其实现类为:GenericResourceRepository,内部服务为SearchPathLocator。实现方法为:

    @Override
    public synchronized Resource findOne(String application, String profile, String label,
            String path) {
        String[] locations = this.service.getLocations(application, profile, label).getLocations();
        try {
            for (int i = locations.length; i-- > 0;) {
                String location = locations[i];
                for (String local : getProfilePaths(profile, path)) {
                    Resource file = this.resourceLoader.getResource(location)
                            .createRelative(local);
                    if (file.exists() && file.isReadable()) {
                        return file;
                    }
                }
            }
        }
        catch (IOException e) {
            throw new NoSuchResourceException(
                    "Error : " + path + ". (" + e.getMessage() + ")");
        }
        throw new NoSuchResourceException("Not found: " + path);
    }

SearchPathLocator定义了搜索资源路径的策略,其层次结构如下:

2.EnvironmentRepositoryConfiguration

内部定了四种环境的配置

2.1. NativeEnvironmentRepository

@Configuration
    @Profile("native")
    protected static class NativeRepositoryConfiguration {

        @Autowired
        private ConfigurableEnvironment environment;

        @Bean
        public NativeEnvironmentRepository environmentRepository() {
            return new NativeEnvironmentRepository(this.environment);
        }

    }

2.2. MultipleJGitEnvironmentRepository

@Configuration
    @ConditionalOnMissingBean(EnvironmentRepository.class)
    protected static class GitRepositoryConfiguration {

        @Autowired
        private ConfigurableEnvironment environment;

        @Autowired
        private ConfigServerProperties server;

        @Bean
        public MultipleJGitEnvironmentRepository environmentRepository() {
            MultipleJGitEnvironmentRepository repository = new MultipleJGitEnvironmentRepository(this.environment);
            if (this.server.getDefaultLabel()!=null) {
                repository.setDefaultLabel(this.server.getDefaultLabel());
            }
            return repository;
        }
    }

2.3.SvnKitEnvironmentRepository

    @Configuration
    @Profile("subversion")
    protected static class SvnRepositoryConfiguration {
        @Autowired
        private ConfigurableEnvironment environment;

        @Autowired
        private ConfigServerProperties server;

        @Bean
        public SvnKitEnvironmentRepository environmentRepository() {
            SvnKitEnvironmentRepository repository = new SvnKitEnvironmentRepository(this.environment);
            if (this.server.getDefaultLabel()!=null) {
                repository.setDefaultLabel(this.server.getDefaultLabel());
            }
            return repository;
        }
    }

2.4.VaultEnvironmentRepository

@Configuration
    @Profile("vault")
    protected static class VaultConfiguration {
        @Bean
        public EnvironmentRepository environmentRepository(HttpServletRequest request, EnvironmentWatch watch) {
            return new VaultEnvironmentRepository(request, watch, new RestTemplate());
        }
    }

另外还有,ConfigServerHealthIndicator、ConsulEnvironmentWatch、EnvironmentWatch

3.ConfigServerEncryptionConfiguration

定义了EncryptionController

    @Bean
    public EncryptionController encryptionController() {
        EncryptionController controller = new EncryptionController(this.encryptor);
        controller.setDefaultApplicationName(this.properties.getDefaultApplicationName());
        controller.setDefaultProfile(this.properties.getDefaultProfile());
        return controller;
    }

4.ConfigServerMvcConfiguration

定义了EnvironmentController和ResourceController

    @Bean
    public EnvironmentController environmentController() {
        EnvironmentController controller = new EnvironmentController(encrypted(), this.objectMapper);
        controller.setStripDocumentFromYaml(this.server.isStripDocumentFromYaml());
        return controller;
    }

    @Bean
    @ConditionalOnBean(ResourceRepository.class)
    public ResourceController resourceController(ResourceRepository repository) {
        ResourceController controller = new ResourceController(repository,
                encrypted());
        return controller;
    }

支持的协议有三种:

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("properties", MediaType.valueOf("text/plain"));
        configurer.mediaType("yml", MediaType.valueOf("text/yaml"));
        configurer.mediaType("yaml", MediaType.valueOf("text/yaml"));
    }

 

以上是关于spring cloud config配置中心源码分析之注解@EnableConfigServer的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式

Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式

创建配置中心服务端(Spring Cloud Config)

spring cloud config 配置管理中心

Spring Cloud 系列之 Config 配置中心

Spring Cloud 系列之 Config 配置中心