寫程式很 hardcore,但應該避免 hard code (單押)。 依據 12 Factor App - III. Config, 設定是該管理的一環,所以 Quarkus 提供了簡便的設定管理. 並且讀取時會依據雲原生的順序,環境變數優先,方便在 pod 的 config 設定。
Quarkus 預設會從不同的來源來讀取設定檔,大多在開發時會先設定在 src/main/resources/application.properties
。例如編輯檔案設定以下內容
application.properties
greeting.message = hello
greeting.name = quarkus
@ConfigProperty(name = "greeting.message")
lateinit var message: String
@ConfigProperty(name = "greeting.name", defaultValue = "arrow")
lateinit var name: String
@GET
@Path("/hello")
@Produces(MediaType.TEXT_PLAIN)
suspend fun hello() = "$message from RESTEasy Reactive $name"
利用 org.eclipse.microprofile.config.ConfigProvider.getConfig() API 在無法注入的地方可以用程式碼來讀取設定。
val databaseName =ConfigProvider.getConfig().getValue("quarkus.mongodb.database", String::class.java)
Quarkus 會依下列的順序讀取 config properties。所以環境變數 (ENV) 會蓋掉 application 的設定
(權重)類別 | 說明 | 範例 |
---|---|---|
(400) 系統屬性 | System properties 可以在啟動時用 -D 設定 | java -Dapp.key=cat -jar quarkus-run.jar |
(300) 環境變數 | 系統的環境變數,這裡會用全大寫,. -> _ |
export APP_KEY=cat ; |
(295).env | 工作目錄的.env 檔案的內容,通常會在開發時把不適合 checkin 的變數放此 | .env file APP_KEY=cat |
(260) application.properties | src/main/resources/application.properties 或是 src/test/resources/application.properties |
application.properties file app.key=cat |
我們時常需要讓應用在不同環境時有不同的設定,Profiles 可以讓應用同一份檔案設定不同組的設定。Quarkus預設有以下這三種 profiles
在屬性的前面用 用 %{PROFILE}.,表示要在同一個屬性名用不同的 profile
application.properties
quarkus.http.port=9090
%dev.quarkus.http.port=8181
在環境變數或是.env 是用 _{PROFILE}_CONFIG_KEY=value:
.env
QUARKUS_HTTP_PORT=9090
_DEV_QUARKUS_HTTP_PORT=8181
可以 ${...}
來參考到其他屬性, 跟 Kotlin string template 很像
application.properties
remote.host=quarkus.io
callable.url=https://${remote.host}/
除了 String 外, Int 也可以當作屬性的接收類別,還有 Double 等,其中有一個特別的是 InetAddress 這種 ip 格式也是支援。
@ConfigProperty(name = "server.address", defaultValue = "192.168.1.1")
lateinit var serverAddress: InetAddress;