从Azure应用程序配置商店覆盖属性



TL;DR

如何让CLI上的系统属性或环境变量覆盖Azure应用程序配置商店提供的属性?或者这可能根本不可能?

更长的故事

让我们假设一个名为app.prop的属性。让我们进一步假设application.ymlapplication-<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。少数情况:

  1. 如果您只在本地需要此属性,请不要在应用程序配置中指定它
  2. 如果您需要它的多个版本,那么只需创建具有多个标签的同一属性,并使用spring.profile(或其他conf属性(来区分版本
  3. 如果您需要加载它的多个版本,请加载多个标签:
    如下所述: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

最新更新