quarkus實戰之六:設定

2023-07-26 09:00:50

歡迎存取我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 本文是《quarkus實戰》系列的第六篇,咱們來掌握一個常用知識點:設定
  • 如同SpringBoot中的application.properties檔案,對一個quarkus應用來說,設定是其重要的組成部分,web埠、資料庫這些重要資訊都放在設定中,咱們在編碼時也會將一些業務引數做成設定,而不是寫死(hard code)
  • 與設定有關的知識點不少,本文重點是如何設定,下一篇會詳細說明如何使用設定
  • 本篇要學習和掌握的內容:先實踐六種具體的設定方式,例如通過在系統變數、application.properties中去設定設定項,它們都是不同的設定方式,然後,再一起去了解組態檔中可以輸入什麼樣的內容,除了常見的key&value,還有哪些型別可以用來設定
  • 將本篇的內容整理如下所示:
graph LR B(quarkus設定) --> C1(設定方式) B(quarkus設定) --> C2(設定內容) C1 --> D1(System properties) C1 --> D2(Environment variables) C1 --> D3(.env file) C1 --> D4(config目錄下的application.properties) C1 --> D5(src/main/resources目錄下的application.properties) C1 --> D6(MicroProfile Config configuration file) C2 --> D7(常規) C2 --> D8(參照其他設定) C2 --> D9(UUID) C2 --> D10(陣列)

演示程式碼

  • 建立一個demo工程,參考下面的命令,這樣的工程會自帶一個web服務類HobbyResource.java:
mvn "io.quarkus:quarkus-maven-plugin:create" \
  -DprojectGroupId="com.bolingcavalry" \
  -DprojectArtifactId="hello-quarkus" \
  -DprojectVersion="1.0-SNAPSHOT" \
  -DclassName="HobbyResource" \
  -Dpath="actions"
  • 用下面這段程式碼來演示設定是否生效,可見用了一個設定項greeting.message,所以我們需要設定它的值才行
package com.bolingcavalry;

import org.eclipse.microprofile.config.inject.ConfigProperty;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.time.LocalDateTime;

@Path("/actions")
public class HobbyResource {

    @ConfigProperty(name = "greeting.message")
    String message;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello RESTEasy, " + LocalDateTime.now() + " [" + message + "]";
    }
}
  • 寫好演示程式碼後,執行以下命令,將專案構建成單一jar檔案,用於稍後的驗證操作
mvn clean package -U -DskipTests -Dquarkus.package.type=uber-jar
  • 構建成功後,在target目錄下生成檔案hello-quarkus-1.0-SNAPSHOT-runner.jar,咱們就用它來驗證各種設定方式是否生效

設定方式一覽

  • 官方給出一張圖,說明了所有設定方式以及它們的優先順序

  • 接下來挨個試試這些設定方式

方式一:System properties

  • 最常見的是啟動應用時候通過-D引數指定環境變數,例如下面的命令
java -Dgreeting.message="from system properties" -jar hello-quarkus-1.0-SNAPSHOT-runner.jar
  • 如下圖,可以成功獲取屬性值

方式二:Environment variables

  • 在設定環境變數時,要注意轉換規則:全大寫、點號變下劃線,因此greeting.message在環境變數中應該寫成GREETING_MESSAGE

  • 開啟控制檯,執行以下命令,即可在當前對談中設定環境變數:

export GREETING_MESSAGE="from Environment variables"
  • 在同一個控制檯執行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar啟動應用,瀏覽器存取介面,如下圖,可見環境變數已生效:

方式三:.env file

  • 為了避免之前的操作帶來的影響,請重新開啟一個控制檯
  • 在pom.xml檔案所在目錄新建檔案.env,內容如下:
GREETING_MESSAGE=from .env file
  • 執行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar啟動應用,瀏覽器存取介面,如下圖,可見環境變數已生效:

  • 這種設定方式有個問題要注意:.env中的設定,在程式碼中使用System.getenv(String)無法取得
  • 官方建議不要將.env檔案提交到git、svn等版本控制工具中

