介紹
XNUMX月XNUMX日,RedHat(即將成為IBM)
目標是使 Java 成為 Kubernetes 部署和無伺服器應用程式開發的領先平台,為開發人員提供反應式和命令式開發的統一方法。
如果你看
承諾非常高的應用程式啟動速度和低記憶體消耗。 以下是來自開發人員網站的數據:
從開始到第一次反應的時間(秒):
組態
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 是一個可擴展的框架。 目前有訂單
結論
在我看來,Quarkus 非常符合當時的潮流。 後端程式碼開發變得越來越容易,該框架透過添加對 Docker 和 Kubernetes 的原生支持,進一步簡化和加速了服務開發。 一個巨大的優點是對 GraalVM 的內建支援以及平台相關映像的生成,這使得服務能夠非常快速地啟動並且佔用很少的記憶體空間。 在我們對微服務和無伺服器架構充滿熱情的時代,這一點非常重要。
官方網站 -
來源: www.habr.com