Spring Cloud Server为同一个应用程序提供多个属性文件

问题描述 投票:0回答:3

假设我有应用程序A有3个属性文件:

-> applicationA
          - datasource.properties
          - security.properties
          - jms.properties

如何将所有属性移动到Spring云服务器并将它们分开?

截至今天,我已经配置了只读取一个属性文件的配置服务器,因为这似乎是标准的方式。配置服务器选择的这个文件似乎是通过使用spring.application.name来解决的。在我的情况下,它只会读取一个具有此名称的文件:

-> application A.properties

如何添加配置服务器要解析的其他文件?

spring-cloud-config
3个回答
0
投票

你的要求不可能。 Spring Cloud Config Server使用NativeEnvironmentRepository,它是:

{@link EnvironmentRepository}的简单实现,它使用通过普通协议定位的SpringApplication和配置文件。生成的环境由使用应用程序名称作为配置文件stem(spring.config.name)定位的属性源和作为Spring配置文件的环境名称组成。

见:https://github.com/spring-cloud/spring-cloud-config/blob/master/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java

所以基本上每次客户端从Config Server请求属性时,它都会使用SpringApplicationBuilder创建ConfigurableApplicationContext。它是使用下一个配置属性启动的:

String config = application;
if (!config.startsWith("application")) {
    config = "application," + config;
}
list.add("--spring.config.name=" + config);

所以属性文件的可能名称将只是application.properties(or .yml)和请求配置的配置客户端应用程序名称 - 在您的情况下applicationA.properties

但你可以“欺骗”。在配置服务器配置中,您可以添加此类属性

spring:
  cloud:
    config:
      server:
        git:
          search-paths: '{application}, {application}/your-subdirectory'

在这种情况下,Config Server将搜索相同的属性文件名,但在少数目录中,您可以使用子目录来保持属性分离。因此,通过上面的配置,您将能够从以下位置加载配置:

applicationA/application.properies
applicationA/your-subdirectory/application.properies

0
投票

这可以做到。您需要创建自己的EnvironmentRepository,它会加载您的属性文件。

org.springframework.cloud.config.server.support.AbstractScmAccessor #getSearchLocations搜索要加载的属性文件:

for (String prof : profiles) {
            for (String app : apps) {
                String value = location;
                if (app != null) {
                    value = value.replace("{application}", app);
                }
                if (prof != null) {
                    value = value.replace("{profile}", prof);
                }
                if (label != null) {
                    value = value.replace("{label}", label);
                }
                if (!value.endsWith("/")) {
                    value = value + "/";
                }
                output.addAll(matchingDirectories(dir, value));
            }
        }

在那里你可以添加自定义代码,读取所需的属性文件。上面的代码完全匹配spring docs中描述的行为。 NativeEnvironmentRepository不以任何方式访问GIT / SCM,因此您应该使用JGitEnvironmentRepository作为您自己实现的基础。


0
投票

正如@nmyk指出的那样,NativeEnvironmentRepository引导一个迷你应用程序,以便通过提供它来收集属性 - 有点说话 - “硬编码”{appname}。*和application。*支持的属性文件名。 (@Stefan Isele - prefabware.com JGitEnvironmentRepository最终也使用NativeEnvironmentRepository,就此而言)。

我发布了一个pull request for spring-cloud-config-server 1.4.x,它支持通过spring.cloud.config.server.searchNames环境属性定义其他文件名,就像一个springboot应用程序一样,可以在文档的Externalized Configuration.Application Property Files部分中定义,使用spring.config.name环境属性。我希望他们很快就会对它进行审核,因为似乎很多人都在堆栈溢出中询问了这个功能,当然还有很多人在搜索它并阅读目前建议的解决方案。

值得一提的是,许多人建议“滥用”配置文件功能来实现这一目标,这是一种不好的做法,在我的拙见中,正如我在this answer所描述的那样

© www.soinside.com 2019 - 2024. All rights reserved.