在Spring Cloud Config Server客户端中实现属性源优先级

时间:2018-10-04 23:10:31

标签: java spring-cloud-config

我需要在Java中实现客户端代码以使用Spring Cloud配置服务器。客户端既不是Spring应用程序也不是Web服务。

我们将有一个application.properties文件。我们将有一个特定于应用程序的文件。我们将为它们两个提供特定于环境的文件。我对spring config优先级规则的理解是,从最低到最高的优先级应该是:

application.properties (lowest)
specificApp.properties
application-dev.properties
specificApp-dev.properties (highest)

但是,当我用http://localhost:8888/specifcApp/dev调用服务时,属性源的返回顺序与上面的相反:

0: specificApp-dev.properties
1: application-dev.properties
2: specificApp.properties
3: application.properties

我不确定,但是我相信这样做的目的是返回的顺序指示从低到高的优先级(最后一个获胜)。如果是这样,则表明application.properties优先于其他。那与我期望的相反。

我还没有找到在一个位置完全涵盖所有内容的spring文档。周围散布着令人困惑的信息。但是在this文档中,它说:“ ...特定于配置文件的文件总是[覆盖]非特定文件,无论特定于配置文件的文件是在打包jar的内部还是外部。

实际的优先规则是什么,响应中属性源的顺序指示什么?

问题的第二部分是,如何以ANY顺序遍历configService属性源?

我在下面找到了示例代码。但是,问题在于CompositePropertySource.getPropertySources()返回一个Collection。换句话说,无法从CompositePropertySource获取有序列表。 (源在内部存储在Set中的CompositePropertySource中。)

        final CompositePropertySource compositePropertySource 
            = (CompositePropertySource)environment.getPropertySources().get("configService");

        if (compositePropertySource != null && compositePropertySource.getPropertySources() != null) {

            // compositePropertySource.getPropertySources() is not ordered!
            for (final Object mapPropertySourceObject : compositePropertySource.getPropertySources()) {
                final MapPropertySource propertySource = (MapPropertySource)mapPropertySourceObject;

                if (propertySource != null) {
                    p.putAll(propertySource.getSource());
                    LOG.info("fetched remote properties");
                }
            }
        }

总结:

  1. 优先规则应该是什么?
  2. Json原始服务器响应中属性源的顺序指示什么?
  3. 如何访问组成configService复合属性源的属性源的实际顺序?

我正在使用Spring Boot 1.5.14.RELEASE和Spring Cloud Edgware.SR4。

编辑:我现在看到CompositePropertySource propertySources集合的类型是 LinkedHashSet,因此它确实有命令。对于CompositePropertySource.getPropertyNames(),很明显,列表后面的属性源中的属性将覆盖列表前面的属性。如果是这样,则application.properties优先于特定于应用程序或配置文件的配置。我看不出这是预期的行为。实际上,这意味着任何属性都不能被覆盖。

编辑#2 :我正在使用Git存储库对此进行测试。所有这四个文件都位于存储库中的同一文件夹中。

编辑#3 :我意识到某些属性会对此产生影响。提交此文件时,我应该说过我正在使用JVM选项启动客户端:-Dspring.profiles.active = dev -Dspring.profiles.default = dev和-Dspring.cloud.config.profile = dev。我也只用-Dspring.cloud.config.profile = dev进行了尝试。

更新:我离解决方案更近了。

我尝试了以下操作:

  1. 将application.properties重命名为application-default.properties。
  2. 将specificApp.properties重命名为specificApp-default.properties。
  3. 然后我使用-Dspring.profiles.active = dev,默认运行。我没有-Dspring.profiles.default属性,也没有-Dspring.cloud.config.profile属性。

在这种情况下,它们是按以下顺序退回的:

specificApp-default.properties
application-default.properties
specificApp-dev.properties
application-dev.properties

这仍然不是我期望的。这意味着共享的应用程序属性将覆盖(即优先于)appSpecific属性。我希望可以遵循以下顺序,但是我认为解决方案越来越接近:

application-default.properties
specificApp-default.properties
application-dev.properties
specificApp-dev.properties

甚至这个命令:

application-default.properties
application-dev.properties
specificApp-default.properties
specificApp-dev.properties

0 个答案:

没有答案