5917 words
30 minutes
Nacos Native Image

Language: English | 简体中文 | 繁體中文 | 日本語

NacosにGraalVMが必要な理由は何ですか?#

Nacos(公式サイト:nacos.io)は、動的なサービス検出と構成管理、サービス管理を簡単に行えるプラットフォームです。クラウドネイティブアプリケーションやマイクロサービスプラットフォームの構築を容易にします。

GraalVM Native Image は、 Java の JDK 17 から導入された新機能で、Java コードをバイナリファイル(ネイティブ実行可能ファイル)に事前コンパイルすることが可能です。ネイティブ実行可能ファイルは、実行時に必要なコード(アプリケーションクラス、標準ライブラリクラス、ランタイム、JDKの静的リンクネイティブコード)のみを含むため、Javaアプリケーションの起動と実行効率が向上します。

Java ネイティブイメージ実行をサポートする Spring Boot 3 の成熟と普及により、ネイティブイメージ形式でのアプリケーションのリリースが増加しています。Nacos コミュニティでも、 Nacos が Native Image 実行をサポートすることへの需要が高まっており、例として #9997#11402 などがあります。

そのため、 Nacos コミュニティは、 Nacos の Java クライアントとサーバーの両方でネイティブイメージをサポートし、 Nacos の起動速度を向上させ、コミュニティのニーズに応えながら、より効率的に実行できるようにすることを目指しています。

マイクロサービスの概要#

技術ソリューションの評価#

Nacos は複数のモジュールと複雑な依存関係を持っているため、依存関係の分析には mvn dependency:tree の使用が不可欠です。テストモジュールやテストスコープの依存関係を結果から除外することで、 Spring と GraalVM のコードアップグレードが必要なモジュールを迅速に特定できます。

Spring Boot 3.0 からは、 Spring Boot は GraalVM Native Image に対する公式サポートを提供しており、 spring-native 依存は不要となりました。Spring Boot 3.x には GraalVM Native Image の組み込みサポートが含まれており、自動構成と最適化が行われるため、 Spring Boot アプリケーションはネイティブバイナリファイルに容易にコンパイルできます。

Nacos モジュールの Spring Boot 依存バージョンを 2.7.18 から 3.3.1 にアップグレードする目的は、 GraalVM Native Image アプリケーションとしてプロジェクトをパッケージおよびコンパイルするサポートを強化するだけでなく、次の主要バージョンの Spring に対応し続けるためでもあります。

Spring Boot 3アップグレードプロセスの詳細#

Nacos モジュール全体で Spring Boot 依存バージョンをアップグレードすることは、依存関係管理、コード移行、テスト、検証を含む複雑なプロセスです。事前のバージョン更新調査では、以下の依存関係の最終バージョンを一緒にアップグレードする必要があることが確認されています。

アーカイブ以前のバージョン次のバージョン説明
java1.817Minimum compatible Java version
spring-boot-dependencies2.7.183.3.1Dependencies related to SpringBoot
servlet-api3.06.1.0Dependencies related to Servlet
spring5.3.346.1.10Dependencies related to Spring
spring-security5.7.126.3.1Dependencies related to Spring Security
apache-http-components4.1.55.3.1Dependencies related to Apache HTTP Components
micrometer1.9.171.13.1Dependencies related to Micrometer
maven-pmd-plugin3.83.15.0Dependencies related to PMD
p3c-pmd1.3.02.1.1Dependencies related to P3C
maven-shade-plugin3.2.43.6.0Dependencies related to Maven Shade
grpc-java1.57.21.65.1Dependencies related to grpc
grpc-util-1.65.1Detach from grpc
grpc-inprocess-1.65.1Detach from grpc
findbugs-maven-plugin3.0.4-No longer support for jdk 17
soptbugs-maven-plugin-4.8.6.2Support JDK 17

完了した依存関係グラフに基づき、 Spring 関連の依存関係をさらに明確化し、それらの階層関係を決定し、将来の更新の順序を確立できます。

SpringBoot Upgrade Order

GraalVM適応の詳細#

Java 仮想マシンと比較して、 Native Image はマイクロサービス、クラウド関数、コンテナ、 Kubernetes など、さまざまなワークロードに効率的で持続可能なホスティングを提供できます。GraalVM Native Image を使用することで、 Nacos をバイナリ実行可能ファイルとしてパッケージ化でき、起動および実行パフォーマンスの大幅な向上が期待できます。

