【Quarkus技術(shù)系列】「云原生架構(gòu)體系」配置參考指南相關(guān)的功能機制配置介紹分析

回顧Quarkus介紹

Quarkus的概念定義

Quarkus是一個為Java虛擬機(JVM)和原生編譯而設計的全堆棧 Kubernetes 原生 Java 框架电禀,用于專門針對容器優(yōu)化 Java,并使其成為無服務器锋恬、云和 Kubernetes 環(huán)境的高效平臺梁肿。

Quarkus與框架整合

Quarkus可與常用 Java 標準、框架和庫協(xié)同工作,例如:Eclipse MicroProfile、Spring犬金、Apache Kafka、RESTEasy (JAX-RS)六剥、Hibernate ORM (JPA)、Spring峰伙、Infinispan疗疟、Camel 等。

Quarkus的依賴注入

Quarkus的依賴注入解決方案基于 CDI(上下文和依賴注入)瞳氓,且包含一個擴展框架來擴展功能并將其配置策彤、引導并集成到您的應用中。添加擴展就像添加依賴項一樣容易;或者店诗,您可以使用 Quarkus 工具裹刮。

Quarkus多語言化

  • GraalVM(一種通用虛擬機,用于運行以多種語言(包括 Java 和 JavaScript)編寫的應用)提供正確信息庞瘸,以便對應用進行原生編譯捧弃。

  • 驚人的快速啟動時間,極低的RSS內(nèi)存(不僅是堆大胁聊摇Nハ肌)在容器編排平臺(如Kubernetes)中提供了近乎即時的向上擴展和高密度的內(nèi)存利用率

專為開發(fā)人員而設計

Quarkus的設計從一開始就立足于簡單易用,其功能幾乎不需要配置即可正常使用瞬场。

開發(fā)人員可以為其應用選擇所需的Java框架买鸽,而這些應用可以在JVM模式下運行,也可以在原生模式下進行編譯和運行贯被。

可為開發(fā)人員帶來最佳的歡樂:

統(tǒng)一配置
  • 零配置眼五,瞬間重載實時重載

  • 簡化了80%常用用法的代碼,靈活了20%的用法

  • 無需麻煩的本機可執(zhí)行文件生成

容器優(yōu)先
  • 無論是將應用托管在公共云上還是內(nèi)部托管的 Kubernetes 集群中彤灶,快速啟動和低內(nèi)存消耗等特性對于降低總體主機成本來說都至關(guān)重要看幼。

  • Quarkus的開發(fā)遵從了容器優(yōu)先的原則,這意味著它已通過以下方式針對降低內(nèi)存使用和加快啟動時間進行了優(yōu)化

    • 鼎力支持Graal/SubstrateVM

    • 構(gòu)建時元數(shù)據(jù)處理

    • 減少反射的使用

    • 本機映像預啟動

Quarkus構(gòu)建的應用其內(nèi)存消耗只有傳統(tǒng)Java的1/10枢希,而且啟動時間更快(快了 300 倍)桌吃,這些都大大降低了云資源的成本。

image

云原生

在Kubernetes等環(huán)境中采用 12 要素原則苞轿。

統(tǒng)一命令式與反應式

在設計上茅诱,Quarkus能夠在開發(fā)應用時無縫地結(jié)合熟悉的命令式代碼和非阻塞、響應式樣式搬卒。

這對于習慣使用命令式模型而不想切換風格的 Java 開發(fā)人員以及使用云原生/響應式方法的開發(fā)人員都非常有用瑟俭。

image
基于標準

Quarkus通過利用您喜歡和使用的五十多種最佳庫的不斷增長的列表,提供了一個內(nèi)聚的契邀,易于使用的摆寄,全棧的框架。所有都連接在標準主干上

Quarkus 開發(fā)模型可以適應您正在開發(fā)的任何應用

對于在新的無服務器架構(gòu)坯门、微服務微饥、容器、Kubernetes古戴、功能即服務(FaaS)和云環(huán)境中運行 Java 而言欠橘,Quarkus 堪稱是一個有效的解決方案,因為在創(chuàng)建它時就充分考慮了所有這些因素现恼。

