導入
XNUMX 月 XNUMX 日、RedHat (まもなく IBM)
目標は、Java を Kubernetes デプロイメントおよびサーバーレス アプリケーション開発の主要なプラットフォームにし、リアクティブ スタイルと命令的スタイルの両方で開発に対する統一されたアプローチを開発者に提供することです。
あなたが見れば
アプリケーションの起動速度が非常に速く、メモリ消費量が少ないことが約束されています。 開発者の Web サイトからのデータは次のとおりです。
開始から最初の応答までの時間 (秒):
設定
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";
}
}
文字通り XNUMX クラスで十分です。 開発モードで 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 は、エンティティ、XNUMX 対多の関係のコレクション、およびクエリのキャッシュをサポートしています。 一見すると素晴らしく見えますが、 ローカル XNUMX つの 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 は空のプロジェクトの生成をサポートしていません。詳細な情報は Web サイトにあります。
Расширения
Quarkus は拡張可能なフレームワークです。 現在注文があります
まとめ
私の意見では、Quarkus は時代の流れに非常に沿っています。 バックエンド コードの開発はますます容易になり、このフレームワークは Docker と Kubernetes のネイティブ サポートを追加することで、サービス開発をさらに簡素化し、スピードアップします。 大きな利点は、GraalVM のサポートとプラットフォーム依存のイメージの生成が組み込まれていることです。これにより、サービスを非常に迅速に開始し、メモリ領域をほとんど消費することがなくなります。 そしてこれは、マイクロサービスとサーバーレス アーキテクチャに対する大衆の情熱の時代において非常に重要です。
公式サイト-
出所: habr.com