quarkus實戰之六:配置

歡迎訪問我的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,咱們就用它來驗證各種配置方式是否生效

配置方式一覽

  • 官方給出一張圖,說明了所有配置方式以及它們的優先級

    config sources

  • 接下來挨個試試這些配置方式

方式一:System properties

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

image-20220305231052913

方式二:Environment variables

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

  • 打開控制檯,執行以下命令,即可在當前會話中設置環境變量:

export GREETING_MESSAGE="from Environment variables"
  • 在同一個控制檯執行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar啓動應用,瀏覽器訪問接口,如下圖,可見環境變量已生效:

image-20220306085525814

方式三:.env file

  • 爲了避免之前的操作帶來的影響,請重新打開一個控制檯
  • 在pom.xml文件所在目錄新建文件.env,內容如下:
GREETING_MESSAGE=from .env file
  • 執行java -jar hello-quarkus-1.0-SNAPSHOT-runner.jar啓動應用,瀏覽器訪問接口,如下圖,可見環境變量已生效:

image-20220306090306171

  • 這種配置方式有個問題要注意:.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啓動應用,瀏覽器訪問接口,如下圖,可見環境變量已生效:

image-20220306094258427

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

  • 爲了避免之前的操作帶來的影響,請刪除剛纔創建的config文件夾(裏面的文件也刪除)
  • src/main/resources目錄下的application.properties,這個配置相信您應該很熟悉,SpringBoot也是這樣配置的:

image-20220306094630564

  • 運行應用試試,配置生效了

image-20220306094943167

方式六:MicroProfile Config configuration file

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

image-20220306100652974

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

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

    image-20220306102242975

  • 運行應用試試,配置生效了

image-20220306102406598

  • 注意: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
  • 至此,輸入配置的常規操作已經講完了,接下來的文章與本篇是配套的,會詳細說明如何在代碼中使用這些配置

歡迎關注博客園:程序員欣宸

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章