Javaのフレームワーク「Quarkus」を試してみた


はじめに

アプリケーションをDockerコンテナ上で運用する機会が多くなってきました。
コンテナで運用するにあたり、起動時間は重要になってきます。
Javaを実行する際、JVM上で動かすわけですが、このJVMの起動にはやや時間がかかります。

今回ご紹介するQuarkusは、GraalVMを使いネイティブ用のバイナリを作成することで、高速起動を実現するフレームワークになります。

実行環境

  • MacOS Mojave

前提条件

  • Java 8以上
  • Maven 3.5.3以上

GraalVMのセットアップ

ここからgraalvm-ce-1.0.0-rc13-macos-amd64.tar.gz
(2019/03/12時点)をダウンロードしてください。

解凍し、/Library/Java/JavaVirtualMachinesにフォルダごと置いてください。

GraalVMの環境変数(GRAALVM_HOME)を設定します。

.bash_profile
GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-1.0.0-rc13-macos-amd64/Contents/Home

プロジェクトを作成

$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
    -DprojectGroupId=jp.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

上記のコマンドを実行すると、下図のようなMavenプロジェクトが作成されます。

アプリケーション起動

# 開発モードで起動
$ mvn compile quarkus:dev

開発モードで起動すると、ホットリロードが実現できます。
以下のコマンドで動作確認します。

$ curl http://localhost:8080/hello

ビルド(ネイティブのバイナリ生成)

$ mvn package -Pnative -Dnative-image.docker-build=true
オプション 内容
-Pnative ネイティブで実行可能なバイナリを生成する際に指定する
-Dnative-image.docker-build=true Docker上のOSに合わせたネイティブのバイナリを生成する場合に指定する

今回はDocker上で起動したいので、-Dnative-image.docker-build=trueも指定します。

ビルドにはネイティブバイナリの生成を行うためか、多少時間がかかります。

Dockerビルド

$ docker build -f src/main/docker/Dockerfile -t <イメージ名> .

Dockerコンテナ起動

$ docker run -i --rm -p 8080:8080 <イメージ名>
2019-03-12 01:29:01,328 INFO  [io.quarkus] (main) Quarkus 0.11.0 started in 0.004s. Listening on: http://0.0.0.0:8080
2019-03-12 01:29:01,328 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

ここで注目して欲しいのは、起動時間です。
起動後のログを確認すると、Quarkus 0.11.0 started in 0.004sとあります。
つまり、0.004秒で起動されたことがわかります。早いですね。

おわりに

Quarkusを利用することで、コンテナ上のアプリケーションの起動が圧倒的に早くなりました。
Quarkus自体、出たばかりなので、本番での実用は難しいとは思いますが、開発が進み情報が増えてくれば、実用可能になる機会は増えてくると思います。今後に期待しています。

あと、Quarkusには拡張機能も追加できます。
例えば、デフォルトだとJavaEE標準のCDIですが、これをSpringベースのCDIが利用できたりします。
ここら辺も調査していきつつ情報を共有していきます。

参考