使用DI注入

  • Quarkus中的依賴注入基于ArC肃续,ArC是為Quarkus架構(gòu)量身定制的基于CDI的依賴注入解決方案黍檩。如果您不熟悉CDI,建議您閱讀CDI簡介指南始锚。

  • Quarkus僅實現(xiàn)CDI功能的一個子集刽酱,并具有非標準功能和特定的APIS,您可以在Contexts and Dependency Injection指南中了解有關(guān)它的更多信息瞧捌。

  • ArC作為的依賴項棵里,quarkus-resteasy因此您已經(jīng)很方便了。

配置參考指南

Quarkus應用程序和Quarkus本身(核心和擴展)都通過相同的機制進行配置察郁,該機制利用SmallRye Config API和 MicroProfile Config規(guī)范的實現(xiàn)衍慎。Quarkus本身提供了一些附加功能。

配置源

默認情況下皮钠,Quarkus從多個來源(優(yōu)先級遞減)中讀取配置屬性:

  • 系統(tǒng)屬性
  • 環(huán)境變量
  • 名為文件.env放置在當前工作目錄中
  • application.properties文件放在$PWD/config/目錄中
  • 應用程序配置文件稳捆,即src/main/resources/application.properties

系統(tǒng)屬性

運行jar:
java -Dquarkus.datasource.password=youshallnotpass -jar target/quarkus-app/quarkus-run.jar
native執(zhí)行文件:
./target/myapp-runner -Dquarkus.datasource.password=youshallnotpass

環(huán)境變量

運行jar:
export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ; 
java -jar target/quarkus-app/quarkus-run.jar
native可執(zhí)行文件:
export QUARKUS_DATASOURCE_PASSWORD=youshallnotpass ;
./target/myapp-runner

文件名為.env放置在當前工作目錄中

示例.env文件

QUARKUS_DATASOURCE_PASSWORD=youshallnotpass
QUARKUS_DATASOURCE_PASSWORD使用與環(huán)境變量相同的規(guī)則來轉(zhuǎn)換名稱。

對于開發(fā)人員模式麦轰,此文件可以放在項目的根目錄中乔夯,但建議不要將其檢入版本控制。

沒有定義的配置文件的環(huán)境變量.env文件將覆蓋其所有相關(guān)的配置文件中application.properties款侵,例如末荐,%test.application.value被覆蓋APPLICATION_VALUE的.env文件。

application.properties文件放置在$PWD/config/

  • 將application.properties文件放置在名為config的目錄中新锈,該目錄位于應用程序運行的目錄中甲脏,該文件中定義的所有運行時屬性都將覆蓋默認配置。

  • 此外妹笆,添加到該文件中的任何不屬于原始application.properties文件的 運行時屬性也將被考慮在內(nèi)块请。對于運行程序jar和本機可執(zhí)行文件,其工作方式相同拳缠。

  • 該config/application.properties功能在開發(fā)模式下也可用墩新。

  • 要使用它,config/application.properties需要放置在構(gòu)建工具的輸出目錄中窟坐。但是請記住海渊,從構(gòu)建工具進行的任何清理操作(例如mvn clean或)gradle clean也會刪除該config目錄。

應用程序配置文件

位于中的主要應用程序配置文件src/main/resources/application.properties哲鸳。

application.properties文件
greeting.message=hello 
quarkus.http.port=9090 

Quarkus支持在文件中使用屬性表達式application.properties臣疑。

將配置文件嵌入到依賴項中
  • 可以通過向META-INF/microprofile-config.properties配置文件中添加一個配置文件來將配置文件嵌入其中(這是MicroProfile Config的標準功能)。

  • 當將此依賴項添加到應用程序時徙菠,其配置屬性將被合并朝捆。

  • 可以覆蓋優(yōu)先于它的屬性來自它的屬性application.properties。

注入配置屬性

Quarkus使用MicroProfile Config注釋在應用程序中注入配置屬性懒豹。

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

可以使用@Inject @ConfigProperty或@ConfigProperty芙盘。對于使用@Inject注釋的成員,注釋不是必需的@ConfigProperty脸秽。此行為不同于MicroProfile Config儒老。

