TL;DR
如何让CLI上的系统属性或环境变量覆盖Azure应用程序配置商店提供的属性?或者这可能根本不可能?
更长的故事
让我们假设一个名为app.prop
的属性。让我们进一步假设application.yml
或application-<profile>.yml
中的以下条目:
app:
prop: Default
通常,您可以启动Spring Boot应用程序,并提供系统属性(例如-Dapp.prop=SYS
(或环境变量(例如export APP_PROP=ENV
(,后者会覆盖YML配置文件的值。例如,如果您提供了环境变量,那么应用程序的属性app.prop
的值为ENV
。
从Azure应用程序配置商店读取相同属性时,可以根据需要提供系统属性或环境变量。但该值不再被覆盖;它是存储在Azure应用程序配置商店中的值。
某些代码
我使用的是SpringBoot2.5.7:版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.7</version>
</parent>
此外,我正在使用以下库访问Azure应用程序配置商店:
<properties>
<azure-spring-cloud.version>2.7.0</azure-spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-cloud-dependencies</artifactId>
<version>${azure-spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>azure-spring-cloud-appconfiguration-config</artifactId>
</dependency>
</dependencies>
此外,为了启动应用程序,我提供了以下属性:
spring.cloud.azure.appconfiguration.stores[0].connection-string = ...
这一切都很有效。在Azure应用程序配置商店中,我有以下属性:
app.prop = Azure
如果现在使用以下环境变量APP_PROP = ENV
启动应用程序,则属性app.prop
的值仍然是Azure
,而不是ENV
。
是否缺少任何设置,以便我可以具有与没有上述库时相同的行为?
事实上,我搜索了很多,但除了Spring Cloud文档中关于覆盖远程属性值的一些语句外,没有找到任何内容,而我的情况并非如此(我使用的是Azure应用程序配置商店(。
使用Azure应用程序配置的全部目的是将您的配置存储在一个地方,并在不重新部署/重新启动应用程序的情况下轻松管理它。因此,我认为这根本不可能。
我建议使用标签根据标签数据加载特定版本的prop
。少数情况:
- 如果您只在本地需要此属性,请不要在应用程序配置中指定它
- 如果您需要它的多个版本,那么只需创建具有多个标签的同一属性,并使用
spring.profile
(或其他conf属性(来区分版本 - 如果您需要加载它的多个版本,请加载多个标签:
如下所述:https://learn.microsoft.com/en-us/java/api/overview/azure/spring-cloud-starter-appconfiguration-config-readme?view=azure-java稳定#从多个标签加载
您可以使用此示例查看其工作原理:https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-boot_3.6.0/sdk/appconfiguration/spring-cloud-starter-azure-appconfiguration-config