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 は「アグリゲーター/コード ジェネレーター」と「高レベルのフルスタック フレームワーク」の中間に位置します。 これはすでにアグリゲーター以上のものですが、フルスタックにさえ達していません。 バックエンド開発向けに調整されています。

アプリケーションの起動速度が非常に速く、メモリ消費量が少ないことが約束されています。 開発者の 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 は拡張可能なフレームワークです。 現在注文があります 40 拡張子、サポートからのさまざまな機能を追加します Spring DIコンテナ и アパッチキャメル 実行中のサービスのメトリクスをログに記録して公開する前に。 また、Java に加えて、Kotlin でのアプリケーションの作成をサポートする拡張機能がすでに存在します。

まとめ

私の意見では、Quarkus は時代の流れに非常に沿っています。 バックエンド コードの開発はますます容易になり、このフレームワークは Docker と Kubernetes のネイティブ サポートを追加することで、サービス開発をさらに簡素化し、スピードアップします。 大きな利点は、GraalVM のサポートとプラットフォーム依存のイメージの生成が組み込まれていることです。これにより、サービスを非常に迅速に開始し、メモリ領域をほとんど消費することがなくなります。 そしてこれは、マイクロサービスとサーバーレス アーキテクチャに対する大衆の情熱の時代において非常に重要です。

公式サイト- quarkus.io。 クイックスタート用のプロジェクトの例は、すでに次のサイトで入手できます。 GitHubの.

出所: habr.com

コメントを追加します