雲原生時代高性能Java框架—Quarkus(一)

——— Quarkus&GraalVM介紹、建立並啓動第一個項目java


Quarkus系列博文數據庫


Quarkus介紹

Quarkus 是一個爲 Java 虛擬機(JVM)和原生編譯而設計的全堆棧 Kubernetes 原生 Java 框架,用於專門針對容器優化 Java,並使其成爲無服務器、雲和 Kubernetes 環境的高效平臺。編程

Quarkus 可與經常使用 Java 標準、框架和庫協同工做,例如 Eclipse MicroProfile、Apache Kafka、RESTEasy(JAX-RS)、Hibernate ORM(JPA)、Spring、Infinispan、Camel 等。bash

Quarkus 的依賴注入解決方案基於 CDI(上下文和依賴注入),且包含一個擴展框架來擴展功能並將其配置、引導並集成到您的應用中。添加擴展就像添加依賴項同樣容易;或者,您可使用 Quarkus 工具。服務器

此外也是引人注目的一個特色,它還向 GraalVM(一種通用虛擬機,用於運行以多種語言(包括 Java 和 JavaScript)編寫的應用)提供正確信息,以便對應用進行原生編譯。intellij-idea

Rad Hat列出了一下清單來代表使用Quarkus的好處:檢查清單框架

Quarkus與傳統Java框架對比

imgQuarkus與傳統技術棧對比curl

來自官方的一張圖,展現了使用Quarkus框架開發項目和使用傳統框架開發的一些運行時數據明細對比,能夠看到Quarkus項目在JVM中運行時所消耗的內存和接口響應能力要明顯好於傳統的Java技術棧。而將Quarkus編譯成本地可執行文件(本地鏡像)以後,其優點能夠說很是明顯了。maven

GraalVM簡介

GraalVM是一種高性能的虛擬機,它能夠顯著的提升程序的性能和運行效率,很是適合微服務。其設計初衷是實現能夠運行不一樣語言(Java、JavaScript、基於LLVM的語言(例如C和C ++)以及其餘動態語言)編寫的應用程序。它消除了不一樣編程語言之間的隔閡,並實現了多語言共享運行時的互操做性。它能夠獨立運行,也能夠在OpenJDK,Node.js或Oracle數據庫的上下文中運行。編程語言

GraalVM system diagram

對於Java應用程序,GraalVM能夠帶來不少有價值的好處:更快地運行它們,經過腳本語言(JavaScript, R, Python...)提供可擴展性或建立提早編譯的本機映像(native-image)。

更多關於GraalVM的信息可參考:此篇文章

GraalVM安裝

本文咱們使用SDKMAN來安裝GraalVM。SDKMAN是一款用於在大多數基於Unix的系統上管理多個軟件開發套件的並行版本的工具。它提供了一個方便的命令行界面(CLI)和API,用於安裝,切換,刪除和列出候選人。它之前被稱爲Groovy enVironment Manager (GVM),受到了很是有用的RVM和rbenv工具的啓發,該工具在Ruby社區中普遍使用。

安裝SDKMAN

運行以下命令進行安裝:

$ curl -s "https://get.sdkman.io" | bash
$ source "$HOME/.sdkman/bin/sdkman-init.sh"

運行以下命令,驗證是否已安裝ADKMAN:

$ sdk version

安裝GraalVM

運行以下命令:

$ sdk list java

能夠看到SDKMAN列出了所支持的全部Java發行版

image-20200717142755813

咱們找到GraalVM的發行版

image-20200717142840033

截至編寫本文時,GraalVM的最新版本爲20.1.0.r11-grl,因此咱們會安裝此版本。運行以下命令安裝GraalVM:

$ sdk install java 20.1.0.r11-grl

至此,GraalVM安裝完畢!咱們能夠運行以下命令來判斷GraalVM是否已安裝:

$ java -version

image-20200717143216643

建立項目

咱們有多種方式建立Quarkus項目

使用Intellij IDEA建立Quarkus項目

點擊菜單欄File>New>Project... 建立新項目

image-20200717150609041

點擊Next,並填寫適當的信息,Next>Next...,建立完畢。

使用Maven命令行建立Quarkus項目

運行以下命令,建立Quarkus項目:

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

至此,建立項目完畢!

啓動項目

咱們使用IDEA打開項目

image-20200717152929281

Quarkus並無相似Spring Boot、Helidon之類框架同樣的啓動類,咱們須要經過運行Maven命令來啓動項目。

在IDEA控制檯運行以下命令來啓動項目:

./mvnw compile quarkus:dev

啓動成功!

image-20200717153314096

固然每次運行命令行會顯得不便,咱們能夠經過以下配置來配置項目快捷啓動:

image-20200717153444892

點擊左上角"+"圖標添加一個Maven配置如左邊欄,在右邊欄中的Command line中填入"compile quarkus:dev",點擊OK。

image-20200717153542033

此時能夠點下下圖所示圖標來便捷啓動項目

image-20200717153914940

運行測試

打開項目中的測試類,看到以下代碼:

@QuarkusTest  //1
public class ExampleResourceTest {
    @Test
    public void testHelloEndpoint() {
        given()
            .when().get("/hello")
            .then()
            .statusCode(200) //2
            .body(is("hello"));
    }
}
  1. 經過使用@QuarkusTest註解運行程序,能夠指示JUnit在測試以前啓動應用程序。
  2. 檢查HTTP響應狀態代碼和內容。

默認狀況下,測試將在端口8081上運行,以避免與正在運行的應用程序衝突。Quarkus自動將RestAssured配置爲使用此端口。若是要測試其餘路徑,則可使用@TestHTTPResource註解將被測試的URL直接注入到測試類的字段中。該字段的類型能夠是字符串,URL或URI。咱們須要爲該註解指定測試路徑的值。例如,若是我要測試映射到/myservlet的Servlet,只需在測試中添加如下內容:

@QuarkusTest  
public class ExampleResourceTest {
    @TestHTTPResource("/myservlet")
    URL testUrl;

    @Test
    public void testHelloEndpoint() {
        given()
            .when().get(testUrl)
            .then()
            .statusCode(200) 
            .body(is("hello"));
    }
}

能夠經過在項目配置文件中配置quarkus.http.test-port屬性控制測試端口。 Quarkus還建立了一個名爲test.url的系統屬性,該屬性值將被設置成基礎測試URL(BasePath)。

總結

咱們進入了雲原生、微服務的時代,咱們告別了大型單體應用的龐大和複雜,而且收穫了微服務帶來的極大的好處 。可是一些問題也開始接踵而至。隨着微小服務的增多,曾經在單個應用上發生的多餘無用依賴、Java項目與生俱來的啓動過程緩慢、JIT優化問題擴散到了每一個微服務上面。並且傳統的Java EE規範並無微服務的模式解決方案,問題很迫切須要解決。幸運的事,隨着Quarkus、Helidon等等一些新型Java開發框架的出現緩解了這個局面(以及目前Spring生態也開始了對GraalVM的大力支持),他們使Java變得更加本地化,不論是項目的體量方面仍是資源消耗和運行效率方面都有顯著提高。

相關文章
相關標籤/搜索