Quarkus

Quarkus入門

Terry 2019/12/27 14:02:15
5596

前言

Quarkus是RedHat發布的一個對GraalVMOpenJDK HotSpot 量身定制的Kubernetes原生Java框架。Quarkus的目的是使Java成為Kubernetes和無服務器(serverless)環境中的領先平台,為開發人員提供統一的響應式和命令式程式設計模型。

Quarkus利用Java開發人員常使用的libraries(例如:Eclipse MicroProfileVert.x)帶來了一個全端框架(full-stack framework)。Quarkus的依賴注入是基於上下文依賴注入(Contexts and Dependency Injection, CDI),使開發人員能夠使用JPA / HibernateJAX-RS / RESTEasy等方案。此外Quarkus也包含一個擴展框架,第三方框架的作者可以利用其來擴展框架。

根據RedHat表示,Quarkus對運行效率有著顯著影響,例如:快速啟動可以在容器和Kubernetes上自動增/減微服務,較低的記憶體使用率則有助於在微服務部署時優化容器的密度,還有較小的應用程序和容器映像佔用空間。

在現在這個雲服務的時代,容器、Kubernetes、微服務、功能即服務(Faas)和雲原生應用程序都提供了更高的生產力和效率,Quarkus也會是另一個有趣的選擇方案。

記憶體佔用及響應時間比較圖(取自官網)

記憶體佔用及響應時間比較(取自官網)

 

開始創建Hello World Quarkus應用程序

 

開始之前準備環境

1.     一個IDE,例如IntelliJ IDEAEclipseVSCodeVimEmacs

2.     JDK811以上

3.     Apache Maven 3.5.3以上,或是Gradle

 

 

創建新的Quarkus項目

1. 打開終端機並輸入以下指令

mvn io.quarkus:quarkus-maven-plugin:1.1.0.Final:create \

     -DprojectGroupId=org.acme \

     -DprojectArtifactId=getting-started \

     -DclassName="org.acme.quickstart.GreetingResource" \

     -Dpath="/hello"

 

等待數分鐘後終端機顯示成功

 

完成後會產生getting-started資料夾,進入後結構如下

 

已創建好的src/main/java/org/acme/quickstart/GreetingResource.java資源

package org.acme.quickstart;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}

 

2. 輸入下列指令開始執行應用程序(使用CTRL+C 停止)

./mvnw compile quarkus:dev

 

執行結果成功啟動

 

3. 成功啟動後可以用下列指令測試(或用瀏覽器開啟)

curl -w "\n" http://localhost:8080/hello

 

測試結果,成功返回hello

 

 

開發模式

Quarkus提供了Live Coding功能,使開發人員可以避免編寫代碼→編譯→部署→刷新瀏覽器→重複的無聊過程。通過執行quarkus:devQuarkus將以開發模式啟動。收到HTTP請求後,它將保留該請求,並檢查是否有任何應用程序源文件更動過。如果有,它會編譯更改的文件,將更改後的文件重新部署到應用程序,然後HTTP請求才會發送到重新部署的應用程序。

 

依賴注入

1. 以下示範注入範例,首先創建src/main/java/org/acme/quickstart/GreetingService.java文件,內容如下

package org.acme.quickstart;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingService {

    public String greeting(String name) {
        return "hello " + name;
    }

}​

 

2. 修改GreetingResource文件,注入GreetingService文件

package org.acme.quickstart;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.jboss.resteasy.annotations.jaxrs.PathParam;

@Path("/hello")
public class GreetingResource {

    @Inject
    GreetingService service;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/greeting/{name}")
    public String greeting(@PathParam String name) {
        return service.greeting(name);
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}

 

3. 使用下列指令,檢查端點hello quarkus是否符合預期返回

curl -w "\n" http://localhost:8080/hello/greeting/quarkus

 

測試結果成功返回hello quarkus

 

與此同時,該應用的熱部署情況(自動重新部署)

 

 

測試文件

編輯src/test/java/org/acme/quickstart/GreetingResourceTest.java文件

package org.acme.quickstart;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import java.util.UUID;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class GreetingResourceTest {

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

    @Test
    public void testGreetingEndpoint() {
        String uuid = UUID.randomUUID().toString();
        given()
          .pathParam("name", uuid)
          .when().get("/hello/greeting/{name}")
          .then()
            .statusCode(200)
            .body(is("hello " + uuid));
    }

}​

 

使用maven測試文件

./mvnw test

 

測試結果如下

 

打包&執行應用程序

1. 打包應用程序:使用./mvnw package指令

 

成功會在/target資料夾下產生兩個jar檔案

 

2. 執行應用程序:使用指令java -jar target/getting-started-1.0-SNAPSHOT-runner.jar即可執行

 

結語

Quarkus入門教學在此告一個段落,雖然是一個今年才探出頭來的新技術,不過實際操作起來可以發現它十分輕巧,在我5年前的老筆電上執行部屬都很快速,不過也因為是滿新的技術(2019年11月正式發佈1.0版本,撰寫本文時已發佈1.1版本),網路上可以找到的資源還不算多,還有許多可以探討的空間,希望未來能夠發展出更多的應用。

 

參考文章

Quarkus官網 - GUIDES: https://quarkus.io/guides/

iThome - 紅帽釋出K8s Java開發框架Quarkus 1.0 : https://www.ithome.com.tw/news/134141

 

 

 

 

Terry