速度比較を使用したSpringNativeおよびLibericaツールを使用したネイティブイメージの構築
1. 概要
マイクロサービスアーキテクチャの人気が高まるにつれ、巨大なモノリシックアプリケーションは過去のものになりつつあります。 Javaは停滞しているわけではなく、代わりに現代のニーズに適応しています。 たとえば、Oracle、Red Hat、BellSoft、およびその他の貢献者は、GraalVMプロジェクトを積極的に開発しています。 さらに、マイクロサービス固有のフレームワークQuarkusが1年前にリリースされました。 Spring Bootに関する限り、VMwareはSpringNativeプロジェクトに2年間取り組んできました。
その結果、VMwareとBellSoftのコラボレーションのおかげで、Spring Nativeは、GraalVMソースコードに基づくツールである Liberica Native ImageKitを含むエンドツーエンドのネイティブイメージソリューションになりました。 SpringNativeとLibericaNIKを使用すると、開発者は、リソース消費を最適化し、起動時間を最小限に抑えるSpringBootアプリケーションのネイティブ実行可能ファイルを作成できます。
このチュートリアルでは、同じアプリを3つの方法でビルドして実行することにより、SpringBootアプリケーションでネイティブイメージテクノロジーを使用する方法を説明します。 LibericaJDKおよびSpringNativeを使用したネイティブイメージコンテナとして。 Liberica NativeImageKitを使用したネイティブイメージとして。 次に、それらの起動速度を比較します。 いずれの場合も、例としてSpringネイティブプロジェクトの petclinicJDBCアプリケーションを使用します。
2. LibericaJDKのインストール
まず、システムにJavaランタイムをインストールしましょう。 Liberica JDKダウンロードページにアクセスして、プラットフォームのバージョンを選択できます。 x86 LinuxStandardJDKパッケージであるJDK11を使用してみましょう。
LibericaJDKをインストールするには2つの方法があります。 1つは、パッケージマネージャーを使用するか、 .tar.gzパッケージ(またはWindowsの場合は。 zip パッケージ)をダウンロードすることです。
後者はより高度な方法ですが、心配しないでください。必要な手順は4つだけです。 まず、インストールするディレクトリに移動する必要があります。
cd directory_path_name
ディレクトリを離れることなく、次を実行できます。
wget https://download.bell-sw.com/java/11.0.14.1+1/bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz
wget コマンドがない場合は、brew install wget (LinuxおよびMacの場合)を使用してインストールできます。
このようにして、ランタイムを現在のディレクトリに解凍します。
tar -zxvf bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz
インストールが完了したら、ディスク容量を節約したい場合は、.tar.gzファイルを削除できます。
最後に、Liberica JDKディレクトリをポイントして、JAVA_HOME変数を設定する必要があります。
export JAVA_HOME=$(pwd)/jdk-11.0.14.1
注意:macOSおよびWindowsユーザーは、LibericaJDKインストールガイドを参照して手順を確認できます。
3. SpringNativeプロジェクトの取得
次のコマンドを実行して、petclinicアプリのサンプルを含むSpringNativeプロジェクトを取得できます。
git clone https://github.com/spring-projects-experimental/spring-native.git
4. JARファイルの作成
Spring Nativeプロジェクト全体から1つのサンプルを処理したいので、次のコマンドを実行して、springpetclinicJDBCのあるディレクトリに移動します。
export PROJECT_DIR=$(pwd)/spring-native/samples/petclinic-jdbc && cd $PROJECT_DIR
JARファイルを作成するには、次のコマンドを適用できます。
./mvnw clean install
これにより、24 MB target /petclinic-jdbc-0.0.1-SNAPSHOT.jarが取得されます。 次のコマンドを実行してテストします。
java -jar target/petclinic-jdbc-0.0.1-SNAPSHOT.jar
5. LibericaJDKを使用してネイティブイメージコンテナを構築する
それでは、アプリをコンテナ化しましょう。
Dockerデーモンが実行されていることを確認してください。 WindowsまたはmacOSx86を使用する場合は、少なくとも8GBのメモリをDockerに割り当てる必要があることに注意してください。 Spring petclinic JDBCアプリケーションディレクトリから、次のコマンドを入力する必要があります。
./mvnw spring-boot:build-image
これにより、起動可能なSpringBootを使用してネイティブイメージコンテナが構築されます。
docker run -it docker.io/library/petclinic-jdbc:0.0.1-SNAPSHOT
Apple M1を使用している場合、Dockerに必要なビルドパックがないため、この手順は使用できません。 ただし、最新バージョンのLiberica Native ImageKitはAppleSiliconと完全に互換性があるため、次のステップに進み、NIKを使用してネイティブイメージを構築できます。
6. LibericaNIKを使用してネイティブイメージを構築する
リベリカネイティブイメージキットを使用して、ペトクリニックネイティブイメージの別のバージョンを作成します。 以下に、Linux用のNIKをインストールするための手順を示します。 macOSまたはWindowsの場合は、LibericaNIKインストールガイドを参照してください。
まず、インストールするディレクトリに移動する必要があります。
cd directory_path_name
次に、プラットフォーム用のLiberica NIKCoreをダウンロードします。 これには、追加の言語を含まないLiberica VMおよびGraalVMベースのネイティブイメージツールキットが含まれているため、Javaネイティブイメージを構築するための優れたツールです。
この例では、Linux用のJava11用のNIKのバージョンを取得します。
wget https://download.bell-sw.com/vm/22.0.0.2/bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz
次に、次のコマンドを実行してファイルを解凍します。
tar -xzf bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz
Liberica NIKをポイントして、$JAVA_HOME変数を定義します。
export JAVA_HOME=$(pwd)/bellsoft-liberica-vm-openjdk11-22.0.0.2
次に、petclinicJDBCアプリケーションディレクトリに移動します。
cd $PROJECT_DIR
また、次のコマンドを実行してネイティブイメージを作成できます。
./mvnw -Pnative install
これには、ビルドの「ネイティブ」プロファイルが含まれ、サイズが102.3MBのtarget /petclinic-jdbcバイナリファイルになります。
7. 起動時間を比較する
それでは、アプリケーションと画像の速度をテストしてみましょう。 それらを実行するために、SSDを搭載したIntel(R)Core(TM)i7-8750HCPUPCを使用しました。
- JARファイルは約3.3秒で開始します
- 私たちが構築した最初のコンテナは約0.07秒で始まります
- NIKCoreで作成されたネイティブイメージは0.068秒で開始されます。
8. 結論
Springネイティブイメージは、プロジェクトがまだベータ版である場合でもビルドされ、うまく機能します。 起動時間の大幅な短縮。
Spring Nativeがリリースされ、ネイティブイメージを構築するためのエンドツーエンドソリューションとしてLiberica Native Image Kitが使用されると、さらに良い結果が期待できます。