メッセージキューを含む非同期シナリオでのトラフィック制御により、ビジネスコードを変更することなくエンドツーエンドカナリアリリースを実装できます。このトピックでは、Microservices Engine (MSE) を使用して Message Queue for Apache RocketMQ に基づくエンドツーエンドカナリアリリースを実装する方法について説明します。
前提条件
Container Service for Kubernetes (ACK) マネージドクラスターを作成します。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
デモアーキテクチャ
このトピックでは、Container Service for Kubernetes (ACK) コンソールにデプロイされたアプリケーションを例として使用します。kubectl を使用してアプリケーションをデプロイし、実際の呼び出しチェーンをシミュレートすることもできます。次の図は、デモアプリケーションのアーキテクチャを示しています。アプリケーション間の呼び出しには、最も一般的な 2 つのマイクロサービスフレームワークである Spring Cloud と Dubbo の両方の呼び出しが含まれます。アプリケーション C は、アプリケーション A によって消費される RocketMQ メッセージを生成します。アプリケーション A がメッセージを消費すると、新しい呼び出しも開始します。これらのアプリケーションは、Spring Cloud、Dubbo、および RocketMQ の標準的な使用法に基づいています。

ステップ 1: アプリケーションを MSE マイクロサービスガバナンスに接続する
Container Service for Kubernetes (ACK) クラスター内のマイクロサービスアプリケーションに対してマイクロサービスガバナンスを有効にします。ビジネス要件に基づいて適切なメソッドを選択できます。詳細については、「ACK または ACS クラスター内の Java マイクロサービスアプリケーションに対してマイクロサービスガバナンスを有効にする」をご参照ください。
ACK 名前空間のアプリケーションに対してマイクロサービスガバナンスを有効にする
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
Application list ページで、ACK Application Access をクリックします。
ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

パラメーター
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明Container Service for Kubernetes が Microservices Engine を呼び出す権限を付与していない場合は、[承認してください] をクリックして権限を付与します。
Cluster Name/ID
MSE マイクロサービスガバナンスに接続する Cluster Name/ID の名前または ID を選択します。キーワードでクラスターを検索できます。
ack-onepilot
[ack-onepilot] コンポーネントのステータス。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「MSE マイクロサービスガバナンスコンポーネントのインストールとアップグレード」をご参照ください。
[ack-onepilot] がインストールされていない場合、クラスターを選択するとシステムによって自動的にインストールされます。「[インストールには約 1 分かかります。お待ちください。]」というメッセージが表示されます。
RAM ユーザーを使用していて、必要な権限がない場合は、Container Service for Kubernetes コンソールにログインします。ターゲットクラスターの詳細ページに移動します。[コンポーネント管理] をクリックし、[ack-onepilot] を見つけて、[インストール] をクリックします。
[ack-onepilot] がインストールされている場合、コンソールには「インストール済み」と表示され、その後にバージョン番号が続きます (例: インストール済み 4.2.0)。
説明このステップでインストールされるコンポーネントは [ack-onepilot] です。Container Service for Kubernetes コンソールにログインし、ターゲットクラスターの詳細ページに移動し、[運用管理] >[コンポーネント管理] を選択して詳細を表示できます。
[ack-onepilot] がインストールされると、エージェントが自動的に挿入されます。これにより、アプリケーションの起動時間が最大 10 秒増加する場合があります。
名前空間で接続し、ターゲットクラスターが次のリージョンのいずれにもない場合は、クラスターがインターネットにアクセスし、acm.aliyun.com:8080 に接続できることを確認してください: 青島、杭州、北京、上海、上海金融クラウド、深セン、香港 (中国)、シンガポール、フランクフルト、シドニー、シリコンバレー、バージニア。
Access Type
Namespace Access を選択します。
Cluster Namespace
Cluster Namespace を選択します。
Microservices Governance Namespace
Microservices Governance Namespace を選択します。
アプリケーションのマイクロサービスガバナンスを有効にする
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
Application list ページで、ACK Application Access をクリックします。
ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

