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が使用されると、さらに良い結果が期待できます。