Native Image には複数の実装技術があり、それぞれに利点と制限があります。比較と評価の結果、 Nacos の Native Image 起動モードをサポートする最適な選択肢として GraalVM が選ばれました。

  • GraalVM:マルチランゲージサポートを提供する高性能ランタイムで、 Java アプリケーションをネイティブ実行可能ファイルにコンパイルできます。効率的なネイティブコンパイル、既存の Java ツールやフレームワークとの互換性、強力なコミュニティとドキュメントサポートを備えています。
  • Excelsior JET:商用の Java SE ランタイム環境および最適化コンパイラで、 Java アプリケーションをネイティブコードにコンパイルします。AOT コンパイルにより起動時間を短縮し、セキュリティとコード保護を強化し、複数のプラットフォームおよびオペレーティングシステムに対応しています。
  • Avian:組み込みデバイスや小規模システム向けに設計された軽量 Java 仮想マシンで、 Java アプリケーションをネイティブコードにコンパイルします。軽量でリソース制約のあるデバイスに適しており、 AOT コンパイルに対応し、オープンソースプロジェクトとして柔軟なカスタマイズが可能です。
  • LLVM/Clang:主に C/C++ のコンパイルに使用されますが、他の言語にも対応しています。Java バイトコードを LLVM IR にコンパイルすることで、ネイティブコードを生成できます。強力な最適化とコード生成機能を備え、複数の言語に対応し、豊富なエコシステムとツールチェーンサポートがあります。

私たちの目標は、 nacos-client および nacos-console の両方で Native Image 起動モードをサポートし、最終的には上位の依存関係(例:nacos-spring-contextnacos-spring-context-aopnacos-spring-samplesspring-cloud-starter-alibaba-nacos-config など)が Native Image でスムーズにパッケージおよび実行できるようにすることです。Nacos リポジトリで現在の GraalVM Native Image 関連の問題は以下の通りです:

  1. ISSUE#9997 Nacos クライアントの Spring Native サポート: https://github.com/alibaba/nacos/issues/9997
  2. ISSUE#11402 ネイティブ Docker イメージのサポート: https://github.com/alibaba/nacos/issues/11402
  3. ISSUE#11790 クラス com.alibaba.nacos.common.remote.client.RpcClientTlsConfig のシリアライザーが見つからない(native-image 実行に失敗): https://github.com/alibaba/nacos/issues/11790
  4. ISSUE#11853 nacos-client の GraalVM サポート: https://github.com/alibaba/nacos/issues/11853
  5. ISSUE#11860 reflect-config.json の更新: https://github.com/alibaba/nacos/pull/11860
  6. ISSUE#11861 [GraalVM] Spring Boot Maven Plugin で生成されるヒントファイルに警告情報が表示される: https://github.com/alibaba/nacos/issues/11861
  7. ISSUE#11902 GraalVM 到達可能性メタデータの欠落: https://github.com/alibaba/nacos/issues/11902
  8. ISSUE#12028 [2024年夏] Java ネイティブイメージランタイムモードをサポートする Nacos: https://github.com/alibaba/nacos/issues/12028

