如何将配置中的集合转换为 Microprofile/Quarkus/Smallrye 中的环境变量

Posted

技术标签:

【中文标题】如何将配置中的集合转换为 Microprofile/Quarkus/Smallrye 中的环境变量【英文标题】:How to convert a collection in config to environment variable in Microprofile/Quarkus/Smallrye 【发布时间】:2021-10-21 23:57:29 【问题描述】:

我们在 K8 集群中运行我们的应用程序,并依赖于环境变量的配置。 Quarkus中application.properties/application.yaml参数的转换,适用如下转换规则:https://github.com/eclipse/microprofile-config/blob/master/spec/src/main/asciidoc/configsources.asciidoc#default-configsources

在这个规则中没有提到如何转换集合。

假设我有以下配置:

server.environments[0].name=dev
server.environments[0].apps[0].name=rest
server.environments[0].apps[0].services=bookstore,registration
server.environments[0].apps[0].databases=pg,h2
server.environments[0].apps[1].name=batch
server.environments[0].apps[1].services=stock,warehouse

如何将其转换为环境变量?

我尝试了以下方法:

SERVER_ENVIRONMENT_0_APPS_0_DATABASES
SERVER_ENVIRONMENT[0]_APPS[0]_DATABASES

没有机会让它工作。有谁知道如何做到这一点?无论如何都支持吗?

【问题讨论】:

【参考方案1】:

你已经很接近了,只要遵循文档中提到的规则:

    用 _ 替换每个既不是字母数字也不是 _ 的字符;然后将名称转换为大写(即 COM_ACME_SIZE)

因此,假设我们有一个名为 server.environments[0].apps[0].name 的配置属性,当您将每个非字母数字字符替换为 _ 并转换为大写时,您最终会得到:SERVER_ENVIRONMENTS_0__APPS_0__NAME。请注意0APPS 之间的双下划线,因为您将.[ 替换为_。 这肯定不会为最漂亮的 env var 名称赢得任何奖项,但它确实可以完成工作:)。

您可以在 MP 配置的 Smallrye implementation 中检查它是如何完成的 - 这是 Quarkus 使用的实现。

【讨论】:

天哪,我只是错过了这个点。非常感谢,成功了!

以上是关于如何将配置中的集合转换为 Microprofile/Quarkus/Smallrye 中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java-ee8、microProfile 4.0、Openliberty 21 和 Docker 设置特定于阶段的微配置文件配置

Quarkus & Microprofile:有没有更好的方法将 application.properties 中的属性用于@ClientHeaderParam?

使用 mp.config.profile 设置 Microprofile 活动配置文件在 Liberty 中不起作用

Microprofile Config:容错度量标签的动态 ConfigSource 值

如何将 MDX 查询中的行的集合转换为单个值?

如何将多维数组转换为Laravel中的集合