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配置中心加载不同微服务的通用配置的两种方式