これまでに、 Nacos クライアントでの Native Image 起動に向けた一部のリフレクションメタデータサンプリング作業が完了しており(例えば ISSUE#11860 のマージ)、進展が見られますが、 nacos-console への対応や、 Spring Boot 3 がもたらす新たなNative技術の問題はまだ解決されていません。これらの問題は、今後の作業で解決される予定です。

GraalVM Upgrade Order

パフォーマンスレポート#

NOTE

このパフォーマンスレポートでは、 Native および Java プラットフォームのすべての機能のメモリ使用量の違いは、起動時に観測されたメモリとスレッド数の違いと比較可能です。そのため、実行時のメモリ使用量とスレッド数は追跡されていません。

スタンドアロンモード#

ロードテスト環境:

  • OS:10 コア、6GB RAM、macOS aarch64、Apple Silicon。
  • データベース:ローカルホスト上の MySQL 8.0。
  • Nacos バージョン:Spring Boot 3 を使用した 2.5.0-SNAPSHOT、2.5.0-SNAPSHOT Native。
モジュール機能2.5.0-SNAPSHOT with Spring Boot 32.5.0-SNAPSHOT Nativeパフォーマンス比較
起動時間: 3800ms
CPU: 33.5%
メモリ: 470MB
Threads: 300
時間: 48ms
CPU: 33.1%
メモリ: 190MB
Threads: 298
時間: ↓98.73%
CPU: -
メモリ: ↓59.57%
Threads: -
config設定のクエリCPU: 35.62%
QPS: 12050
CPU: 29.94%
QPS: 12035
CPU: ↓15.95%
設定の公開CPU: 52.41%
QPS: 6733
CPU: 54.69%
QPS: 6784
CPU: ↑4.35%
namingサービスの登録CPU: 25.64%
QPS: 7328
CPU: 29.43%
QPS: 7584
CPU: ↑14.78%
サービスインスタンスのクエリCPU: 33.59%
QPS: 7370
CPU: 27.8%
QPS: 7380
CPU: ↓17.24%

クラスターモード#

ロードテスト環境:

  • クラスター環境:2 コア、4GB RAM、ECS インスタンスタイプ ecs.e-c1m2.large、3 ノードクラスタ。
  • SLB:slb.s2.small。
  • データベース:MySQL.x2.xlarge.2c mysql5.7。
  • Nacosバージョン:Spring Boot 3 を使用した 2.5.0-SNAPSHOT、2.5.0-SNAPSHOT Native。
モジュール機能2.5.0-SNAPSHOT with Spring Boot 32.5.0-SNAPSHOT Nativeパフォーマンス比較
起動時間: 12800ms
CPU: 33.52%
時間: 45ms
CPU: 46%
時間: ↓99.65%
CPU: ↑37.23%
config設定のクエリCPU: 82%
QPS: 9981.96
CPU: 93.3%
QPS: 9980.2
CPU: ↑13.78%
設定の公開CPU: 73%
QPS: 802.18
CPU: 81.6%
QPS: 796.37
CPU: ↑11.78%
namingサービスの登録CPU: 84.6%
TPS: 6986.14
CPU: 83.3%
TPS: 6982.12
CPU: ↓1.53%
サービスインスタンスのクエリCPU: 70.6%
QPS: 8991
CPU: 83%
QPS: 8982
CPU: ↑17.56%
プッシュの変更CPU: 78.3%
TPS: 1197.67
CPU: 95.31%
TPS: 1192
CPU: ↑21.72%

サマリー#

Java Nacos と比較して、 Nacos Native は一般的に約 15% 多くの CPU を消費し、メモリ使用量を約 50% 削減し、スレッド数、TPS、QPS にほとんど違いはありません。また、 Java Nacos よりも起動時間が大幅に短縮されています。

Nacos Nativeのコンパイル方法#

Mavenを使用して手動でビルドする#

複雑な GraalVM 環境を構成したり、欠落している glic 関連ライブラリを埋めたりするのではなく、Nacos Native をすばやく構築したいだけの場合は、 Docker を使用して自動的に構築することを選択する必要があります。 Maven を使用してビルドを開始する前に、ネイティブ オペレーティング システムが GraalVM がコンパイルできる基本環境を満たしていることを確認する必要があります。

  1. オペレーティング システムには Oracle GraalVM JDK 17.0.12+8.1 がインストールされており、環境変数 GRAALVM_HOME および JAVA_HOME が GraalVM ディレクトリを指している必要があります。
  2. オペレーティング システムが MUSL などではなく、完全に GNU ベースであることを確認してください。
  3. Unix タイプのオペレーティング システムに次の基本ライブラリがインストールされていることを確認します: bzip2-devel、ed、gcc、gcc-c++、gcc-gfortran、gzip、file、fontconfig、less、libcurl-devel、make、openssl、openssl -devel、readline-devel、tar、glibc-langpack-en、vi、this、xz-devel、zlib-devel、findutils、glibc-static、libstdc++、libstdc++-devel、libstdc++-static、zlib-staticic。
  4. コンピューターに Maven バージョン 9.0 以降がインストールされていることを確認します。
  5. コンパイルとビルドにかかる時間が長すぎることを望まない場合は、複数のコアとより高い周波数を備えた CPU で変更を実行することをお勧めします。

ここでは、デモ環境として上記の条件を満たす macOS(Apple Silicon) オペレーティングシステムを使用します。リポジトリ git@github.com:alibaba/nacos.git のクローンをローカルに作成し、以下の手順に従って Maven を介して Nacos Native をビルドします。

  1. Nacos ディレクトリに移動し、ブランチ Summer-ospp#12028: git checkout Summer-ospp#12028 に切り替えます。

  2. Maven コマンドを使用して「インストール」します: mvn clean install -DskipTests=true -Pnative -Pnative-osx-arm64 -Prelease-native

    • 別のバージョンのオペレーティング システムまたは環境を使用している場合は、次の表を参照して必要なプロファイルを選択し、ビルドするパラメータの -Pnative-osx-arm64 を置き換えてください。

      OS FamilyArchProfile
      Linuxaarch64native-linux-aarch64
      Linuxppc64lenative-linux-ppc64le
      Linuxs390xnative-linux-s390x
      Linuxx86native-linux32
      Linuxx64native-linux64
      OSXarm64native-osx-arm64
      OSXx86_64native-osx-x86_64
      Windowsx64native-win64
  3. Maven による Nacos ネイティブ イメージの構築が完了するまで待ちます。通常、これには約 10 分かかります (具体的な時間は CPU のパフォーマンスによって異なります)。ビルド プロセス中に例外が発生した場合は、Nacos リポジトリに問題を送信してください。

  4. ビルドが完了すると、関連ファイルが distribution/target フォルダーに保存されます。この実行パッケージを自分でカプセル化する場合は、最終ビルド ファイルに従って console/target フォルダーからコピーしてください。以下のオペレーティング システムに対応する表が出てきます。

    OSRelated Files
    windowsnacos-server, libinstrument.dll
    unixnacos-server, libinstrument.so
    macosnacos-server

Maven が以下のようなログを最後に出力する場合、 Nacos Native が正常にビルドされたことを示しています。

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Alibaba NACOS 2.5.0-SNAPSHOT 2.5.0-SNAPSHOT:
[INFO] 
[INFO] Alibaba NACOS 2.5.0-SNAPSHOT ....................... SUCCESS [02:08 min]
...
[INFO] nacos-console 2.5.0-SNAPSHOT ....................... SUCCESS [06:34 min]
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11:12 min
[INFO] Finished at: 2024-10-30T09:08:11Z
[INFO] ------------------------------------------------------------------------
Build successful.
Copying build artifacts to /opt/output

Docker経由で自動的にビルドする#

Docker を使用して Nacos ネイティブ イメージを構築することは、たとえ CPU のほとんどを使用するとしても、より便利なオプションです。 Oracle GraalVM Native Image ビルド環境標準に従って Docker コンテナの完全なセットを構築しました。コンテナの助けを借りて、肥大化し複雑な GraalVM Unix 環境を個別に構成する必要はなくなりました。また、この Dockerfile をカスタマイズして他のものを選択することもできます。コンパイル用に Nacos Native Git リポジトリを変更します。同時に、このコンテナはビルドされたすべてのプログラムを自動的にパッケージ化し、ビルド結果を取得する指定したディレクトリにマッピングします。すべては自分で決定します。

Docker Hub の公式イメージ (2025 年後半にリリースされる予定) または Nacos Docker リポジトリの標準コードを直接プルして使用できます。また、Dockerfile のソース コードとビルド スクリプトは、あらゆる開発のためにここで直接提供されます。参照:

# 使用方法:
# ビルドイメージ: docker build -f Dockerfile.builder -t nacos-native-builder:latest .
# 実行イメージ: docker run -v /local/output:/opt/output --name nacos-native-builder nacos-native-builder:latest

ARG BASE_IMAGE=container-registry.oracle.com/os/oraclelinux:8-slim

FROM ${BASE_IMAGE}

LABEL maintainer="Moritz Clifford <me@biu.kim>"

ENV PS1="nacos-native-builder>" \
    GRAALVM_HOME="/opt/graalvm-jdk-17.0.12+8.1" \
    JAVA_HOME="/opt/graalvm-jdk-17.0.12+8.1" \
    PATH="/opt/graalvm-jdk-17.0.12+8.1/bin:$PATH"

RUN microdnf update -y oraclelinux-release-el8 \
    && microdnf --enablerepo ol8_codeready_builder install bzip2-devel ed gcc gcc-c++ gcc-gfortran gzip file fontconfig less libcurl-devel make openssl openssl-devel readline-devel tar glibc-langpack-en \
    vi which xz-devel zlib-devel findutils glibc-static libstdc++ libstdc++-devel libstdc++-static zlib-static wget git \
    && microdnf clean all

WORKDIR /opt

# GraalVM のセットアップ
RUN wget https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_linux-x64_bin.tar.gz -O graalvm.tar.gz && \
    mkdir -p /opt && \
    tar -xzf graalvm.tar.gz -C /opt && \
    rm graalvm.tar.gz && \
    ln -s /opt/graalvm-jdk-${GRAALVM_VERSION}/bin/java /usr/bin/java && \
    gu install native-image

# Maven 3.9 のセットアップ
RUN wget https://downloads.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz -O maven.tar.gz && \
    tar -xzf maven.tar.gz -C /opt && \
    rm maven.tar.gz && \
    ln -s /opt/apache-maven-3.9.5/bin/mvn /usr/bin/mvn

RUN git clone https://github.com/alibaba/nacos.git && \
    cd nacos && \
    git checkout summer-ospp#12028

ADD bin/build.sh /opt/build.sh
ADD etc/settings.xml /root/.m2/settings.xml
RUN chmod +x /opt/build.sh

ENTRYPOINT ["sh","/opt/build.sh"]

この Dockerfile では、ターゲット ウェアハウス、Maven 構成、ビルド スクリプト、Docker ボリュームなどを含む任意の構成ファイルを指定できます。理論的には、このコンテナーには任意の GraalVM ネイティブ イメージをビルドする機能がありますが、ここでは依然として Nacos を使用します。ビルド スクリプト (build.sh) のサンプル コード:

#!/bin/bash
set -x

if [ "$(pwd)" != "/opt/nacos" ]; then
  echo "Not in /opt/nacos, switching to /opt/nacos"
  cd /opt/nacos || exit 1
fi

echo "Refreshing Maven and applying settings.xml..."
mvn clean --settings /root/.m2/settings.xml

OUTPUT_DIR="/opt/output"
mkdir -p "$OUTPUT_DIR"
echo "Output directory: $OUTPUT_DIR"

# 更新のために Git ブランチを自動的にプルする
REMOTE_REPO="summer-ospp#12028"
git fetch origin "$REMOTE_REPO"
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/"$REMOTE_REPO")

