はじめに
3月7日、RedHat(間もなくIBM) は新しいフレームワークQuarkusを発表しました 。 開発者によると、このフレームワークはGraalVMとOpenJDK HotSpotに基づいており、Kubernetesを対象としています。 Quarkusスタックには、JPA / Hibernate、JAX-RS / RESTEasy、Eclipse Vert.x、Netty、Apache Camel、Kafka、Prometheusなどが含まれます。
目標は、JavaをKubernetesにデプロイし、サーバーレスアプリケーションを開発するための主要なプラットフォームにすることです。これにより、開発者はリアクティブスタイルとインペラティブスタイルの両方を開発するための統一されたアプローチを提供できます。
このフレームワークの分類を見ると、Quarkusは「アグリゲーター/コードジェネレーター」と「ハイレベルフルスタックフレームワーク」の中間に位置しています。 これはすでにアグリゲーター以上のものですが、フルスタックには達しません。 バックエンドの開発により研ぎ澄まされました。
非常に高いアプリケーション起動速度と低メモリ消費が約束されています。 開発者のサイトからのデータは次のとおりです。
開始から最初の回答までの時間:
構成 | REST | REST + JPA |
---|---|---|
Quarkus + GraalVM | 0.014 | 0.055 |
Quarkus + OpenJDK | 0.75 | 2.5 |
従来のクラウドネイティブスタック* | 4.3 | 9.5 |
メモリ消費(Mb):
構成 | REST | REST + JPA |
---|---|---|
Quarkus + GraalVM | 13 | 35 |
Quarkus + OpenJDK | 74 | 130 |
従来のクラウドネイティブスタック* | 140 | 218 |
印象的ですね。
* このテクノロジースタックに関する情報は見つかりませんでした。これは、追加のボディキットを備えた何らかの種類のSpring Bootであると想定できます 。
Hello World!
Quarkusで書かれた最も単純なアプリケーションは次のようになります。
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
これは文字通り1つのクラスであり、それで十分です! 開発モードでMavenを使用してアプリケーションを実行できます。
mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello
通常のアプリケーションとは異なり、Applicationクラスはありません! Quarkusはホットリロードをサポートしているため、アプリケーションを再起動せずに変更できるため、開発をさらに高速化できます。
次は? Injectアノテーションを使用して、コントローラーにサービスを追加できます。 サービスコード:
@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は、エンティティのキャッシュ、1対多の関係のコレクション、およびクエリをサポートしています。 一見、見た目は素晴らしいですが、単一の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の拡張機能があります。SpringDIコンテナーとApache Camelのサポートから、実行中のサービスのメトリックのログと公開までです。 また、Javaに加えて、Kotlin言語でのアプリケーションの作成をサポートする拡張機能が既にあります。
おわりに
私の意見では、Quarkusは非常にトレンドセッターです。 バックエンドコードの開発はますます簡単になり、このフレームワークはサービスの開発をさらに簡素化および高速化し、DockerおよびKubernetesの「ネイティブ」サポートを追加します。 さらに大きな利点は、GraalVMの組み込みサポートとプラットフォーム固有のイメージの生成です。これにより、サービスを非常に高速に起動し、メモリスペースをほとんど占有しません。 そして、これは、マイクロサービスとサーバーレスアーキテクチャへの大きな熱意の時代において非常に重要です。
公式ウェブサイトはquarkus.ioです。 クイックスタートのためのプロジェクトの例は、すでにGitHubにあります 。