パラメーター
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明Container Service for Kubernetes が Microservices Engine を呼び出す権限を付与していない場合は、[承認してください] をクリックして権限を付与します。
Cluster Name/ID
MSE マイクロサービスガバナンスに接続する Cluster Name/ID の名前または ID を選択します。キーワードでクラスターを検索できます。
ack-onepilot
[ack-onepilot] コンポーネントのステータス。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「MSE マイクロサービスガバナンスコンポーネントのインストールとアップグレード」をご参照ください。
[ack-onepilot] がインストールされていない場合、クラスターを選択するとシステムによって自動的にインストールされます。「[インストールには約 1 分かかります。お待ちください。]」というメッセージが表示されます。
RAM ユーザーを使用していて、必要な権限がない場合は、Container Service for Kubernetes コンソールにログインします。ターゲットクラスターの詳細ページに移動します。[コンポーネント管理] をクリックし、[ack-onepilot] を見つけて、[インストール] をクリックします。
[ack-onepilot] がインストールされている場合、コンソールには「インストール済み」と表示され、その後にバージョン番号が続きます (例: インストール済み 4.2.0)。
説明このステップでインストールされるコンポーネントは [ack-onepilot] です。Container Service for Kubernetes コンソールにログインし、ターゲットクラスターの詳細ページに移動し、[運用管理] >[コンポーネント管理] を選択して詳細を表示できます。
[ack-onepilot] がインストールされると、エージェントが自動的に挿入されます。これにより、アプリケーションの起動時間が最大 10 秒増加する場合があります。
名前空間で接続し、ターゲットクラスターが次のリージョンのいずれにもない場合は、クラスターがインターネットにアクセスし、acm.aliyun.com:8080 に接続できることを確認してください: 青島、杭州、北京、上海、上海金融クラウド、深セン、香港 (中国)、シンガポール、フランクフルト、シドニー、シリコンバレー、バージニア。
Access Type
Single Application Access を選択します。
Access Procedure
ステップに従います。
[ステップ 1: クラスターの [ワークロード] > [デプロイメント] ページに移動し、アプリケーションの名前空間に切り替えます]。
[ステップ 2: 接続するアプリケーションを見つけて、[YAML で表示] をクリックします]。
[ステップ 3: 次のフォーマットでラベルを編集し、[更新] をクリックします]。
spec: template: metadata: labels: # 接続を有効にするには、値を "on" に設定します。値は二重引用符で囲む必要があります。 msePilotAutoEnable: "on" # 接続先のガバナンス名前空間を指定します。名前空間が存在しない場合は、自動的に作成されます。 mseNamespace: default # MSE に接続するアプリケーションの実際の名前を指定します。名前は二重引用符で囲む必要があります。 msePilotCreateAppName: "your-deployment-name"
ステップ 2: アプリケーションをデプロイする
spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud-c アプリケーションを、Nacos サーバーおよび RocketMQ サーバーとともにデプロイします。デモからソースコードを直接入手することもできます。
spring-cloud-zuul アプリケーションが /A/dubbo のリクエストを受信すると、リクエストを spring-cloud-a に転送します。次に、spring-cloud-a は Dubbo プロトコルを使用して spring-cloud-b を呼び出し、spring-cloud-b は spring-cloud-c を呼び出します。リクエストを受信した後、spring-cloud-c はメッセージを生成し、その環境タグと IP アドレスを返します。これらのメッセージは、spring-cloud-a アプリケーションによって消費されます。メッセージを消費するとき、spring-cloud-a は Spring Cloud を使用して spring-cloud-b を呼び出し、spring-cloud-b は spring-cloud-c を呼び出します。最後に、spring-cloud-a は結果をログに出力します。
# /A/dubbo にアクセスすると、戻り値は A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx] です。
# 同時に、spring-cloud-a はメッセージを受信し、次の情報をログに記録します:
2021-12-28 10:58:50.301 INFO 1 --- [essageThread_15] c.a.mse.demo.service.MqConsumer
: topic:TEST_MQ,producer:C[10.25.xx.xx],invoke result:A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[アクション] 列の [詳細] をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、[名前空間] を選択し、[YAML から作成] をクリックして、次の YAML コードでアプリケーションをデプロイします:
次のコマンドを実行して、アプリケーションがデプロイされているかどうかを確認します。
kubectl get svc,deploy期待される出力:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 192.168.xx.xx <none> 4xx/TCP 7d service/mqnamesrv ClusterIP 192.168.xx.xx <none> 98xx/TCP 47h service/nacos-server ClusterIP 192.168.xx.xx <none> 88xx/TCP 47h service/zuul-slb LoadBalancer 192.168.xx.xx 123.56.xx.xx 80:302xxx/TCP 47h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nacos-server 1/1 1 1 4m deployment.apps/rockectmq-broker 1/1 1 1 4m deployment.apps/rocketmq-name-server 1/1 1 1 5m deployment.apps/spring-cloud-a 1/1 1 1 5m deployment.apps/spring-cloud-b 1/1 1 1 5m deployment.apps/spring-cloud-c 1/1 1 1 5m deployment.apps/spring-cloud-zuul 1/1 1 1 5m
ステップ 3: アプリケーションの RocketMQ メッセージベースのカナリアリリースを有効にする
spring-cloud-c がメッセージプロデューサーで、spring-cloud-a がメッセージコンシューマーであると仮定します。両方のアプリケーションで RocketMQ メッセージベースのカナリアリリースを有効にします。
RocketMQ メッセージベースのカナリアリリース機能を有効または無効にするには、変更を有効にするために ACK コンソールでアプリケーションを再デプロイする必要があります。
メッセージベースのカナリアリリース機能は、メッセージプロデューサーとメッセージコンシューマーの両方で有効になっている場合にのみ有効になります。
この機能は現在、オープンソースおよび Alibaba Cloud 商用版を含む RocketMQ メッセージのみをサポートしています。
オープンソースの RocketMQ を使用する場合、RocketMQ Server と RocketMQ Client の両方がバージョン 4.5.0 以降である必要があります。
Alibaba Cloud Message Queue for Apache RocketMQ 4.x を使用する場合、SQL92 フィルタリングを使用するには Enterprise Edition を使用する必要があります。この制限は、クライアント側のフィルタリングまたは Alibaba Cloud Message Queue for Apache RocketMQ 5.x を使用する場合には適用されません。
ONS クライアントを使用する場合、バージョンは 1.8.0.Final 以降である必要があります。
RocketMQ メッセージベースのカナリアリリースを有効にすると、MSE はメッセージの使用者グループを変更します。たとえば、元の使用者グループが group1 で環境タグが gray の場合、この機能を有効にするとグループは group1_gray に変更されます。Alibaba Cloud Message Queue for Apache RocketMQ を使用する場合は、事前にグループを作成する必要があります。
デフォルトでは、MSE は SQL92 構文を使用してメッセージをフィルターします。Apache RocketMQ を使用している場合は、broker.conf ファイルに
enablePropertyFilter=true構成を追加して、サーバー側で SQL92 フィルタリングを有効にする必要があります。シナリオが SQL92 フィルタリングをサポートしていない場合は、FilterMessageHook を使用してコンシューマー側でメッセージをフィルターできます。このメソッドでは、すべてのアプリケーションでメッセージベースのカナリアリリースを有効にし、クライアント側のフィルタリングメソッドを選択する必要があります。コンシューマー側のフィルタリングメソッドは各環境ですべてのメッセージを処理するため、メッセージプロデューサーとコンシューマーの両方に大きな負荷がかかります。本番環境でこのメソッドを使用することはお勧めしません。
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
Application list ページで、目的のアプリケーションのリソースカードをクリックします。左側のナビゲーションウィンドウで、[トラフィック管理] をクリックします。
[メッセージグレースケール] タブで、[メッセージグレースケールを有効にする] スイッチをオンにし、[OK] をクリックします。

