Quarkus 是一種超音速亞原子 Java。 框架簡要概述

Quarkus 是一種超音速亞原子 Java。 框架簡要概述

介紹

XNUMX月XNUMX日,RedHat(即將成為IBM) 呈現 新框架—— 誇庫斯。 據開發人員介紹,該框架基於 GraalVM 和 OpenJDK HotSpot,專為 Kubernetes 設計。 Quarkus 堆疊包括:JPA/Hibernate、JAX-RS/RESTEasy、Eclipse Vert.x、Netty、Apache Camel、Kafka、Prometheus 等。

目標是使 Java 成為 Kubernetes 部署和無伺服器應用程式開發的領先平台,為開發人員提供反應式和命令式開發的統一方法。

如果你看 如果按照框架的分類,Quarkus 介於「聚合器/程式碼產生器」和「進階全端框架」之間。 這已經不僅僅是一個聚合器了,但它甚至還沒有達到全棧,因為… 專為後端開發而設計。

承諾非常高的應用程式啟動速度和低記憶體消耗。 以下是來自開發人員網站的數據:

從開始到第一次反應的時間(秒):

組態
REST的
休息+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

傳統雲端原生堆疊*
4.3
9.5

記憶體消耗(Mb):

組態
REST的
休息+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

傳統雲端原生堆疊*
140
218

令人印象深刻,不是嗎?

*我沒有找到任何有關該技術堆疊的信息,我們可以假設這是某種帶有附加主體套件的 Spring Boot.

你好,世界!

用 Quarkus 編寫的最簡單的應用程式如下所示:

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

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

這其實是一堂課,這就夠了! 您可以在開發模式下使用 Maven 運行應用程式:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

與普通應用程式的區別在於,沒有Application類別! Quarkus 支援熱重載,因此您無需重新啟動即可更改應用程序,從而使開發速度更快。

下一步是什麼? 您可以使用註解將服務新增至控制器 注入。 服務代碼:

@ApplicationScoped
public class GreetingService {

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

控制器:

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

   @Inject
   GreetingService service;

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

$ curl http://localhost:8080/hello/developer
Hello developer!

請注意,Quarkus 使用來自熟悉框架(CDI 和 JAX-RS)的標準註解。 當然,如果您以前使用過 CDI 和 JAX-RS,則無需學習任何新內容。

使用資料庫

使用實體的 Hibernate 和標準 JPA 註解。 與 REST 控制器一樣,您需要編寫最少的程式碼。 在彙編文件中標明依賴關係就夠了,加入註解 @Entity 並在application.properties中配置資料來源。

全部。 沒有 sessionFactory、persistence.xml 或其他服務文件。 我們只編寫需要的程式碼。 但是,如果有必要,您可以建立 persistence.xml 檔案並更精細地配置 ORM 層。

Quarkus 支援實體快取、一對多關係的集合以及查詢。 乍一看看起來很棒,但實際上 當地 緩存,針對一個 Kubernetes 節點。 那些。 不同節點的快取不同步。 我希望這是暫時的。

非同步程式碼執行

如上所述,Quarkus 還支援響應式程式設計風格。 前面的應用程式的程式碼可以寫成不同的形式。

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

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

非同步程式碼也可以轉移到服務中,結果是一樣的。

測試

Quarkus 應用程式的測試可以用 JUnit4 或 JUnit5 編寫。 下面是端點測試的範例,它是使用 RestAssured 編寫的,但也可以使用另一個框架:

@QuarkusTest
public class GreetingResourceTest {

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

@QuarkusTest 註解指示您在執行測試之前執行應用程式。 其餘的程式碼是所有開發人員都熟悉的。

特定於平台的應用程式

由於 Quarkus 與 GraalVM 緊密整合,因此當然可以產生特定於平台的程式碼。 為此,您需要安裝 GraalVM 並指定 GRAALVM_HOME 環境變數。 更遠 註冊裝配配置文件 並在構建應用程式時指定它:

mvn package -Pnative

有趣的是,生成的應用程式可以進行測試。 這很重要,因為本機程式碼的執行可能與 JVM 上的執行不同。 @SubstrateTest 註解運行特定於平台的應用程式程式碼。 可以使用繼承來重複使用現有的測試程式碼;因此,用於測試依賴平台的應用程式的程式碼將如下所示:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

產生的映像可以打包在Docker中並在Kubernetes或OpenShift中運行,詳細描述見 路線.

工具

Quarkus 框架可以與 Maven 和 Gradle 一起使用。 與 Gradle 不同,Maven 得到了完全支援。 不幸的是,目前 Gradle 不支援生成空專案;網站上有詳細信息 教科書.

Расширения

Quarkus 是一個可擴展的框架。 目前有訂單 40 個擴展,它添加了各種功能 - 來自支持 Spring DI 容器 и 阿帕奇駱駝 在記錄和發布正在運行的服務的指標之前。 除了 Java 之外,已經有一個擴充功能支援用 Kotlin 編寫應用程式。

結論

在我看來,Quarkus 非常符合當時的潮流。 後端程式碼開發變得越來越容易,該框架透過添加對 Docker 和 Kubernetes 的原生支持,進一步簡化和加速了服務開發。 一個巨大的優點是對 GraalVM 的內建支援以及平台相關映像的生成,這使得服務能夠非常快速地啟動並且佔用很少的記憶體空間。 在我們對微服務和無伺服器架構充滿熱情的時代,這一點非常重要。

官方網站 - quarkus.io。 快速啟動專案的範例已在 GitHub上.

來源: www.habr.com

添加評論