iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

Quarkus, Kotlin, Reactive 雲原生服務開發系列 第 19

Quarkus 的設定檔, Kube-native 的讀取順序 - application.properties & ENV

  • 分享至 

  • xImage
  •  

寫程式很 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

我們時常需要讓應用在不同環境時有不同的設定,Profiles 可以讓應用同一份檔案設定不同組的設定。Quarkus預設有以下這三種 profiles

  • dev - 開發時使用,例如 quarkus:dev
  • test - 跑測試的時候用
  • prod - 預設的 profile, 當不是跑測試或是dev時

在屬性名加上 profile

在屬性的前面用 用 %{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}/

屬性的Type

除了 String 外, Int 也可以當作屬性的接收類別,還有 Double 等,其中有一個特別的是 InetAddress 這種 ip 格式也是支援。

@ConfigProperty(name = "server.address", defaultValue = "192.168.1.1")
lateinit var serverAddress: InetAddress;

參考資料


上一篇
又快又小的 Quarkus 的背後魔法 ? 與 Spring Boot 的同與異
下一篇
Kubernetes 關心 Quarkus 的健康, 提供探針給他吧
系列文
Quarkus, Kotlin, Reactive 雲原生服務開發32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言