在使用Spring Cloud Config
的系统中,远程服务器的配置文件可以决定客户端(Spring Cloud Config
的客户端,即读取远程配置信息的一方)是否可以覆盖配置参数的值,这可以通过在托管配置文件中几个参数来调整:
allowOverride
: 允许客户端覆盖行为,总开关overrideNone
: 不要覆盖客户端的任何参数(直接将服务端配置信息的优先级降低到最低).前提条件是allowOverride
是true.overrideSystemProperties
:覆盖客户端的JAVA属性值(java system property
,也就是java -Dxxx
传入的参数)
这几个参数位于
spring.cloud.config
1. 总结
简单的说,可以有以下三种覆盖策略:
- 允许客户覆盖任何参数
1
2
3
4
5
6spring:
cloud:
config:
allowOverride: true
overrideNone: true
overrideSystemProperties: false - 客户端什么都不能覆盖
1
2
3
4
5
6spring:
cloud:
config:
allowOverride: false
#overrideNone: 无关紧要
#overrideSystemProperties: 无关紧要 - 覆盖掉客户端的
SystemProperties
,其他的客户端说了算1
2
3
4
5
6spring:
cloud:
config:
allowOverride: true
overrideNone: false
overrideSystemProperties: true
2. 关键逻辑代码
PropertySourceBootstrapConfiguration.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37/**
* propertySources 是本地的配置信息
* composite 是服务端拉取下来的配置信息
*/
private void insertPropertySources(MutablePropertySources propertySources,
CompositePropertySource composite) {
MutablePropertySources incoming = new MutablePropertySources();
incoming.addFirst(composite);
PropertySourceBootstrapProperties remoteProperties = new PropertySourceBootstrapProperties();
new RelaxedDataBinder(remoteProperties, "spring.cloud.config")
.bind(new PropertySourcesPropertyValues(incoming));
if (!remoteProperties.isAllowOverride() || (!remoteProperties.isOverrideNone()
&& remoteProperties.isOverrideSystemProperties())) {
propertySources.addFirst(composite);
return;
}
if (remoteProperties.isOverrideNone()) {
propertySources.addLast(composite);
return;
}
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);
}
}