Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介
Docker 環境上で Java のアプリを起動するのは遅いと思っていらっしゃる方は必見!!
どうぞ下記の内容をご参照いただき、どうぞお試しください!!
先日、Red Hat から Quarkus (https://quarkus.io) という新しい技術が発表されました。こちらを実際に試して見ましたが、想定通りというか、まさにこれを待っていた!!という技術でした。今後、私の中で注目の技術の一つになりそうです。もし、Docker/k8s 上で Java アプリを動かす方は、こちらの方法をご覧いただき、ぜひ試しください。
Quarkus を簡単にご説明すると、Java のソースコードを GraalVM を利用して Linux の Native バイナリを作成し、その Linux バイナリをコンテナ上で起動することにより、今まで Java アプリの課題であった起動時間を大幅に短縮することができる技術です。 |
※ GraalVM については、きしださんや Java Champion である阪田さんがまとめてくださっていますので、ここではその詳細説明を割愛させていただきます。
* GraalVMについて (きしださん)
* 詳説GraalVM(1) イントロダクション(阪田さん)
事前準備
- GraalVM の入手 (https://github.com/oracle/graal)
- JDK 8 以上の入手
- Maven/Gradle の入手
GraalVM を入手したのち、.bash_profile などに環境変数 GRAALVM_HOME を指定しておきます。
GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-1.0.0-rc13/Contents/Home export GRAALVM_HOME
それでは、実際に試して見ましょう。
1. Quarkus のクィック・スタートに従い Java のプロジェクトを作成します
$ mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=getting-started \ -DclassName="org.acme.quickstart.GreetingResource" \ -Dpath="/hello"
プロジェクトを作成すると下記のようなファイルが作成されます。
├── pom.xml └── src ├── main │ ├── docker │ │ └── Dockerfile │ ├── java │ │ └── org │ │ └── acme │ │ └── quickstart │ │ └── GreetingResource.java │ └── resources │ └── META-INF │ ├── microprofile-config.properties │ └── resources │ └── index.html └── test └── java └── org └── acme └── quickstart ├── GreetingResourceTest.java └── NativeGreetingResourceIT.java
2. Java のソースコードをビルドし Linux の Native バイナリを作成します
$ mvn package -Pnative -Dnative-image.docker-build=true
-Dnative-image.docker-build=true は Docker on Linux 上で実行するバイナリを生成する事を明示するオプションです。これを指定しない場合、ビルドをした環境(例えば Mac OS/X なら Mac )用のバイナリが生成されます。
2.1 作成された Linux 用のバイナリを確認します
target ディレクトリ配下に成果物ができあがります。
$ ls -l target/getting-started-1.0-SNAPSHOT-runner -rwxr-xr-x 1 yoterada staff 20112760 3 11 13:52 getting-started-1.0-SNAPSHOT-runner
2.2 file コマンドでファイル内容を確認すると Linux ELF バイナリが作成されています
$ file getting-started-1.0-SNAPSHOT-runner getting-started-1.0-SNAPSHOT-runner: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=61ef9e78267993b688b9cf2de04e2aff9f1a4bfa, with debug_info, not stripped
3. Docker のビルド
Dockerfile のサンプルも下記の Dockerfile が自動的に作成されていますので、こちらをそのまま利用してビルドを行います。
17行目の COPY でビルド時に生成された Linux ELF バイナリを追加しています。
自動生成された Dockerfile
#### # Before building the docker image run: # # mvn package -Pnative -Dnative-image.docker-build=true # # Then, build the image with: # # docker build -f src/main/docker/Dockerfile -t quarkus/getting-started . # # Then run the container using: # # docker run -i --rm -p 8080:8080 quarkus/getting-started # ### FROM registry.fedoraproject.org/fedora-minimal WORKDIR /work/ COPY target/*-runner /work/application RUN chmod 775 /work EXPOSE 8080 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
Dockerfile からコンテナ・イメージをビルドしてください。
$ docker build -f src/main/docker/Dockerfile -t tyoshi2002/quarkus-quickstart:1.0 .
4. Docker の起動
作成したコンテナ・イメージを利用してコンテナを起動します。
$ docker run -i --rm -p 8080:8080 tyoshi2002/quarkus-quickstart:1.0 2019-03-11 05:10:42,697 INFO [io.quarkus] (main) Quarkus 0.11.0 started in 0.005s. Listening on: http://0.0.0.0:8080 2019-03-11 05:10:42,699 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]
私の環境では 0.005 秒で CDI+REST アプリが起動できました。
Quarkus 0.11.0 started in 0.005s. Listening on: http://0.0.0.0:8080
5. 動作確認
curl コマンド、もしくはブラウザを利用して起動したアプリケーションにアクセスします。
$ curl http://localhost:8080/hello hello
6. 備考
Quarkus は開発モード(Development Mode)も用意されており、開発時にホット・デプロイもできるようになっています。
ホット・デプロイを行うためには、下記のコマンドを実行します。
$ mvn compile quarkus:dev
こちらで起動したのち、ソースコードを修正しコンテンツを再読み込みします。
すると、再起動は不要で修正されたコードの内容を確認することができます。
7. 注意事項
Quarkus で内部的に利用されている CDI の実装 (ArC と呼ぶ) は、CDI の仕様に完全準拠しているのではなく、一部の仕様を実装したサブ・セットの実装になっています。下記にそれぞれ CDI におけるサポート、未サポートの機能についての機能一覧が説明されていますので、こちらをどうぞご確認ください。
CDI でサポートされている機能一覧
CDI で未サポートの機能一覧
8. Extension
Quarkus のアプリケーションに対して、追加のエクステンションを追加できます。追加可能なエクステンションのリストは下記から参照できます。
$ mvn quarkus:list-extensions Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ----------------------< org.acme:getting-started >---------------------- [INFO] Building getting-started 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- quarkus-maven-plugin:0.11.0:list-extensions (default-cli) @ getting-started --- [INFO] Available extensions: [INFO] * Agroal - Database connection pool (io.quarkus:quarkus-agroal) [INFO] * Arc (io.quarkus:quarkus-arc) [INFO] * AWS Lambda (io.quarkus:quarkus-amazon-lambda) [INFO] * Camel Core (io.quarkus:quarkus-camel-core) [INFO] * Camel Infinispan (io.quarkus:quarkus-camel-infinispan) [INFO] * Camel Netty4 HTTP (io.quarkus:quarkus-camel-netty4-http) [INFO] * Camel Salesforce (io.quarkus:quarkus-camel-salesforce) [INFO] * Eclipse Vert.x (io.quarkus:quarkus-vertx) [INFO] * Hibernate ORM (io.quarkus:quarkus-hibernate-orm) [INFO] * Hibernate ORM with Panache (io.quarkus:quarkus-hibernate-orm-panache) [INFO] * Hibernate Validator (io.quarkus:quarkus-hibernate-validator) [INFO] * Infinispan Client (io.quarkus:quarkus-infinispan-client) [INFO] * JDBC Driver - H2 (io.quarkus:quarkus-jdbc-h2) [INFO] * JDBC Driver - MariaDB (io.quarkus:quarkus-jdbc-mariadb) [INFO] * JDBC Driver - PostgreSQL (io.quarkus:quarkus-jdbc-postgresql) [INFO] * Kotlin (io.quarkus:quarkus-kotlin) [INFO] * Narayana JTA - Transaction manager (io.quarkus:quarkus-narayana-jta) [INFO] * RESTEasy (io.quarkus:quarkus-resteasy) [INFO] * RESTEasy - JSON-B (io.quarkus:quarkus-resteasy-jsonb) [INFO] * Scheduler (io.quarkus:quarkus-scheduler) [INFO] * Security (io.quarkus:quarkus-elytron-security) [INFO] * SmallRye Fault Tolerance (io.quarkus:quarkus-smallrye-fault-tolerance) [INFO] * SmallRye Health (io.quarkus:quarkus-smallrye-health) [INFO] * SmallRye JWT (io.quarkus:quarkus-smallrye-jwt) [INFO] * SmallRye Metrics (io.quarkus:quarkus-smallrye-metrics) [INFO] * SmallRye OpenAPI (io.quarkus:quarkus-smallrye-openapi) [INFO] * SmallRye OpenTracing (io.quarkus:quarkus-smallrye-opentracing) [INFO] * SmallRye Reactive Messaging (io.quarkus:quarkus-smallrye-reactive-messaging) [INFO] * SmallRye Reactive Messaging - Kafka Connector (io.quarkus:quarkus-smallrye-reactive-messaging-kafka) [INFO] * SmallRye Reactive Streams Operators (io.quarkus:quarkus-smallrye-reactive-streams-operators) [INFO] * SmallRye Reactive Type Converters (io.quarkus:quarkus-smallrye-reactive-type-converters) [INFO] * SmallRye REST Client (io.quarkus:quarkus-smallrye-rest-client) [INFO] * Spring DI compatibility layer (io.quarkus:quarkus-spring-di) [INFO] * Undertow (io.quarkus:quarkus-undertow) [INFO] * Undertow WebSockets (io.quarkus:quarkus-undertow-websockets) [INFO] Add an extension to your project by adding the dependency to your project or use `mvn quarkus:add-extension -Dextensions="name"` [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.696 s [INFO] Finished at: 2019-03-11T19:45:32+09:00 [INFO] ------------------------------------------------------------------------
上記のリストを元に、追加するエクステンションの groupId と artifactId を指定し追加ができます。
$ mvn quarkus:add-extension -Dextensions="groupId:artifactId"
例:
$ mvn quarkus:add-extension -Dextensions="io.quarkus:quarkus-smallrye-health"
9. さいごに
Quarkus は他に、CompletionStage を利用した非同期処理の実装や、JUnit のテストも REST Assured を利用して非常に書きやすくなっており、全体的にとても良くできた技術だと感じています。
ご興味ある方はぜひ、お試しください!
その他の Java on Azure に関する日本語情報へのリンク
Entry filed under: Java.
1.
Azure Update (2019.03.14) | ブチザッキ | 2019年3月14日 5:24 午前
[…] Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介 […]