if [ "$LOCAL" != "$REMOTE" ]; then
  echo "Local branch is behind the remote branch. Pulling latest changes..."
  git pull origin "$REMOTE_REPO"
else
  echo "Local branch is up to date with the remote branch."
fi

# Maven を使用してインストールする
echo "Building nacos native..."
mvn clean install -DskipTests=true -Paliyun-maven -Pnative -Pnative-linux64

# 構築されたファイルをマップされたボリュームにコピーします
if [ $? -eq 0 ]; then
  echo "Build successful."
  if [ -f "/opt/nacos/console/target/nacos-server" ] && [ -f "/opt/nacos/console/target/libinstrument.so" ]; then
    echo "Copying build artifacts to $OUTPUT_DIR"
    cp /opt/nacos/console/target/nacos-server "$OUTPUT_DIR"
    cp /opt/nacos/console/target/nacos-server.debug "$OUTPUT_DIR"
    cp /opt/nacos/console/target/libinstrument.so "$OUTPUT_DIR"
  else
    echo "Build artifacts not found."
  fi
else
  echo "Build failed."
fi

exec /bin/bash

Nacos Nativeを実行してテストする#

ビルドされた Nacos Native プログラムを実行してテストすることは、その後の使用にとって重要なステップです。以下では、最新バージョンの Debian オペレーティングシステム(2C2G 50G)をデモ環境として使用し、 Nacos Native をスタンドアロンモードとクラスターモードで起動する方法を説明します。