如果應用程序嘗試注入未設置的配置屬性,則會引發(fā)錯誤记餐,從而使您可以快速了解配置何時完成驮樊。

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

@ConfigProperty(name = "greeting.suffix", defaultValue="!") 
String suffix;

@ConfigProperty(name = "greeting.name")
Optional<String> name; 

如果您不提供此屬性的值,則應用程序啟動將失敗

javax.enterprise.inject.spi.DeploymentException: No config value of type [class java.lang.String] exists for: greeting.message片酝。

如果配置未提供的值囚衔,則會注入默認值greeting.suffix。

此屬性是可選的-Optional如果配置未提供的值雕沿,則會注入一個空值greeting.name练湿。

以編程方式訪問配置

可以通過編程方式訪問配置。實現(xiàn)動態(tài)查找或從既不是CDI bean也不是JAX-RS資源的類中檢索配置的值可能很方便审轮。

可以使用以下方式以編程方式訪問配置

org.eclipse.microprofile.config.ConfigProvider.getConfig():

String databaseName = ConfigProvider.getConfig().getValue("database.name", String.class);
Optional<String> maybeDatabaseName = ConfigProvider.getConfig().getOptionalValue("database.name", String.class);

使用@ConfigProperties

作為以上一示例中所示的方式注入多個相關(guān)配置值的替代方法肥哎,用戶還可以使用@io.quarkus.arc.config.ConfigProperties注釋將這些屬性組合在一起。

對于上面的Greeting屬性疾渣,GreetingConfiguration可以這樣創(chuàng)建一個類:

@ConfigProperties(prefix = "greeting") 
public class GreetingConfiguration {

    private String message;
    private String suffix = "!";
    private Optional<String> name;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    public Optional<String> getName() {
        return name;
    }

    public void setName(Optional<String> name) {
        this.name = name;
    }
}

然后可以GreetingResource使用@Inject類似的CDI注釋將此類注入到篡诽,如下所示:

@Inject
GreetingConfiguration greetingConfiguration;

Quarkus提供的另一種替代樣式是GreetingConfiguration像這樣創(chuàng)建接口:

package org.acme.config;

import io.quarkus.arc.config.ConfigProperties;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import java.util.Optional;

@ConfigProperties(prefix = "greeting")
public interface GreetingConfiguration {

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

    @ConfigProperty(defaultValue = "!")
    String getSuffix(); 

    Optional<String> getName(); 
}

在@ConfigProperties類或接口上使用時,如果未提供其字段之一的值榴捡,則應用程序啟動將失敗杈女,并且將javax.enterprise.inject.spi.DeploymentException顯示指示缺少值的信息。這不適用于Optional字段和具有默認值的字段吊圾。

有關(guān)@ConfigProperties的其他說明

當使用帶有類注釋的常規(guī)類時达椰,@ConfigProperties不一定必須聲明getter和setter。具有簡單的公共非最終字段也是有效的街夭。

此外砰碴,配置類支持嵌套對象配置。假設需要有一個額外的問候語配置層板丽,名稱content將包含一些字段呈枉。可以這樣實現(xiàn):

@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {

    public String message;
    public String suffix = "!";
    public Optional<String> name;
    public ContentConfig content; 

    public static class ContentConfig {
        public Integer prizeAmount;
        public List<String> recipients;
    }
}

字段名稱(不是類名稱)將確定綁定到對象的屬性的名稱埃碱。

設置屬性將以正常方式進行猖辫,例如,application.properties可能具有:

greeting.message = hello
greeting.name = quarkus
greeting.content.prize-amount=10
greeting.content.recipients=Jane,John

此外砚殿,@ConfigProperties可以使用Bean Validation批注來批注使用批注的類啃憎,類似于以下示例:

@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {

    @Size(min = 20)
    public String message;
    public String suffix = "!";

}

為了使驗證生效,quarkus-hibernate-validator需要提供擴展名

如果使用給定的配置驗證失敗似炎,則應用程序?qū)o法啟動辛萍,并在日志中指示相應的驗證錯誤悯姊。

