云原生时代高性能Java框架—Quarkus(一)
——— Quarkus&GraalVM介紹、創(chuàng)建并啟動第一個(gè)項(xiàng)目
Quarkus系列博文
Quarkus&GraalVM介紹、創(chuàng)建并啟動第一個(gè)項(xiàng)目
構(gòu)建Quarkus本地鏡像、容器化部署Quarkus項(xiàng)目
...
Quarkus介紹
Quarkus 是一個(gè)為 Java 虛擬機(jī)(JVM)和原生編譯而設(shè)計(jì)的全堆棧 Kubernetes 原生 Java 框架,用于專門針對容器優(yōu)化 Java,并使其成為無服務(wù)器、云和 Kubernetes 環(huán)境的高效平臺。
Quarkus 可與常用 Java 標(biāo)準(zhǔn)、框架和庫協(xié)同工作,例如 Eclipse MicroProfile、Apache Kafka、RESTEasy(JAX-RS)、Hibernate ORM(JPA)、Spring、Infinispan、Camel 等。
Quarkus 的依賴注入解決方案基于 CDI(上下文和依賴注入),且包含一個(gè)擴(kuò)展框架來擴(kuò)展功能并將其配置、引導(dǎo)并集成到您的應(yīng)用中。添加擴(kuò)展就像添加依賴項(xiàng)一樣容易;或者,您可以使用 Quarkus 工具。
此外也是引人注目的一個(gè)特點(diǎn),它還向 GraalVM(一種通用虛擬機(jī),用于運(yùn)行以多種語言(包括 Java 和 JavaScript)編寫的應(yīng)用)提供正確信息,以便對應(yīng)用進(jìn)行原生編譯。
Rad Hat列出了一下清單來表明使用Quarkus的好處:檢查清單
Quarkus與傳統(tǒng)Java框架對比
Quarkus與傳統(tǒng)技術(shù)棧對比
來自官方的一張圖,展示了使用Quarkus框架開發(fā)項(xiàng)目和使用傳統(tǒng)框架開發(fā)的一些運(yùn)行時(shí)數(shù)據(jù)明細(xì)對比,可以看到Quarkus項(xiàng)目在JVM中運(yùn)行時(shí)所消耗的內(nèi)存和接口響應(yīng)能力要明顯好于傳統(tǒng)的Java技術(shù)棧。而將Quarkus編譯成本地可執(zhí)行文件(本地鏡像)之后,其優(yōu)勢可以說非常明顯了。
GraalVM簡介
GraalVM是一種高性能的虛擬機(jī),它可以顯著的提高程序的性能和運(yùn)行效率,非常適合微服務(wù)。其設(shè)計(jì)初衷是實(shí)現(xiàn)可以運(yùn)行不同語言(Java、JavaScript、基于LLVM的語言(例如C和C ++)以及其他動態(tài)語言)編寫的應(yīng)用程序。它消除了不同編程語言之間的隔閡,并實(shí)現(xiàn)了多語言共享運(yùn)行時(shí)的互操作性。它可以獨(dú)立運(yùn)行,也可以在OpenJDK,Node.js或Oracle數(shù)據(jù)庫的上下文中運(yùn)行。
對于Java應(yīng)用程序,GraalVM可以帶來很多有價(jià)值的好處:更快地運(yùn)行它們,通過腳本語言(JavaScript, R, Python...)提供可擴(kuò)展性或創(chuàng)建提前編譯的本機(jī)映像(native-image)。
更多關(guān)于GraalVM的信息可參考:此篇文章。
GraalVM安裝
本文我們使用SDKMAN來安裝GraalVM。SDKMAN是一款用于在大多數(shù)基于Unix的系統(tǒng)上管理多個(gè)軟件開發(fā)套件的并行版本的工具。它提供了一個(gè)方便的命令行界面(CLI)和API,用于安裝,切換,刪除和列出候選人。它以前被稱為Groovy enVironment Manager (GVM),受到了非常有用的RVM和rbenv工具的啟發(fā),該工具在Ruby社區(qū)中廣泛使用。
安裝SDKMAN
運(yùn)行如下命令進(jìn)行安裝:
$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
運(yùn)行如下命令,驗(yàn)證是否已安裝ADKMAN:
$ sdk version
安裝GraalVM
運(yùn)行如下命令:
$ sdk list java
可以看到SDKMAN列出了所支持的所有Java發(fā)行版
我們找到GraalVM的發(fā)行版
截至編寫本文時(shí),GraalVM的最新版本為20.1.0.r11-grl,所以我們會安裝此版本。運(yùn)行如下命令安裝GraalVM:
$ sdk install java 20.1.0.r11-grl
至此,GraalVM安裝完畢!我們可以運(yùn)行如下命令來判斷GraalVM是否已安裝:
$ java -version
創(chuàng)建項(xiàng)目
我們有多種方式創(chuàng)建Quarkus項(xiàng)目
使用Intellij IDEA創(chuàng)建Quarkus項(xiàng)目
點(diǎn)擊菜單欄File>New>Project... 創(chuàng)建新項(xiàng)目
點(diǎn)擊Next,并填寫適當(dāng)?shù)男畔ⅲ琋ext>Next...,創(chuàng)建完畢。
使用Maven命令行創(chuàng)建Quarkus項(xiàng)目
運(yùn)行如下命令,創(chuàng)建Quarkus項(xiàng)目:
mvn io.quarkus:quarkus-maven-plugin:1.6.0.Final:create
-DprojectGroupId=org.acme
-DprojectArtifactId=getting-started
-DclassName="org.acme.getting.started.GreetingResource"
-Dpath="/hello"
cd getting-started
至此,創(chuàng)建項(xiàng)目完畢!
啟動項(xiàng)目
我們使用IDEA打開項(xiàng)目
Quarkus并沒有類似Spring Boot、Helidon之類框架一樣的啟動類,我們需要通過運(yùn)行Maven命令來啟動項(xiàng)目。
在IDEA控制臺運(yùn)行如下命令來啟動項(xiàng)目:
./mvnw compile quarkus:dev
啟動成功!
當(dāng)然每次運(yùn)行命令行會顯得不便,我們可以通過如下配置來配置項(xiàng)目快捷啟動:
點(diǎn)擊左上角"+"圖標(biāo)添加一個(gè)Maven配置如左邊欄,在右邊欄中的Command line中填入"compile quarkus:dev",點(diǎn)擊OK。
此時(shí)可以點(diǎn)下下圖所示圖標(biāo)來便捷啟動項(xiàng)目
運(yùn)行測試
打開項(xiàng)目中的測試類,看到如下代碼:
@QuarkusTest //1
public class ExampleResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200) //2
.body(is("hello"));
}
}
通過使用@QuarkusTest注解運(yùn)行程序,可以指示JUnit在測試之前啟動應(yīng)用程序。
檢查HTTP響應(yīng)狀態(tài)代碼和內(nèi)容。
默認(rèn)情況下,測試將在端口8081上運(yùn)行,以免與正在運(yùn)行的應(yīng)用程序沖突。Quarkus自動將RestAssured配置為使用此端口。如果要測試其他路徑,則可以使用@TestHTTPResource注解將被測試的URL直接注入到測試類的字段中。該字段的類型可以是字符串,URL或URI。我們需要為該注解指定測試路徑的值。例如,如果我要測試映射到/myservlet的Servlet,只需在測試中添加以下內(nèi)容:
@QuarkusTest
public class ExampleResourceTest {
@TestHTTPResource("/myservlet")
URL testUrl;
@Test
public void testHelloEndpoint() {
given()
.when().get(testUrl)
.then()
.statusCode(200)
.body(is("hello"));
}
}
可以通過在項(xiàng)目配置文件中配置quarkus.http.test-port屬性控制測試端口。 Quarkus還創(chuàng)建了一個(gè)名為test.url的系統(tǒng)屬性,該屬性值將被設(shè)置成基礎(chǔ)測試URL(BasePath)。
總結(jié)
我們進(jìn)入了云原生、微服務(wù)的時(shí)代,我們告別了大型單體應(yīng)用的龐大和復(fù)雜,并且收獲了微服務(wù)帶來的極大的好處 。但是一些問題也開始接踵而至。隨著微小服務(wù)的增多,曾經(jīng)在單個(gè)應(yīng)用上發(fā)生的多余無用依賴、Java項(xiàng)目與生俱來的啟動過程緩慢、JIT優(yōu)化問題擴(kuò)散到了每個(gè)微服務(wù)上面。而且傳統(tǒng)的Java EE規(guī)范并沒有微服務(wù)的模式解決方案,問題很迫切需要解決。幸運(yùn)的事,隨著Quarkus、Helidon等等一些新型Java開發(fā)框架的出現(xiàn)緩解了這個(gè)局面(以及目前Spring生態(tài)也開始了對GraalVM的大力支持),他們使Java變得更加本地化,不管是項(xiàng)目的體量方面還是資源消耗和運(yùn)行效率方面都有顯著提升。
總結(jié)
以上是生活随笔為你收集整理的云原生时代高性能Java框架—Quarkus(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppo r9s 解bl锁,刷入第三方r
- 下一篇: CodeForces 24D Broke