ステップ 4: 新しいバージョンのアプリケーションをデプロイする
新しいバージョンのアプリケーション spring-cloud-a-gray、spring-cloud-b-gray、spring-cloud-c-gray をデプロイします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[アクション] 列の [詳細] をクリックします。クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、[名前空間] を選択し、[YAML から作成] をクリックします。次の YAML コードを使用してアプリケーションをデプロイします:
ステップ 5: トラフィックをルーティングして結果を検証する
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
spring-cloud-a アプリケーションのリソースカードをクリックします。[アプリケーション概要] ページの [QPS トレンドグラフ] には、すべてのトラフィックがアプリケーションのベースラインバージョン (安定バージョン) にルーティングされていることが示されます。
左側のナビゲーションウィンドウで [トラフィックガバナンス] をクリックし、次に [タグベースルーティング] タブをクリックします。
grayタグの [トラフィックルール] 列で、[追加] をクリックします。
[ラベル ルートの作成] パネルで、トラフィックルールを設定し、[OK] をクリックします。
この例では、トラフィックルールの条件は
name=xiaomingに設定されています。トラフィックルールの設定方法の詳細については、「タグベースルーティングを設定する」をご参照ください。
トラフィックルールが有効になった後、[アプリケーション概要] ページでトラフィック分散を表示できます。
[タグベースルーティング] タブで、gray タグの宛先ルールの名前をクリックします。[ルールの詳細] パネルで、[編集] をクリックします。[タグベースルーティングルールの変更] パネルで、[タグ伝播] スイッチを有効にし、[OK] をクリックします。
説明タグ伝播を有効にすると、
name=xiaomingに一致するグレースケールトラフィックがエンドツーエンドで渡され、ルールを繰り返し設定する必要はありません。ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
zuul-slb サービスをクリックします。[基本情報] で、[外部 IP アドレス (外部 IP)] の横にあるアドレスをクリックします。
サービス呼び出しページで、/A/dubbo?name=xiaoming と入力し、[呼び出しを開始] をクリックします。
エンドツーエンドカナリアリリースが有効になりました。

