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 依存バージョンをアップグレードすることは、依存関係管理、コード移行、テスト、検証を含む複雑なプロセスです。事前のバージョン更新調査では、以下の依存関係の最終バージョンを一緒にアップグレードする必要があることが確認されています。
アーカイブ | 以前のバージョン | 次のバージョン | 説明 |
---|---|---|---|
java | 1.8 | 17 | Minimum compatible Java version |
spring-boot-dependencies | 2.7.18 | 3.3.1 | Dependencies related to SpringBoot |
servlet-api | 3.0 | 6.1.0 | Dependencies related to Servlet |
spring | 5.3.34 | 6.1.10 | Dependencies related to Spring |
spring-security | 5.7.12 | 6.3.1 | Dependencies related to Spring Security |
apache-http-components | 4.1.5 | 5.3.1 | Dependencies related to Apache HTTP Components |
micrometer | 1.9.17 | 1.13.1 | Dependencies related to Micrometer |
maven-pmd-plugin | 3.8 | 3.15.0 | Dependencies related to PMD |
p3c-pmd | 1.3.0 | 2.1.1 | Dependencies related to P3C |
maven-shade-plugin | 3.2.4 | 3.6.0 | Dependencies related to Maven Shade |
grpc-java | 1.57.2 | 1.65.1 | Dependencies related to grpc |
grpc-util | - | 1.65.1 | Detach from grpc |
grpc-inprocess | - | 1.65.1 | Detach from grpc |
findbugs-maven-plugin | 3.0.4 | - | No longer support for jdk 17 |
soptbugs-maven-plugin | - | 4.8.6.2 | Support JDK 17 |
完了した依存関係グラフに基づき、 Spring 関連の依存関係をさらに明確化し、それらの階層関係を決定し、将来の更新の順序を確立できます。
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-context
、nacos-spring-context-aop
、nacos-spring-samples
、spring-cloud-starter-alibaba-nacos-config
など)が Native Image でスムーズにパッケージおよび実行できるようにすることです。Nacos リポジトリで現在の GraalVM Native Image 関連の問題は以下の通りです:
- ISSUE#9997 Nacos クライアントの Spring Native サポート: https://github.com/alibaba/nacos/issues/9997
- ISSUE#11402 ネイティブ Docker イメージのサポート: https://github.com/alibaba/nacos/issues/11402
- ISSUE#11790 クラス com.alibaba.nacos.common.remote.client.RpcClientTlsConfig のシリアライザーが見つからない(native-image 実行に失敗): https://github.com/alibaba/nacos/issues/11790
- ISSUE#11853 nacos-client の GraalVM サポート: https://github.com/alibaba/nacos/issues/11853
- ISSUE#11860 reflect-config.json の更新: https://github.com/alibaba/nacos/pull/11860
- ISSUE#11861 [GraalVM] Spring Boot Maven Plugin で生成されるヒントファイルに警告情報が表示される: https://github.com/alibaba/nacos/issues/11861
- ISSUE#11902 GraalVM 到達可能性メタデータの欠落: https://github.com/alibaba/nacos/issues/11902
- ISSUE#12028 [2024年夏] Java ネイティブイメージランタイムモードをサポートする Nacos: https://github.com/alibaba/nacos/issues/12028
これまでに、 Nacos クライアントでの Native Image 起動に向けた一部のリフレクションメタデータサンプリング作業が完了しており(例えば ISSUE#11860 のマージ)、進展が見られますが、 nacos-console
への対応や、 Spring Boot 3 がもたらす新たなNative技術の問題はまだ解決されていません。これらの問題は、今後の作業で解決される予定です。
パフォーマンスレポート
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 3 | 2.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 3 | 2.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 がコンパイルできる基本環境を満たしていることを確認する必要があります。
- オペレーティング システムには Oracle GraalVM JDK 17.0.12+8.1 がインストールされており、環境変数
GRAALVM_HOME
およびJAVA_HOME
が GraalVM ディレクトリを指している必要があります。 - オペレーティング システムが MUSL などではなく、完全に GNU ベースであることを確認してください。
- 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。
- コンピューターに Maven バージョン 9.0 以降がインストールされていることを確認します。
- コンパイルとビルドにかかる時間が長すぎることを望まない場合は、複数のコアとより高い周波数を備えた CPU で変更を実行することをお勧めします。
ここでは、デモ環境として上記の条件を満たす macOS(Apple Silicon) オペレーティングシステムを使用します。リポジトリ git@github.com:alibaba/nacos.git
のクローンをローカルに作成し、以下の手順に従って Maven を介して Nacos Native をビルドします。
Nacos ディレクトリに移動し、ブランチ
Summer-ospp#12028
:git checkout Summer-ospp#12028
に切り替えます。Maven コマンドを使用して「インストール」します:
mvn clean install -DskipTests=true -Pnative -Pnative-osx-arm64 -Prelease-native
。別のバージョンのオペレーティング システムまたは環境を使用している場合は、次の表を参照して必要なプロファイルを選択し、ビルドするパラメータの
-Pnative-osx-arm64
を置き換えてください。OS Family Arch Profile Linux aarch64 native-linux-aarch64 Linux ppc64le native-linux-ppc64le Linux s390x native-linux-s390x Linux x86 native-linux32 Linux x64 native-linux64 OSX arm64 native-osx-arm64 OSX x86_64 native-osx-x86_64 Windows x64 native-win64
Maven による Nacos ネイティブ イメージの構築が完了するまで待ちます。通常、これには約 10 分かかります (具体的な時間は CPU のパフォーマンスによって異なります)。ビルド プロセス中に例外が発生した場合は、Nacos リポジトリに問題を送信してください。
ビルドが完了すると、関連ファイルが
distribution/target
フォルダーに保存されます。この実行パッケージを自分でカプセル化する場合は、最終ビルド ファイルに従ってconsole/target
フォルダーからコピーしてください。以下のオペレーティング システムに対応する表が出てきます。OS Related Files windows nacos-server, libinstrument.dll unix nacos-server, libinstrument.so macos nacos-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 を実行することを推奨します。
パッケージのダウンロードと展開
適切なページからプログラムパッケージをダウンロードした後、展開し、ファイルを確認してください:
- Linux オペレーティングシステムでは、展開されたファイルには
nacos-server
バイナリ、libinstrument.so
シンボリックリンク、その他の関連する設定が含まれている必要があります。 - 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への貢献にあたり、以下の点を明確にする必要があります:
- GraalVM の
initialize-at-build-time
に関連するクラスは、console/pom.xml
のnative-maven-plugin
のbuildArgs
セクションに追加し、パラメータの構造が保たれるようにします。 - Spring Boot AOT に関連しないメタデータは、 GraalVM の
initialize-at-run-time
パラメータとして構成する必要があります。これらはconsole/pom.xml
のnative-maven-plugin
のbuildArgs
セクションおよびsrc/main/resources/META-INF/native-image/com.alibaba.nacos/nacos-console
内の対応するメタデータファイルに追加し、パラメータの構造が保たれるようにします。 - Spring Boot AOT に直接関連するメタデータは、
com.alibaba.nacos.console.aot.NacosRuntimeHints
クラス内の適切な場所に配置し、パラメータの構造が保たれるようにします。 - 追加するメタデータが GraalVM と Java 環境で個別に処理する必要がある場合、その実装ロジックを
com.alibaba.nacos.console.aot.AotConfiguration
クラスに追加します。
関連コード リポジトリ
翻訳への貢献
- Riku Kenji:X から
- けいたろう いけみやぎ:Discord から
- たかあき すえやす:X から
- しょういちろう すわぞの:Facebook から