このエントリは以下のエントリをベースにしています。
This entry is based on the one by Jason Greene (Quarkus Co-Founder, Distinguished Engineer and Manager, Red Hat).
https://developers.redhat.com/blog/2019/03/07/quarkus-next-generation-kubernetes-native-java-framework/
オープンソースコミュニティにJavaが現れて20年以上が過ぎましたが、いまなお開発者の間では非常に人気があります。事実、TIOBEインデックスの2位を下回ることは一度もありません。Javaは90年代半ばに生まれ、(仮想化)ホストのCPUとメモリの単独所有を前提とした、非常に動的なモノリシックアプリケーションを実行するため、約20年間にわたって最適化されてきました。しかし、私たちは現在、クラウド、モバイル、IoT、そしてオープンソースによって支配される世界にいます。そこでは、コンテナ、Kubernetes、マイクロサービス、リアクティブ、FaaS、12-factor、そしてクラウドネイティブのアプリケーション開発により、より高いレベルの生産性と効率性をもたらすことができます。業界として、これらの新しいデプロイメント環境とアプリケーションアーキテクチャに対処するためにJavaをどのように利用するのが最もよいかを再考する必要があります。
TIOBE Index for March 2019
https://www.tiobe.com/tiobe-index/
12 factor
https://12factor.net/
そこで、Quarkus — Supersonic Subatomic Javaをご紹介したいと思います。
QuarkusとはGraalVMとHotSpot用に設計されたKubernetes Native Java Frameworkで、最善のJavaライブラリと標準から作られています。Quarkusの目標は、JavaをKubernetesおよびサーバーレス環境の主要なプラットフォームにすると同時に、幅広い分散アプリケーションアーキテクチャに最適に対処するための統一された反応的で命令的なプログラミングモデルを開発者に提供することです。
Container First
Quarkusを使うと実行時間を大幅に短縮できます(Red Hatによるテストに基づきます)。具体的には以下の機能を提供します。
./my-native-java-rest-app
Quarkus started in 0.008s
- Fast Startup(数十ミリ秒)により、コンテナおよびKubernetes上のマイクロサービスの自動スケールアップ・ダウンおよびFaaSの即時実行ができる
- メモリ使用率が低いため、複数のコンテナを必要とするマイクロサービスアーキテクチャの展開でコンテナ密度を最適化できる
- アプリケーションとコンテナイメージのフットプリントをさらに小さくできる
Unifies Imperative and Reactive
ほとんどのJava開発者は命令型プログラミングモデルに精通しているので、新しいプラットフォームを採用するときにはその経験を利用したいと考えています。と同時に、開発者はビジネス要件に対処するためにクラウドネイティブ、イベント駆動、非同期、およびリアクティブモデルを急速に採用しており、高度な並行処理でレスポンシブなアプリケーションを構築しています。Quarkusは、2つのモデルを同じプラットフォームにシームレスに統合して、組織内で強力に活用できるように設計されています。
Developer Joy
開発者の喜びのために最適化されたまとまりのあるプラットフォームを提供します。
$ mvn package -Pnative
# or
$gradle quarkus-native
- すべての設定は単一のプロパティファイルにまとめて管理します
- 構成不要で、瞬く間にライブでリロードします
- 80%の一般的な使用法向けにコードを合理化し、残りの20%のための柔軟性をもたらします
- ネイティブ実行可能ファイルの生成で面倒なことをする必要はありません
Best of Breed Libraries and Standards
Quarkusは、お好みかつ標準的なバックボーンで使う最適なライブラリを活用する、まとまりのある、使いやすい、フルスタックのフレームワークです。ここでバックボーンとはEclipse MicroProfile、JPA/Hibernate、JAX-RS/Hibernete、Eclipse Vert.x、Nettyなどのことです。
Quarkusには、サードパーティのフレームワークの作者が自身のフレームワークを拡張するために活用できる拡張フレームワークも含まれています。Quarkus拡張フレームワークは、サードパーティ製フレームワークをQuarkus上で実行し、GraalVMネイティブバイナリにコンパイルするための複雑さを軽減します。
Summary
上記のことを念頭において設計されているため、Quarkusはサーバーレス、マイクロサービス、コンテナ、Kubernetes、FaaS、およびクラウドというこの新しい世界におけるJava実行のための効果的なソリューションたり得るでしょう。クラウドネイティブのJavaアプリケーションに対するそのcontainer-firstアプローチは、マイクロサービス開発のための命令型および理アクティブ・プログラミングパラダイムを統合し、Javaを使った開発に革命をもたらすことを約束する拡張可能な標準ベースのエンタープライズJavaライブラリおよびフレームワークのセットを提供します。
Quarkusオープンソースコミュニティへのご参加をお待ちしております。Quarkusの改良、サードパーティ製の拡張機能の開発、Quarkusを使用したアプリケーションの開発を継続して支援したいと思ってらっしゃる場合、またはご興味がある場合は、以下のURLからどうぞ。
- Quarkus
http://quarkus.io - Quarkus GitHub project
https://github.com/quarkusio/quarkus - Quarkus Twitter
https://twitter.com/QuarkusIO - Quarkus chat
https://quarkusio.zulipchat.com/
ということで、Getting Start Guideに従ってちょっとさわってみました。このQuick Startで必要なものは、GraalVM、Mavenです。IDEも必要と書いてありますが、なくてもOKです。GraalVMを使う時点で、Java 8を前提にしていますが、今後Java 11以後の機能が使えるように機能追加されていくことでしょう。
QUARKUS — CREATING YOUR FIRST APPLICATION
https://quarkus.io/guides/getting-started-guide
Mavenでプロジェクトを生成してプロジェクト内を見ると、GreetingResource.javaという、見慣れたJAX-RSのコードが見つかりますが、以下の注記にある通り、Applicationクラスを作成するコードがありません。
With Quarkus there is no need to create an
Application
class. It’s supported but not required. In addition, only one instance of the resource is created and not one per request. You can configure this using the different*Scoped
annotations (ApplicationScoped
,RequestScoped
, etc).
その他特に詰まるところはないと思います。「必要なコードだけ書けばよい」というのはありがたいことです。
Native Imageを作るチュートリアルもありますが、native-imageコマンドでごにょごにょする部分もMavenにお任せです。
QUARKUS — BUILDING A NATIVE IMAGE
https://quarkus.io/guides/building-native-image-guide.html
macOSの環境では、チュートリアルのアプリケーションのexecutable jarファイルは36KB程度ですが、Nativeイメージのサイズは19MB超…。
Dockerfileはプロジェクト生成時に自動作成されており、Native ImageをDockerイメージにパッケージングすることもできます。
普通にDockerイメージを作成すると125MBになってしまうのですが、もっとサイズを小さくするためのdistrolessバージョンなるものがあるようです。
Distroless base image
https://github.com/quarkusio/quarkus/tree/master/docker/distroless
Dockerfileを書き換えて、 docker build
した際のイメージは、37.2MBになりました。環境に依存しますが、当方の環境では起動時間は下図のような感じです。
