假设我有应用程序A有3个属性文件:
-> applicationA
- datasource.properties
- security.properties
- jms.properties
如何将所有属性移动到Spring云服务器并将它们分开?
截至今天,我已经配置了只读取一个属性文件的配置服务器,因为这似乎是标准的方式。配置服务器选择的这个文件似乎是通过使用spring.application.name来解决的。在我的情况下,它只会读取一个具有此名称的文件:
-> application A.properties
如何添加配置服务器要解析的其他文件?
你的要求不可能。 Spring Cloud Config Server使用NativeEnvironmentRepository,它是:
{@link EnvironmentRepository}的简单实现,它使用通过普通协议定位的SpringApplication和配置文件。生成的环境由使用应用程序名称作为配置文件stem(spring.config.name)定位的属性源和作为Spring配置文件的环境名称组成。
所以基本上每次客户端从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
这可以做到。您需要创建自己的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作为您自己实现的基础。
正如@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所描述的那样