springcloud如果使用了配置中心的远程配置,那么很悲催的是,如果想修改某些变量,还得去修改远程配置。
这无疑是很悲剧的,我们有时候会希望在本地临时做下修改。
比如说:远程配置是团队使用的,里面配置了数据库的url,但是今天我需要临时将url改成本地,可是如果我修改了远程配置,那么我会把所有人的配置都修改了。我并不希望这样。
事实上,springcloud默认优先级最高为远端配置,远端配置会覆盖其他配置,比如启动参数,比如本地配置。
如果你需要启动参数或者本地配置覆盖远程配置,那么需要在远程配置里配置上允许重写:
spring.cloud.config.allowOverride=true
但这是不够的,尽管它开启了总开关,但是还有两个默认的小开关卡住了。
spring.cloud.config.overrideNone=false
spring.cloud.config.overrideSystemProperties=true
第一个开关是远端不覆盖本地?不,覆盖。(双重否定,真是好变量名)
第二个开关是远端是否覆盖系统配置,默认是覆盖。
你如果需要覆盖,需要按所需开启上面的小开关。
请注意,第一个小开关包括第二个.
overrideNone = true的话会开启所有包括本地配置和系统配置并忽略掉overrideSystemProperties配置.
如果你只想开启systempropeties ,那么就是overrideNone = false,overrideSystemProperties=false
这些属性关联的类是这个:PropertySourceBootstrapProperties.
它的实际判断逻辑在这里:PropertySourceBootstrapConfiguration的insertPropertySources方法:
PropertySourceBootstrapProperties remoteProperties = new PropertySourceBootstrapProperties();
Binder.get(environment(incoming)).bind("spring.cloud.config", Bindable.ofInstance(remoteProperties));
//如果isAllowOverride == false ,远程配置放到第一序列
//如果isOverrideNone == false && isOverrideSystemProperties = true,第一序列
if (!remoteProperties.isAllowOverride() || (!remoteProperties.isOverrideNone()
&& remoteProperties.isOverrideSystemProperties())) {
propertySources.addFirst(composite);
return;
}
//如果isOverrideNone = true,远端为最后序列
if (remoteProperties.isOverrideNone()) {
propertySources.addLast(composite);
return;
}
//剩余只有一种情况,既isOverrideNone == false isOverrideSystemProperties = false
if (propertySources
.contains(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)) {
if (!remoteProperties.isOverrideSystemProperties()) {
propertySources.addAfter(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
composite);
}
else {
propertySources.addBefore(
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
composite);
}
}
else {
propertySources.addLast(composite);
}