現在のところ、 Nacos Native は埋め込み型 Derby データベースモードを完全にサポートできません。そのため、テスト時には、 Nacos が使用できる完全な PostgreSQL または他のデータベース環境が準備されていることを確認する必要があります。

スタンドアロンモード#

Nacos Native スタンドアロンの起動方法は、 Java バージョンとほぼ同じですが、GraalVMがJVMとは異なる動作をするため、一部の JVM 最適化パラメータは使用できません。ただし、 Nacos 固有のパラメータは引き続き効果的に機能します。

Windows では、 nacos-server.exe ファイルをダブルクリックするだけで起動できます。また、 Debian 向けのサンプル bash 起動スクリプトを以下に参考として示します。

#!/bin/bash
set -x

if [ "$(pwd)" != "/opt/nacos" ]; then
  echo "Not in /opt/nacos, switching to /opt/nacos"
  cd /opt/nacos || exit 1
fi

export SERVER="nacos-server"
export BASE_DIR="/opt/nacos"
export NACOS_HOME="${BASE_DIR}/home/"
export APP_DIR="${BASE_DIR}/application"
export LOGS_DIR="${APP_DIR}/logs"
export CUSTOM_DIR="file:${APP_DIR}/custom/"

mkdir -p "${NACOS_HOME}"
mkdir -p "${APP_DIR}/logs"
mkdir -p "${APP_DIR}/custom"

