はじめに
アプリケーションを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)を設定します。
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が利用できたりします。
ここら辺も調査していきつつ情報を共有していきます。