Microservices Engine (MSE) はカナリアリリースをサポートしています。すべてのノードにリリースする前に、検証のために少数のノードに構成をリリースできます。この方法は、構成プッシュに関連するリスクを低減します。このトピックでは、Nacos インスタンスのカナリアリリースを構成する方法について説明します。
前提条件
Nacos Client 2.x 以降を使用してください。
背景情報
クラスター構成を一元管理する場合、変更された構成は通常、以前の構成を上書きし、クラスター内のすべてのノードにプッシュされます。新しい構成が正しくない場合、クラスター全体が失敗する可能性があり、これはリスクの高い操作となります。
このリスクを低減するために、構成を編集する際にカナリアリリースを実行できます。新しい構成は、まず少数のマシンにリリースされます。検証が成功した場合、すべてのノードが更新されるまで、徐々にリリースを拡大できます。このメソッドは、構成変更に関連するリスクを低減します。
構成の変更中に、リリースのためのカナリアノードを選択します。MSE Nacos は、IP アドレスベースとタグベースの 2 種類のカナリアリリースをサポートしています。
IP アドレスベースのカナリアリリース
IP アドレスベースのカナリアリリースは、IP アドレスのリストを選択して、どのマシンが新しい構成を受け取るかを決定する基本的なメソッドです。小規模な業務システムの場合、このメソッドはリリース要件を満たすのに十分です。構成プッシュのリスクや構成エラーによる障害を大幅に低減します。
Beta 構成の作成
MSE コンソールにログインし、トップナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、マイクロサービスの登録 > インスタンス を選択します。
インスタンス ページで、インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、Configuration Management > Configurations を選択します。
ターゲット構成を見つけ、Actions 列の Edit をクリックします。Edit Configuration パネルで、Release Type を [IP ベースのカナリアリリース] に設定します。

[アプリケーションノード IP] 入力ボックスをクリックし、リストからカナリアリリース用の IP アドレスを選択します。
IP アドレスを手動で入力することもできます。自動補完機能がサポートされています。
説明IP アドレスは、構成をサブスクライブするノードの IP アドレスです。複数の IP アドレスはカンマ (,) で区切ります。
構成を変更した後、Canary Release をクリックします。Comparison of Configuration Content ダイアログボックスで、[現在の公式バージョン] と [リリースするコンテンツ] を確認し、Release をクリックします。
Beta 構成の表示
MSE コンソールにログインし、トップナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、マイクロサービスの登録 > インスタンス を選択します。
インスタンス ページで、インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、Configuration Management > Configurations を選択します。
Beta リリース中の構成を見つけ、Actions 列の Edit をクリックします。
Edit Configuration パネルで、[Beta(IP)] タブをクリックして、Beta リリースの情報を表示します。

その他の操作
カナリアリリースの停止: Edit Configuration パネルの [Beta(IP)] タブで、Stop Canary Release をクリックしてカナリアリリースをキャンセルします。
全量リリース: Edit Configuration パネルの [Beta(IP)] タブで、Full Release をクリックします。Comparison of Configuration Content ダイアログボックスで、構成情報を確認し、Full Release をクリックします。カナリアリリースの内容が公式バージョンとして公開され、現在のカナリアリリースは停止されます。
IP アドレスベースのカナリアリリースには、次の問題があります。
Nacos Client 1.x では、接続が SLB インスタンスを通過するため、サーバーはクライアントの IP アドレスを正確に取得できません。
Kubernetes ベースのアーキテクチャでは、ノードを再構築するとマシンの IP アドレスが変更される可能性があります。これにより、IP ベースのカナリアリリースが失敗する可能性があります。
タグベースのカナリアリリース
MSE Nacos 2.2.3.3 以降では、タグベースのカナリアリリースがサポートされています。クライアントでアプリケーションノードにタグを設定し、それらのタグに基づいてカナリアリリースを実行できます。
タグベースのカナリアリリースは MSE Nacos 2.2.3.3 以降でサポートされています。エンジンをバージョン 2.2.3.3 以降にアップグレードする必要があります。
カナリアリリース用のカスタムアプリケーションタグは、オープンソースの Nacos Client 2.3.2 以降でサポートされています。クライアントをバージョン 2.3.2 以降にアップグレードする必要があります。
環境変数を使用してタグを注入するには、Nacos Client をバージョン 2.4.2 以降にアップグレードする必要があります。
クライアントでのアプリケーションタグの設定
キーと値のペアの形式でアプリケーションにタグを設定できます。プロパティ、JVM パラメーター、環境変数の 3 つの方法のいずれかでタグを指定できます。タグが同じキーを持つ場合、優先順位はプロパティ > JVM パラメーター > 環境変数です。nacos.config.gray.label は、Nacos のカナリアリリース用の組み込みのデフォルトタグです。
// 1. プロパティとして渡す
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
properties.put("project.name", "your app name");
properties.put("nacos.config.gray.label","yourgrayname");
// 2. JVM パラメーターとして設定
Set the startup parameter -Dnacos.config.gray.label=yourgrayname
// 3. 環境変数として指定
Set the environment variable nacos_config_gray_label=yourgrayname
String dataId = "gray_test_dataid";
String group = "test-group";
configService.addListener(dataId, group, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("receiveConfig:" + configInfo);
}
});サーバーでのタグ付きカナリア構成のリリース
リスナータグの表示
クライアントでアプリケーションタグを注入した後、サーバー上で構成のリスナーのリストを表示できます。各リスナーが持つタグも確認できます。

タグ付きカナリア構成のリリース
[構成の編集] をクリックし、[タグベースのカナリアリリース] を選択してから、アプリケーションノードの既存のキーと値のタグペアを選択します。選択したタグペアに一致するノードの数を確認できます。

