搬砖小抄

Spring Cloud Config 配置属性覆盖优先级

字数统计: 385阅读时长: 1 min
2018/04/09 Share

在使用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
    6
    spring:
    cloud:
    config:
    allowOverride: true
    overrideNone: true
    overrideSystemProperties: false
  • 客户端什么都不能覆盖
    1
    2
    3
    4
    5
    6
    spring:
    cloud:
    config:
    allowOverride: false
    #overrideNone: 无关紧要
    #overrideSystemProperties: 无关紧要
  • 覆盖掉客户端的SystemProperties,其他的客户端说了算
    1
    2
    3
    4
    5
    6
    spring:
    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);
    }
    }

参考资料

CATALOG
  1. 1. 1. 总结
  2. 2. 2. 关键逻辑代码
  3. 3. 参考资料