方式四:config目錄下的application.properties

  • 為了避免之前的操作帶來的影響,請刪除剛才建立的.env檔案

  • hello-quarkus-1.0-SNAPSHOT-runner.jar檔案所在目錄,新建資料夾config

  • config資料夾下新建檔案application.properties,內容如下:

    greeting.message=from config/application.properties
    
  • 執行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar啟動應用,瀏覽器存取介面,如下圖,可見環境變數已生效:

方式五:src/main/resources目錄下的application.properties

  • 為了避免之前的操作帶來的影響,請刪除剛才建立的config資料夾(裡面的檔案也刪除)
  • src/main/resources目錄下的application.properties,這個設定相信您應該很熟悉,SpringBoot也是這樣設定的:

  • 執行應用試試,設定生效了

方式六:MicroProfile Config configuration file

  • 為了避免之前的操作帶來的影響,請將src/main/resources/application.properties檔案中的greeting.message設定項刪除
  • MicroProfile是一個 Java 微服務開發的基礎程式設計模型,它致力於定義企業 Java 微服務規範,其中的設定規範有如下描述:

  • 上圖紅框指出了MicroProfile規定的組態檔位置,咱們來試試在此位置放置組態檔是否能生效

  • 如下圖紅框,在工程的src/main/resources/META-INF目錄下新建檔案microprofile-config.properties,內容如黃框所示

  • 執行應用試試,設定生效了

  • 注意:microprofile-config.properties檔案所在目錄是src/main/resources/META-INF,不是src/main/resources/META-INF/resources

  • 至此,六種設定方式及其範例驗證都完成了,您可以按照自己的實際情況靈活選擇

設定內容:常規

  • 現在我們知道了通過何種途徑將設定資訊傳給應用,接下來要看的是設定資訊本身:我們可以在組態檔中輸入哪些內容呢?
  • 最常用的當然是字串型別的鍵值對了,如下所示,剛才一直在用的,就不贅述了:
greeting.message=from config/application.properties

設定內容:參照其他設定

  • 設定項的值可以參照其他設定項,如下所示,greeting.message的值由兩部分拼接而成:固定的hello, 、以及設定項greeting.name的值,表示式的格式是${設定項名稱:設定項找不到時的預設值}:xxxxxx的意思是如果找不到設定項greeting.name,就用字串xxxxxx代替
greeting.name=Will
greeting.message=hello, ${greeting.name:xxxxxx}
  • 執行程式碼,瀏覽器收到響應如下,符合預期,greeting.message的值可以參照greeting.name設定項的值:
  • 現在去掉設定項greeting.message,看看預設值xxxxxx能否生效,如下圖,在找不到設定項greeting.message的時候,咱們設定的預設值已經生效了

設定內容:UUID

  • 當同一個應用同時在多個機器上執行時,如何讓每個程序有個獨立的身份?
  • quarkus提供了一個生成UUID的方式,可以低成本解決上述問題,如下所示,應用啟動時,${quarkus.uuid}會生成一個UUID,此時的greeting.message的值也是唯一的
greeting.message=hello, ${quarkus.uuid}
  • 執行應用試試,如下圖,UUID成功生成了
  • 多刷幾次瀏覽器,UUID始終不變,看來此UUID在整個程序存活期間都不會改變
  • 重啟應用,再用瀏覽器存取,如下圖,UUID已更新,看來程序身份的唯一性可以通過此設定來保證

設定內容:集合

  • 集合型別的設定也是常見需求,下面是常規的集合設定
my.collection=dog,cat,turtle
  • 對應的程式碼如下,可見只要被ConfigProperty修飾的成員變數是集合型別就行
@Path("/actions")
public class HobbyResource {

    @ConfigProperty(name = "my.collection")
    List<String> message;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello RESTEasy, " + LocalDateTime.now() + ", " + message + "";
    }
}
  • 瀏覽器存取此介面,響應如下,符合預期
  • 還可以將集合中的每個元素分開寫,如下所示,程式碼不變,效果和前面的設定一樣
my.collection[0]=dog
my.collection[1]=cat,turtle
my.collection[2]=turtle
  • 至此,輸入設定的常規操作已經講完了,接下來的文章與本篇是配套的,會詳細說明如何在程式碼中使用這些設定

歡迎關注部落格園:程式設計師欣宸

學習路上,你不孤單,欣宸原創一路相伴...