歡迎訪問我的GitHub
這裏分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos
本篇概覽
- 本文是《quarkus實戰》系列的第六篇,咱們來掌握一個常用知識點:配置
- 如同SpringBoot中的application.properties文件,對一個quarkus應用來說,配置是其重要的組成部分,web端口、數據庫這些重要信息都放在配置中,咱們在編碼時也會將一些業務參數做成配置,而不是硬編碼(hard code)
- 與配置有關的知識點不少,本文重點是如何設置,下一篇會詳細說明如何使用配置
- 本篇要學習和掌握的內容:先實踐六種具體的配置方式,例如通過在系統變量、application.properties中去設置配置項,它們都是不同的配置方式,然後,再一起去了解配置文件中可以輸入什麼樣的內容,除了常見的key&value,還有哪些類型可以用來配置
- 將本篇的內容整理如下所示:
演示代碼
- 創建一個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
- 至此,輸入配置的常規操作已經講完了,接下來的文章與本篇是配套的,會詳細說明如何在代碼中使用這些配置