如果接口帶有注釋@ConfigProperties,則允許該接口擴展其他接口贩毕,并且使用整個接口層次結(jié)構(gòu)中的方法來綁定屬性悯许。

使用具有不同前綴的相同ConfigProperty

Quarkus還支持使用注解@ConfigProperties為每個注入點使用帶有不同前綴的同一對象io.quarkus.arc.config.@ConfigPrefix。舉例來說辉阶,前綴和前綴GreetingConfiguration都需要使用以上代碼先壕。在這種情況下,代碼如下所示:greetingother

GreetingConfiguration.java

@ConfigProperties(prefix = "greeting")
public class GreetingConfiguration {

    @Size(min = 20)
    public String message;
    public String suffix = "!";

}
SomeBean.java

@ApplicationScoped
public class SomeBean {

    @Inject 
    GreetingConfiguration greetingConfiguration;

    @ConfigPrefix("other") 
    GreetingConfiguration otherConfiguration;

}

使用對象列表

在某些情況下谆甜,可能有必要支持利用對象列表的復雜配置結(jié)構(gòu)垃僚,如以下示例所示:

ComplexConfiguration.java

@ConfigProperties(prefix = "complex")
public class ComplexConfiguration {
    public String name;
    public String user;
    public String password;
    public List<Nested> inputs;
    public List<Nested> outputs;
    public static class Nested {
        public String user;
        public String password;
    }
}

僅當將YAML配置與quarkus-config-yaml擴展一起使用時,才對此類用例提供支持规辱。相應的示例YAML配置可以是:

application.yaml

complex:
  name: defaultName
  user: defaultUser
  password: defaultPassword
  inputs:
    - user: user
      password: secret
    - user: otheruser
      password: secret2
  outputs:
    - user: someuser
      password: asecret
    - user: someotheruser
      password: anothersecret

這種配置的局限性在于用作列表的通用類型的類型必須是類而不是接口

配置配置文件

Quarkus支持配置配置文件的概念谆棺。這些允許您在同一文件中具有多個配置,并通過配置文件名稱在它們之間進行選擇按摘。

語法為%{profile}.config.key=value包券。例如,如果我有以下內(nèi)容:

quarkus.http.port=9090
%dev.quarkus.http.port=8181

除非dev配置文件處于活動狀態(tài)炫贤,否則Quarkus HTTP端口將為9090 溅固,在這種情況下,它將為8181兰珍。

要在.env文件中使用配置文件侍郭,可以遵循一種_{PROFILE}_CONFIG_KEY=value模式。.env文件中上述示例的等效內(nèi)容為:

QUARKUS_HTTP_PORT=9090
_DEV_QUARKUS_HTTP_PORT=8181
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掠河,一起剝皮案震驚了整個濱河市亮元,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唠摹,老刑警劉巖爆捞,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勾拉,居然都是意外死亡煮甥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門藕赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來成肘,“玉大人,你說我怎么就攤上這事斧蜕∷簦” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洒闸。 經(jīng)常有香客問我染坯,道長,這世上最難降的妖魔是什么顷蟀? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任酒请,我火速辦了婚禮,結(jié)果婚禮上鸣个,老公的妹妹穿的比我還像新娘。我一直安慰自己布朦,他們只是感情好囤萤,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是趴,像睡著了一般涛舍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唆途,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天富雅,我揣著相機與錄音,去河邊找鬼肛搬。 笑死没佑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的温赔。 我是一名探鬼主播蛤奢,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陶贼!你這毒婦竟也來了啤贩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拜秧,失蹤者是張志新(化名)和其女友劉穎痹屹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枉氮,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡志衍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘲恍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片足画。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佃牛,靈堂內(nèi)的尸體忽然破棺而出淹辞,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布象缀,位于F島的核電站蔬将,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏央星。R本人自食惡果不足惜霞怀,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莉给。 院中可真熱鬧毙石,春花似錦、人聲如沸颓遏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叁幢。三九已至滤灯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曼玩,已是汗流浹背鳞骤。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留黍判,地道東北人豫尽。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像样悟,于是被迫代替她去往敵國和親拂募。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容