回顧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 倍)桌吃,這些都大大降低了云資源的成本。
云原生
在Kubernetes等環(huán)境中采用 12 要素原則苞轿。
統(tǒng)一命令式與反應式
在設計上茅诱,Quarkus能夠在開發(fā)應用時無縫地結(jié)合熟悉的命令式代碼和非阻塞、響應式樣式搬卒。
這對于習慣使用命令式模型而不想切換風格的 Java 開發(fā)人員以及使用云原生/響應式方法的開發(fā)人員都非常有用瑟俭。
基于標準
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