タグ付きカナリアバージョンをリリースした後、[リスナークエリ] タブで現在のクライアントに一致する構成バージョンを表示できます。[構成の詳細] タブで現在のカナリアバージョンの詳細を表示できます。
最初のカナリアリリースグループの結果を観察した後、タグの値を拡張して、すべてのノードが含まれるまでリリース範囲を徐々に拡大できます。全量リリースを実行すると、対応するカナリアバージョンは停止されます。カナリアリリース中に業務上の例外が発生した場合は、[カナリアリリースの停止] をクリックして変更を自動的にロールバックできます。
関連する質問
アプリケーションタグの高度な使用法
nacos.config.gray.label のような単一のタグを設定することに加えて、Nacos は複数のタグの設定とカスタムタグ Collector SPI の使用もサポートしています。これにより、タグを取得するためのより柔軟なカスタムロジックが可能になります。
複数値タグの設定
Nacos は、複数のキーと値のタグペアをアプリケーションに注入することをサポートしています。プロパティと JVM パラメーターで
nacos.app.conn.labelsパラメーターを指定できます。フォーマットはnacos.app.conn.labels="k1=v1,k2=v2,k3=v3"です。環境変数で [nacos_app_conn_labels] パラメーターを指定することもできます。// 1. プロパティとして渡す Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint"); properties.put("project.name", "your app name"); properties.put("nacos.app.conn.labels","app=demo,site=hangzhou-c,otherkey=othervaue"); // 2. JVM パラメーターとして設定 Set the startup parameter -Dnacos.app.conn.labels="app=demo,site=hangzhou-c,otherkey=othervaue" // 3. 環境変数として指定 Set the environment variable nacos_app_conn_labels="app=demo,site=hangzhou-c,otherkey=othervaue" NacosConfigService configService = new NacosConfigService(properties); String dataId = "gray_test_dataid"; String group = "test-group"; configService.addListener(dataId, group, new Listener() { @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { System.out.println("receiveConfig:" + configInfo); } });カスタムアプリケーションタグ SPI
Nacos Client は、カスタムアプリケーションタグ用の SPI を定義します。
com.alibaba.nacos.common.labels.LabelsCollectorインターフェイスを実装し、実装クラスをサービスとして公開して、カスタムアプリケーションタグ SPI を作成できます。package your.demo.test; import com.alibaba.nacos.common.labels.LabelsCollector; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * TestLabelsCollector. * * @author あなたの名前 */ public class TestLabelsCollector implements LabelsCollector { @Override public String getName() { return "testlables"; } @Override public Map<String, String> collectLabels(Properties properties) { Map<String, String> labels = new HashMap<>(); labels.put("test", "implements your labels logic"); return labels; } @Override public int getOrder() { return 1; } }
並列カナリアバージョン
構成には複数のバージョンを含めることができます。これらには、公式バージョン、IP ベースのカナリアバージョン、および複数のタグベースのカナリアバージョンが含まれます。構成に複数のバージョンがある場合、Nacos サーバーは次の優先順位に従って構成クエリとプッシュを照合します: IP ベースのカナリアバージョン > タグベースのカナリアバージョン > 公式バージョン。
複数のタグベースのカナリアバージョンを処理する場合、バージョンは優先度フィールドの値によってソートされます。優先度の値が大きいほど、優先度が高くなります。優先度の値が等しい場合、バージョンは名前でソートされます。異なるカナリアバージョンには明確な優先度を設定することをお勧めします。
アプリケーションノードにタグがある場合、システムはまずノードの IP アドレスに対応する IP ベースのカナリアバージョンがあるかどうかを確認します。存在する場合、IP ベースのカナリア構成が返されます。IP ベースのカナリアバージョンが存在しない場合、システムは優先度に従ってタグベースのカナリアバージョンを照合しようとします。一致が見つかった場合、対応するカナリア構成が返されます。タグベースのカナリアバージョンが一致しない場合、構成の公式バージョンが返されます。MSE コンソールの [リスナークエリ] ページで、各アプリケーションノードに一致する構成バージョンを表示できます。
MSE Nacos 2.3.0 以降では、並列カナリアバージョンがサポートされています。単一の構成に対してリリースできるカナリアバージョンの数には制限があります。デフォルトでは、最大 5 つのタグベースのカナリアバージョンをリリースできます。この制限を超えると、カナリアリリースはブロックされます。
アプリケーションタグの計画
アプリケーションノードのタグを計画する際は、業務への影響範囲に基づいて計画することをお勧めします。これにより、段階的なカナリアリリースを実行し、変更に関連するリスクを低減できます。以下は、一般的なベストプラクティスです。
アプリケーション名をタグとして使用します。まず、重要でないアプリケーションでカナリアリリースを実行します。例外がないことを観察して確認した後、コアアプリケーションにリリースを拡大します。
業務側では、トラフィックの入口でアップストリームとダウンストリームのマシン間のトラフィックを分離できます。たとえば、内部ユーザー向けにカナリアマシンのグループを特定できます。その後、これらのマシンに別のカナリアタグを設定して、内部ユーザー向けのカナリアリリースを実装できます。
アプリケーションタグのフォーマット
タグのキーと値には、大文字と小文字の英字、数字、アンダースコア (_)、ハイフン (-)、およびピリオド (.) を含めることができます。他のフォーマットのタグは無視されます。nacos.app.conn.labels パラメーターで複数のキーと値のペアを指定する場合は、 "k1=v1,k2=v2,k3=v3" のフォーマットを使用します。たとえば、"k1=v1,k2" を渡した場合、k2 パラメーターは無視され、最終的に解析される値は k1=v1 になります。