chmod -R +x "${BASE_DIR}"

# アプリケーションオプションを定義する
APP_OPT="${APP_OPT} -Dnacos.standalone=true -Dnacos.home=${NACOS_HOME}"

if [ -f "${APP_DIR}/custom/application.properties" ]; then
  echo "Using custom application.properties."
  APP_OPT="${APP_OPT} --spring.config.additional-location=${CUSTOM_DIR}"
fi

# nohup でアプリケーションを起動する
echo "nacos native is starting. check the ${LOGS_DIR}/start.out"

nohup ./${SERVER} ${APP_OPT} nacos.nacos >> ${LOGS_DIR}/start.out 2>&1 &
NACOS_PID=$!

# Nacos プロセスが完了するまで待ちます
wait $NACOS_PID
EXIT_CODE=$?

# Nacos プロセスがエラーコードで終了した場合は、コンテナを終了します。
if [ $EXIT_CODE -ne 0 ]; then
  echo "Nacos process exited with code $EXIT_CODE, stopping container..."
  exit $EXIT_CODE
fi

Nacos の起動スクリプトで使用されるパラメータについては、 Nacos 公式ウェブサイトのパラメータ説明を直接参照できます。このスクリプトを実行する(またはデーモンとしてマウントして継続的に動作させる)と、コンソールに以下のようなログが出力される場合、 Nacos Native が正常に起動したことを示しています。

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 12
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://172.17.0.2:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2024-09-19T03:25:54.202Z  INFO 12 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8848 (http)
2024-09-19T03:25:54.205Z  INFO 12 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 37 ms
2024-09-19T03:25:55.504Z  WARN 12 --- [           main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with an AuthenticationProvider bean. UserDetailsService beans will not be used for username/password login. Consider removing the AuthenticationProvider bean. Alternatively, consider using the UserDetailsService in a manually instantiated DaoAuthenticationProvider.
2024-09-19T03:25:55.535Z  INFO 12 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2024-09-19T03:25:55.643Z  INFO 12 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint beneath base path '/actuator'
2024-09-19T03:25:55.651Z  WARN 12 --- [           main] o.s.s.c.a.web.builders.WebSecurity       : You are asking Spring Security to ignore Deferred [Mvc [pattern='/**'], Ant [pattern='/**']]. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.
2024-09-19T03:25:55.651Z  WARN 12 --- [           main] o.s.s.c.a.web.builders.WebSecurity       : You are asking Spring Security to ignore Deferred [Mvc [pattern='/prometheus'], Ant [pattern='/prometheus']]. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.
2024-09-19T03:25:55.652Z  WARN 12 --- [           main] o.s.s.c.a.web.builders.WebSecurity       : You are asking Spring Security to ignore Deferred [Mvc [pattern='/prometheus/namespaceId/{namespaceId}'], Ant [pattern='/prometheus/namespaceId/{namespaceId}']]. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.
2024-09-19T03:25:55.652Z  WARN 12 --- [           main] o.s.s.c.a.web.builders.WebSecurity       : You are asking Spring Security to ignore Deferred [Mvc [pattern='/prometheus/namespaceId/{namespaceId}/service/{service}'], Ant [pattern='/prometheus/namespaceId/{namespaceId}/service/{service}']]. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.
2024-09-19T03:25:55.665Z  INFO 12 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8848 (http) with context path '/nacos'
2024-09-19T03:25:55.667Z  INFO 12 --- [           main] c.a.n.c.l.StartingApplicationListener    : Nacos started successfully in stand alone mode. use external storage
2024-09-19T03:26:21.080Z  INFO 12 --- [nio-8848-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-09-19T03:26:21.082Z  INFO 12 --- [nio-8848-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

Nacos Native スタンドアロンは、通常 100 ミリ秒未満で起動し、 Spring Boot 2 上の Nacos の 15 秒の起動時間と比較して大幅な改善が見られます。

クラスターモード#

Nacos Native クラスタの起動も同様に簡単で、スタンドアロンの起動方法に少し修正を加えるだけです。3 ノードの Nacos Native セットアップ(各ホストに2つのCPUコア、2GB RAM、50GB ストレージを設定)を例に取り、クラスタを開始するためにホスト名モードで設定します。各ノードのIPアドレスを cluster.conf に設定します。

nacos1:8848
nacos2:8848
nacos3:8848

以下に、 Nacos Native クラスタの各マシンで Nacos を起動するための簡単な bash スクリプトの例を示します。

#!/bin/bash
set -x
export MEMBER_LIST=""
export SERVER="${BASE_DIR}/nacos-server"
export CUSTOM_SEARCH_LOCATIONS="file:${BASE_DIR}/conf/"
function print_servers() {
  echo "" >"$CLUSTER_CONF"
  for server in ${NACOS_SERVERS}; do
    echo "$server" >>"$CLUSTER_CONF"
  done
}

chmod -R +x "${BASE_DIR}"

print_servers
APP_OPT="${APP_OPT} -Dnacos.home=${BASE_DIR}"
APP_OPT="${APP_OPT} -Dnacos.member.list=${MEMBER_LIST}"
APP_OPT="${APP_OPT} --spring.config.additional-location=${CUSTOM_SEARCH_LOCATIONS}"

if [[ "${NACOS_START_MODE}" == "standalone" ]]; then
  APP_OPT="${APP_OPT} -Dnacos.standalone=true"
fi

if [[ ! -z "${NACOS_AUTH_ENABLE}" ]]; then
  APP_OPT="${APP_OPT} -Dnacos.core.auth.enabled=${NACOS_AUTH_ENABLE}"
fi

if [[ "${PREFER_HOST_MODE}" == "hostname" ]]; then
  APP_OPT="${APP_OPT} -Dnacos.preferHostnameOverIp=true"
fi

# アプリケーションを起動する
echo "Nacos native is now starting with ${NACOS_START_MODE} mode"
exec ${SERVER} ${APP_OPT}

このクラスタサービスを構築するために、 Docker Compose や Oracle VirtualBox のようなプラットフォームを使用できます。では、これらの3つのサーバーで Nacos Native を起動しましょう。各サーバーのターミナルに以下のようなログが出力された場合、 Nacos クラスタが正常に起動したことを示しています。

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 
,`--.'`|  ' :                       ,---.               Running in cluster mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 1
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://nacos1:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2024-09-20T13:35:03.946+08:00  INFO 1 --- [            main] c.a.n.c.l.StartingApplicationListener    : The server IP list of Nacos is [nacos1:8848, nacos2:8848, nacos3:8848]
2024-09-20T13:35:04.982+08:00  INFO 1 --- [nacos-starting.0] c.a.n.c.l.StartingApplicationListener    : Nacos is starting...
2024-09-20T13:35:05.846+08:00  INFO 1 --- [            main] c.a.n.c.l.StartingApplicationListener    : Nacos started successfully in cluster mode. use external storage

Nacos Native クラスタノードの数が 15 以上に達した場合でも、起動時間は 100 ミリ秒以内に収まることができ、 Spring Boot 2 上の Nacos と比較して驚異的な改善が見られます。

Nacos Nativeクイックスタート#

TIP

このクイックスタートガイドは、 Nacos を迅速にセットアップ、デプロイ、および開始するのを支援するためのものです。このガイドで設定された Nacos サービスは、スタンドアロンモードで動作し、認証は有効になっていません。テスト目的のみでの使用を推奨します。本番環境では、クラスターモードで認証を有効化してデプロイし、安定性とセキュリティを向上させるため。 Nacos は内部データセンター(IDC)のアプリケーションコンポーネントとして使用することを意図しており、公開製品として使用するものではありません。Nacos を隔離された内部ネットワークにデプロイすることを強く推奨します。公開ネットワーク環境へのデプロイは強く推奨されません

このクイックスタートガイドは、コンピュータ上で Nacos Native Image を迅速にダウンロード、インストール、および使用するために設計されています。

システム要件#

Unix 系オペレーティングシステムで Nacos Native をビルドする場合、 OS が Musl やその他のフレームワークではなく、 GNU に基づいて完全に開発されていることを確認する必要があります。

Nacos Native は、 GraalVM を使用して構築された Nacos のバージョンであり、別途 JDK をインストールする必要はありません。Nacos Native は現在、Linux(GNU)およびmacOS向けの実行ファイルを提供しています。現在の Nacos Native バージョンは Java Nacos バージョン 2.5.0 に対応しています。実行可能なバイナリは、対応するリリースページからダウンロードできます。libstdc++ ライブラリを含む完全な64ビットオペレーティングシステムで Nacos Native を実行することを推奨します。

パッケージのダウンロードと展開#

適切なページからプログラムパッケージをダウンロードした後、展開し、ファイルを確認してください:

  1. Linux オペレーティングシステムでは、展開されたファイルには nacos-server バイナリ、 libinstrument.so シンボリックリンク、その他の関連する設定が含まれている必要があります。
  2. macOS では、展開されたファイルには nacos-server バイナリおよびその他の関連する設定が含まれている必要があります。

他のオペレーティングシステム向けの Nacos Native バージョンがない場合、そのオペレーティングシステムでソースコードを手動でコンパイルし、 Nacos Native バイナリパッケージを取得できます。

サーバーの起動#

Nacos Native を実行するには、少なくとも 1 つの CPU コア、 2GB の RAM、および 50GB のストレージを備えたマシンで実行することを推奨します。Linux/Unix/macOS では、以下のコマンドを使用して Nacos Native を起動できます:

# standalone はシングルノードモードで動作することを意味し、クラスターモードではありません
sh startup.sh -m standalone

Nacos Native をクラスターモードで起動したい場合は、 conf ディレクトリに cluster.conf ファイルを配置してください。このプロセスは Java Nacos と同様です。Nacos Native をクラスターモードで起動すると、クラスタの IP アドレスを自動でスキャンして取得します。

サーバーの停止#

Linux/Unix/macOS で Nacos Native サーバーを停止するには、以下のコマンドを使用します:

sh shutdown.sh

ログの確認#

Linux/Unix オペレーティングシステムでは、 Nacos Native の実行時ログは /root/nacos/logs ディレクトリに記録されます。ログ構造は Java Nacos と一致しています。

Nacos Nativeに貢献するにはどうすればよいですか?#

すべての開発者は、些細なクリーンアップであろうと大きな新機能であろうと、貢献して参加することを大歓迎します。Nacos コミュニティは文書化、他のプロジェクトとの統合を重視しており、これらの領域の改善を容易に受け入れます。Nacos Native Image にコードを寄稿したい場合は、「寄稿規約」

Nacos Nativeへの貢献にあたり、以下の点を明確にする必要があります:

  1. GraalVM の initialize-at-build-time に関連するクラスは、 console/pom.xmlnative-maven-pluginbuildArgs セクションに追加し、パラメータの構造が保たれるようにします。
  2. Spring Boot AOT に関連しないメタデータは、 GraalVM の initialize-at-run-time パラメータとして構成する必要があります。これらは console/pom.xmlnative-maven-pluginbuildArgs セクションおよび src/main/resources/META-INF/native-image/com.alibaba.nacos/nacos-console 内の対応するメタデータファイルに追加し、パラメータの構造が保たれるようにします。
  3. Spring Boot AOT に直接関連するメタデータは、 com.alibaba.nacos.console.aot.NacosRuntimeHints クラス内の適切な場所に配置し、パラメータの構造が保たれるようにします。
  4. 追加するメタデータが GraalVM と Java 環境で個別に処理する必要がある場合、その実装ロジックを com.alibaba.nacos.console.aot.AotConfiguration クラスに追加します。

関連コード リポジトリ#

alibaba
/
nacos
Waiting for api.github.com...
0K
0K
No License
Waiting...

翻訳への貢献#

  • Riku Kenji:X から
  • けいたろう いけみやぎ:Discord から
  • たかあき すえやす:X から
  • しょういちろう すわぞの:Facebook から
Nacos Native Image
https://biu.kim/posts/nacos/jp/
Author
Moritz Arena
Published at
2024-10-31