spring-cloud-b アプリケーションのトラフィックデータは次のようになります:

ステップ 6: タグベースのメッセージフィルタリングルールを調整し、結果を検証する
MSE コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択し、spring-cloud-a アプリケーションのリソースカードをクリックします。
左側のナビゲーションウィンドウで、[トラフィックガバナンス] をクリックし、次に [メッセージグレースケール] タブをクリックします。
[メッセージグレースケール] タブで、[ベースライン環境で無視されるタグ] の横にある [編集] ボタンをクリックします。入力ボックスで
grayを選択し、[OK] をクリックします。[ベースライン環境で無視するタグ] パラメーターに
grayを選択した場合、`gray` 環境タグを持つメッセージは `spring-cloud-a-gray` によってのみ消費され、`spring-cloud-a` では消費されません。[ベースライン環境で無視するタグ] パラメーターは、設定後に動的に有効になり、アプリケーションを再起動する必要はありません。説明デフォルトでは、ベースラインノードはすべての環境からのメッセージを消費します。ベースラインノードがタグ付けされた環境で生成されたメッセージを消費しないようにするには、[ベースライン環境で無視されるタグ] パラメーターを設定するだけで済みます。
ACK コンソールにログインして、spring-cloud-a アプリケーションのログを表示し、構成を検証します。
次の図のログは、ベースライン環境が gray 環境とベースライン環境の両方で生成されたメッセージを消費できることを示しています。[ベースライン環境で無視するタグ] パラメーターを `gray` に設定すると、ベースライン環境はベースライン環境で生成されたメッセージのみを消費します。
