最初のメジャーリリースから19か月、Red Hatは、継続的テストなどの新機能と新たなCLIを備えたQuarkus 2.0をリリースした。最低対象バージョンがJDK 11になった他、依存関係がVert.x 4.0とMicroProfile 4.0にアップグレードされている。JavaをKubernetesネイティブ開発に適したツールにする目標でスタートした、アプリケーション開発フレームワークのQuarkusは、今回のリリースによって、新しい重要なマイルストンに到達した。バージョン2.0で追加された機能はすべて、"Quarkusのルーツ — 高速ブート、少ないメモリ使用量、開発の楽しさ — を維持しつつ、まったく新しいレベルに到達させる"ためのものだ。今回のバージョンでは最低対象JDKがバージョン11になったが、Quarkus 1.13リリーストレーンでは引き続きJDK 8をサポートする。メジャーリリースには非互換的な変更が付きものだが、Red Hatは開発者に対して、スムーズなアップグレードが可能であることを約束している。
新バージョンのメリットをより深く理解するため、InfoQは今回、Quarkusのコアチームメンバたちとコンタクトを取り、Quarkus 2.0に加えられた新機能それぞれのメリットについて、簡単に説明してもらうことにした。
継続的テストは、開発モードにおいて、コードを記述中にテストの自動実行を可能にする機能である。これにより、効率性の大幅な向上が期待できる。継続的テストについて先日論じた、Red Hatのシニア・プリンシパル・ソフトウェアエンジニアであるStuart Douglasが、次のように説明してくれた。
Stuart Douglas: 継続的テストによって、変更に的を絞ったフィードバックを即座に得ることが可能になります。コードを変更すれば、そのコード部分に関連するテスト(のみ)が実行されて、結果がステータスバーに表示されるのです。開発中のコードは常にテストされていることになるので、手動でテストを実行したり、ブラウザで変更を確認したりする必要はありません。
テストの容易化に注目したもうひとつの改善であるDevServicesは、開発モードとテストモードにおいて、データベースやメッセージキューへの接続を自動的にセットアップするものだ。これについては、同社プリンシパル・ソフトウェアエンジニアのGeorgios Andrianakis氏が説明してくれた。
Georgios Andrianakis: ほとんどのアプリケーションは、機能する上において、データベースやメッセージブローカなどと通信しなくてはなりません。これはつまり、開発者がアプリケーションを開発する時やテストを実行する時にも、これらのサービスを適切にセットアップないしティアダウンする必要がある、ということです。
DevServicesは、Quarkusアプリケーションの開発において、こうした外部サービスを手作業で実行する必要を省く目的で開発されました。
具体的には、データベースやメッセージブローカを事前に起動したり、URLの設定をしたりしなくても、
mvn quarkus:dev
やmvn test
(あるいは相当するGradleないしQuarkus CLIコマンド)を使用することが可能になります。唯一の要件はDockerを起動しておくことです。これは本機能がTestcontainersを使用しているためです。注目すべき点として、DevServicesに処理させたくないサービスのURLを設定しておくことで、この機能を明示的ないし暗黙的に無効にすることも簡単にできます。
新しくなったQuarkus CLIの目的は、開発者の生産性向上にある。すべてのシステムで広く利用可能になるまでにはまだ至っていないが、JBangを使用すれば現在も実行が可能だ。この新機能によって、Quarkusでは、MavenやGradleコマンドを実行する必要はなくなる。Red Hatシニア・プリンシパル・ソフトウェアエンジニアのErin Schnabel氏が説明してくれた。
Erin Schnabel: CLIは、Quarkusプロジェクトによる開発作業を簡単にするためのものです。使用は必須ではなく、MavenやGradleプラグインもこれまでどおり動作しますが、作業を可能な限り単純かつ合理的なものにすることがCLIの目標です。プロジェクトで使用するビルドツールに関わらず、共通するタスクに一貫性と共通性を提供します (例えば、
.mvn io.quarkus:quarkus-maven-plugin:2.0.1.Final:create …
を、quarkus create
で実行可能にします)。エクステンションはQuarkusの統合キー(integration key)なので、CLIではquarkus extension
あるいはquarkus ext
を使用したエクステンションの管理 — プロジェクトからの追加と削除を行うことができます。CLIの機能は、ネイティブイメージの生成や自身の設定内容の記憶など、オプションの簡略化を対象としたものです。
視覚的なユーザインタフェース(UI)を使ったインタラクションを好む開発者のために、Quarkus DevUIにも変更が加えられた。プリンシパル・ソフトウェアエンジニアのStephane Epardaud氏が説明する。
Stephane Epardaud: Quarkus DEV Modeには、簡潔できれいに色分けされたログ、継続的テストのレポートやコマンドなど、たくさんの優れた機能がコンソールから提供されます。ですが、すべての情報をコンソールに表示することはできません。開発者に有益な情報のすべてをグラフィカルに表示する手段として、DEV UIが用意されています。http://localhost:8080/q/devを参照すれば、実行中のQuarkusアプリケーションにインストールされたすべてのエクステンションが、グラフィカルなリストに表示されます。それぞれのエクステンションには、ドキュメントやエクステンション特有のページへのリンクがあり、RESTエンドポイントをテストするためのSwagger UI、既存のRESTエンドポイントとそのパフォーマンススコアを一覧表示するGraphQL UI、インストール済CDI beansのリスト、そしてもちろん、継続的テストUI用といったものが、グラフィック形式で表示されます。エクステンションの多くが、Quarkusアプリケーション開発を支援するDEV UIをサポートしています。さらに、リリース毎に新たなカスタムDVI UIのページやアクションが追加されるので、ぜひチェックしてください。
その他の重要な変更のひとつとして、SmallRyeコンポーネントのアップデートがある。これについては、プリンシパル・ソフトウェアエンジニアのRoberto Cortez氏が説明してくれた。
Roberto Cortez: SmallRyeは、MicroProfileを含む、クラウド開発のためのAPIと実装を提供します。ユーザの多くは気付いていませんが、Quarkusプラットフォームの多くの機能において、SmallRyeは重要な役割を果たしています。例えば、コンフィギュレーションに関するものはすべて、SmallRye Configが提供しています。コンフィギュレーションでは、コンフィギュレーション値を、
@ConfigMapping
アノテーションを使ったスタティックなタイプセーフオブジェクトにマッピングする方法を採用しています。現在は、SmallRye APIをよりリアクティブに対応できるように開発を進めています。Kubernetesが求める状態確認エンドポイントが非ブロッキングであることと、リアクティブなメソッドにはフォールトトレランスアノテーションを使用できることがその理由です。SmallRye Reactive Messagingのことも忘れてはなりません。新たなVert.x 4.0APIとSmallRye Munityを活用することで、イベント駆動型リアクティブプログラミングモデルを改善しています。その他の領域では、OpenTelemetryのサポートを新たに加えて、トレースや監視に関するニーズに応えると同時に、Quarkusエコシステムの他部分とのシームレスな統合を実現しています。
SmallRye GraphQLも大きく改善された領域のひとつです。Quarkus 2.0には、特にGraphQLクライアントを対象とした新たなエクステンションが含まれていて、クエリの容易な実行やリモートGraphQLサービスに必要な機能を提供します。クライアントは、型安全(typesafe)と動的(dynamic)という2つのタイプが用意されていて、ユースケースに応じた選択が可能です。型安全タイプのクライアントはモデルクラスと直接的に連携するので、MicroProfile RESTクライアントに似ていますが、GraphQL用であるという点が異なります。もう一方の動的タイプのクライアントはもう少し抽象的に動作するもので、使用中のデータはJSONオブジェクトとして表現されて、GraphQLクエリは特別なドメイン特有言語を使って構築されます。クライアントサイド、サーバサイド両方のGraphQLエクステンションもGraphQLサブスクリプションとして提供されるので、クライアントはサーバからのイベントをリアルタイムで受信することができます。これにより、リアクティブプログラミング機能が大幅に拡張されます。
もうひとつの重要かつニッチな変更は、RESTeasy Reactive、REST Client、Reactive Messagingといったエクステンションによる、Kotlinコルーチンのサポートだ。これについては、プリンシパル・ソフトウェアエンジニアのJustin Lee氏が説明してくれた。
Justin Lee: Quarkusは最初のリリースからKotlinをサポートしていますが、大きな機能がひとつ欠けていました — Kotlinコルーチンです。先日GraalVMネイティブイメージが拡張されたことと、私たちのリアクティブをサポートするエクステンションセットが改善されたことによって、コルーチンのサポートが実現しました。メリットは、Java言語を使用する場合に比べて、リアクティブ対応のコードを記述し、メンテナンスする上で、よりシンプルな方法を提供してくれることです。この状況はProject LeydenがJava SDKに含まれるようになれば解決するはずですが、それまでは、Quarkus 2.0でJavaとKotlinを併用して、リアクティブAPIと命令型APIを最適な組み合わせで使うことができます。
さらに、たくさんのバグの修正とKotlinインテグレーションの洗練を行ったことで、devmodeなどのQuarkus機能との連携をより緊密なものにすることができました。
Vert.x 4.0とMicroProfile 4.0への依存関係アップグレードの他にも、注目すべき機能がいくつかある — Hibernate ORM 5.5にアップグレードされたことで、Hibernate ORMエクステンション上でメタデータ・コントリビュータ(metadata contributor)がサポートされるようになった。QuarkusのCDI実装であるArcでCDIデコレータがサポートされた。PanacheによるMongoDB用トランザクションのサポート。新しいAmazon SSMエクステンション。
また、Quarkus 2.0では、最新バージョンであるGraalVM 21.1の使用が推奨されている。
"超音速、超原子Java"を自ら任じるフレームワークのQuarkusは、その人気を急速に拡大しており、2020 Java InfoQ Trends Reportによると、早くもアーリーアダプタ段階への移行を達成している。Quarkus 1.0のリリースから19か月の間に、組み込みの開発モードには状態保持の可能なホットデプロイおよび再デプロイ機能、継続的テスト、CLIが追加された。Snyx JVM Ecosystems Report 2021と2021 JRebel Java Technology Reportの最新レポートによると、Quarkusの市場シェアはそれぞれ11パーセントおよび6パーセントであるということだ。