首页 > 网站 > 建站经验 > 正文

springcloud config配置读取优先级过程详解

2019-11-02 14:10:20
字体:
来源:转载
供稿:网友

情景描述

最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false)。虽然最后直接修改远程GIT仓库的此配置项给解决了(spring.resources.add-mappings=true),但是从中牵涉出的配置读取优先级我们必须好好的再回顾下

springcloud config读取仓库配置

通过config client模块来读取远程的仓库配置,只需要在boostrap.properties文件中配置如下属性即可

spring.application.name=eurekaspring.cloud.config.uri=http://localhost:8888spring.cloud.config.name=devspring.cloud.config.username=devspring.cloud.config.password=dev

其就会以GET方式去请求http://localhost:8888/eureka/dev地址从而将配置拉取下来。
当然上述的API地址也是需要被访问服务器部署了config server服务方可调用,具体的细节就不展开了

外部源读取优先级

我们都知道spring的配置属性管理均是存放在Enviroment对象中,就以普通项目StandardEnvironment为例,其配置的存放顺序可罗列如下

顺位 key 来源 说明
1 commandLineArgs 传入main函数的参数列表 Program arguments
2 systemProperties System.getProperties() JDK属性列表、操作系统属性、-D开头的VM属性等
3 systemEnvironment System.getEnv() 环境属性,例如JAVA_HOME/M2_HOME
4 ${file_name} 配置文件 例如application.yml
5 defaultProperties SpringApplicationBuilder#properties()

那么远程读取的配置的存放应该放在上述的哪个位置呢?

我们都知道boostrap上下文通过暴露org.springframework.cloud.bootstrap.config.PropertySourceLocator接口来方便集成第三方的外部源配置读取,比如本文提及的config client模块中的org.springframework.cloud.config.client.ConfigServicePropertySourceLocator实现类。

但最终将外部源配置读取以及插入至Environment对象中则是通过org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration类来完成的。

PropertySourceBootstrapConfiguration

此类也是ApplicationContextInitializer接口的实现类,阅读过cloud源码的都知道,此类被调用是在子类上下文初始化的时候,我们主要看下其复写的initialize()方法

 @Override public void initialize(ConfigurableApplicationContext applicationContext) {  CompositePropertySource composite = new CompositePropertySource(    BOOTSTRAP_PROPERTY_SOURCE_NAME);  // 对在boostrap上下文类型为PropertySourceLocator的bean集合进行排序  AnnotationAwareOrderComparator.sort(this.propertySourceLocators);  boolean empty = true;  ConfigurableEnvironment environment = applicationContext.getEnvironment();  for (PropertySourceLocator locator : this.propertySourceLocators) {   PropertySource<?> source = null;   // 读取外部配置源   source = locator.locate(environment);   if (source == null) {    continue;   }   logger.info("Located property source: " + source);   composite.addPropertySource(source);   empty = false;  }  if (!empty) {   MutablePropertySources propertySources = environment.getPropertySources();   String logConfig = environment.resolvePlaceholders("${logging.config:}");   LogFile logFile = LogFile.get(environment);   if (propertySources.contains(BOOTSTRAP_PROPERTY_SOURCE_NAME)) {    propertySources.remove(BOOTSTRAP_PROPERTY_SOURCE_NAME);   }   // 插入至Environment环境对象中   insertPropertySources(propertySources, composite);   reinitializeLoggingSystem(environment, logConfig, logFile);   setLogLevels(applicationContext, environment);   handleIncludedProfiles(environment);  } }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表