すべてのプロダクト
Search
ドキュメントセンター

Microservices Engine:自己管理の Spring Cloud Gateway または Zuul を使用したエンドツーエンドカナリアリリース

最終更新日:Jun 22, 2026

Spring Cloud Gateway と Zuul は、マイクロサービスアーキテクチャで一般的に使用される API ゲートウェイであり、ルート転送とフィルター処理をサポートしています。ルーティングルールを設定して、カナリアバージョンの検証とテストのためにリクエストをカナリア環境にルーティングできます。Microservices Engine (MSE) のエンドツーエンドカナリアリリース機能を使用すると、ビジネスコードを変更することなく、エンドツーエンドのトラフィック制限を実装できます。このトピックでは、Spring Cloud Gateway または Zuul ゲートウェイを設定して、エンドツーエンドカナリアリリースを有効にする方法について説明します。

前提条件

背景情報

このトピックでは、MSE を使用して、実際のサービスコールチェーンをシミュレートすることにより、エンドツーエンドカナリアリリースを実行する方法を説明します。アプリケーションコードを変更することなく、この機能を実現できます。Ingress アプリケーションのトラフィックルールを設定するだけで、MSE はこのタグをサービスコールチェーン全体に伝播させます。各サービスコール中、MSE はカナリア条件に一致するトラフィックを対応するカナリアバージョンに優先的にルーティングします。対応するカナリアバージョンが存在しない場合、トラフィックは自動的にベースバージョン (安定バージョンとも呼ばれます) にフォールバックします。

この例では、4 つのビジネスアプリケーション (spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c) と、レジストリとして機能する Nacos Server がデプロイされています。サービスコールチェーンは、spring-cloud-gateway->A->B->C です。

アプリケーション間の呼び出しには、Spring Cloud と Dubbo の両方のサービス呼び出しが含まれます。

エンドツーエンドカナリアリリースでは、トラフィックマークを使用してカナリアトラフィックをカナリアノードに優先的にルーティングします。これにより、制御されたカナリア検証を実行し、システムの安定性を確保できます。

エンドツーエンドカナリアリリースの検証では、通常、次の戦略が使用されます。

  • テストのために、本番環境のライブトラフィックのわずかな割合をカナリアバージョンに誘導します。

  • 指定されたヘッダーや Cookie などの特定のルールに基づいて、本番環境のライブトラフィックをフィルタリングします。

このトピックでは、マイクロサービスアーキテクチャ内のさまざまなカナリアリリースシナリオをサポートするために、これら両方の戦略を設定する方法について説明します。

ステップ 1:アプリケーションを MSE に接続

Container Service for Kubernetes (ACK) クラスター内のマイクロサービスアプリケーションを Microservice Engine (MSE) に接続します。要件に応じて接続メソッドを選択できます。詳細については、「ACK クラスター内のマイクロサービスアプリケーションを Microservice Engine (MSE) に接続する」をご参照ください。

名前空間による接続

  1. Microservice Engine (MSE) コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、Microservices Governance > Application Governance の順に選択します。

  3. Application list ページで、ACK Application Access をクリックします。

  4. ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    Cluster type

    ACK ClusterACK Serverless Cluster、または ACS Cluster を選択します。

    説明

    Container Service が Microservice Engine (MSE) にアクセスすることを認可していない場合は、[認可] をクリックします。

    Cluster Name/ID

    ターゲットクラスターの Cluster Name/ID を選択します。キーワードで検索できます。

    ack-onepilot

    ack-onepilot の接続ステータスが表示されます。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「Microservice Engine (MSE) コンポーネントのインストールとアップグレード」をご参照ください。

    • ack-onepilot がインストールされていない場合、ACK クラスターを選択すると、システムが自動的にインストールを開始します。「インストールには約 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 を選択します。

単一アプリケーションによる接続

  1. Microservice Engine (MSE) コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、Microservices Governance > Application Governance の順に選択します。

  3. Application list ページで、ACK Application Access をクリックします。

  4. ACK Application Access ダイアログボックスで、パラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    Cluster type

    ACK ClusterACK Serverless Cluster、または ACS Cluster を選択します。

    説明

    Container Service が Microservice Engine (MSE) にアクセスすることを認可していない場合は、[認可] をクリックします。

    Cluster Name/ID

    ターゲットクラスターの Cluster Name/ID を選択します。キーワードで検索できます。

    ack-onepilot

    ack-onepilot の接続ステータスが表示されます。ack-onepilot コンポーネントとそのアップグレード方法の詳細については、「ack-onepilot コンポーネント」および「Microservice Engine (MSE) コンポーネントのインストールとアップグレード」をご参照ください。

    • ack-onepilot がインストールされていない場合、ACK クラスターを選択すると、システムが自動的にインストールを開始します。「インストールには約 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:アプリケーションのデプロイ

  1. Container Service for Kubernetes (ACK) コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト を選択します。

  2. クラスターリスト ページで、ターゲットクラスターをクリックします。左側のナビゲーションウィンドウで、ワークロード > デプロイメント の順に選択します。

  3. [デプロイメント] ページで、Namespaces を選択し、[YAML から作成] をクリックします。

    この例では、レジストリとして Nacos Server をデプロイし、4 つのビジネスアプリケーション (spring-cloud-gateway、spring-cloud-a、spring-cloud-b、spring-cloud-c) をデプロイします。ソースコードは デモからも入手できます。

    • Nacos Server (レジストリ) の YAML

      YAML ファイルの表示

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nacos-server
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nacos-server
        template:
          metadata:
            labels:
              msePilotAutoEnable: "off"
              app: nacos-server
          spec:
            containers:
              - name: nacos-server
                image: 'registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2'
                env:
                  - name: MODE
                    value: standalone
                  - name: JVM_XMS
                    value: 512M
                  - name: JVM_XMX
                    value: 512M
                  - name: JVM_XMN
                    value: 256M
                imagePullPolicy: Always
                livenessProbe:
                  failureThreshold: 3
                  initialDelaySeconds: 15
                  periodSeconds: 10
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                readinessProbe:
                  failureThreshold: 5
                  initialDelaySeconds: 15
                  periodSeconds: 15
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                resources:
                  requests:
                    cpu: '1'
                    memory: 2Gi
            dnsPolicy: ClusterFirst
            restartPolicy: Always
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nacos-server
      spec:
        type: ClusterIP
        ports:
          - name: nacos-server-8848-8848
            port: 8848
            protocol: TCP
            targetPort: 8848
          - name: nacos-server-9848-9848
            port: 9848
            protocol: TCP
            targetPort: 9848
        selector:
          app: nacos-server
    • spring-cloud-c アプリケーションの YAML

      YAML ファイルの表示

      # Source: mse-simple-demo/templates/spring-cloud-c-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-c"
              app: "spring-cloud-c"
          spec:
            containers:
              - name: spring-cloud-c
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                - name: http-port
                  containerPort: 20003
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-b アプリケーションの YAML

      YAML ファイルの表示

      # Source: mse-simple-demo/templates/spring-cloud-b-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-b"
              app: "spring-cloud-b"
          spec:
            containers:
              - name: spring-cloud-b
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20002
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-a アプリケーションの YAML

      YAML ファイルの表示

      # Source: mse-simple-demo/templates/spring-cloud-a-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-a"
              app: "spring-cloud-a"
          spec:
            containers:
              - name: spring-cloud-a
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20001
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • spring-cloud-gateway アプリケーションの YAML

      YAML ファイルの表示

      # Source: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-gateway
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-gateway
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-gateway"
              app: spring-cloud-gateway
          spec:
            containers:
              - image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-gateway:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                  - name: enable.auto
                    value: "true"
                  - name: enable.rpc.invoke
                    value: "true"
                  - name: enable.sql
                    value: "false"
                  - name: enable.sentinel.demo.flow
                    value: "true"
                name: "spring-cloud-gateway"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - containerPort: 20000
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
      ---
      # Source: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
          service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
        name: spring-cloud-gateway-slb
      spec:
        ports:
          - port: 80
            protocol: TCP
            targetPort: 20000
        selector:
          app: spring-cloud-gateway
        type: LoadBalancer

    次のコマンドを実行して、デプロイメントのステータスを確認します。

    kubectl get svc,deploy

    期待される出力:

    NAME                               TYPE           CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
    service/kubernetes                 ClusterIP      172.16.x.x   <none>       443/TCP             23h
    service/nacos-server               ClusterIP      172.16.x.x   <none>       8848/TCP,9848/TCP   94s
    service/spring-cloud-gateway-slb   LoadBalancer   172.16.x.x   8.130.x.x    80:32641/TCP        57s
    NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nacos-server           1/1     1            1           94s
    deployment.apps/spring-cloud-a         1/1     1            1           66s
    deployment.apps/spring-cloud-b         1/1     1            1           74s
    deployment.apps/spring-cloud-c         1/1     1            1           83s
    deployment.apps/spring-cloud-gateway   1/1     1            1           57s

ステップ 3:spring-cloud-c と spring-cloud-a のカナリアバージョンをデプロイ

  1. ACK コンソールにログインします。 次の YAML を使用して、spring-cloud-c アプリケーションのカナリアバージョンをデプロイします。

    YAML ファイル

    # Source: mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-c-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-c"
            alicloud.service.tag: gray
            app: "spring-cloud-c-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-c
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20002
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100
  2. 次の YAML を使用して、spring-cloud-a アプリケーションのカナリアバージョンをデプロイします。

    YAML ファイル

    # Source: mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-a-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-a"
            alicloud.service.tag: gray
            app: "spring-cloud-a-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-a
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20001
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100

ステップ 4:カナリアレーングループの作成

  1. MSE ガバナンスセンターコンソールにログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、 の順に選択します。

  3. End-to-end Canary Release ページで、ページ上部のマイクロサービス名前空間を選択します。選択したマイクロサービス名前空間にレーングループが存在しない場合は、[レーングループとレーンの作成] をクリックします。レーングループが既に存在する場合は、[+ レーングループの作成] をクリックします。

  4. [レーングループの作成] パネルで、[+ レーングループの作成] をクリックします。[レーングループの作成] ページで、次のパラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    レーングループ名

    レーングループのカスタム名を入力します。

    Ingress タイプ

    [Java サービスゲートウェイ] を選択します。

    Ingress アプリケーション

    [spring-cloud-gateway] を選択します。

    レーングループアプリケーション

    spring-cloud-aspring-cloud-b、および spring-cloud-c を選択します。

    レーングループが作成されると、End-to-end Canary Release ページの [レーングループ] セクションで表示できます。レーングループを編集するには、编辑 アイコンをクリックします。

ステップ 5:カナリアレーンの作成

説明
  • エンドツーエンドカナリアリリース機能を使用するには、他のノードと区別するために、カナリアアプリケーションに特別な tag を追加します。コンテナ環境では、spec.template.metadata.labels の下に alicloud.service.tag: ${tag} を追加します。ECS 環境では、Java 起動パラメーター -Dalicloud.service.tag=${tag} を追加します。

  • エンドツーエンドカナリアリリースの Ingress として Java マイクロサービスゲートウェイを使用する場合、MSE は 2 つのレーンルーティングモードをサポートします。

    • コンテンツによるカナリアリリース:リクエストのコンテンツからカナリアトラフィックを識別できる場合に推奨されるモードです。識別できない場合は、システムを変更してリクエストに一意の識別子を含めるようにしてください。これにより、セッション内のすべてのリクエストが一貫してルーティングされるようになります。

    • 比率によるカナリアリリース:リクエストのコンテンツからカナリアトラフィックを識別できず、レガシーシステムを変更できない場合のフォールバックとしてこのモードを使用します。欠点は、同じソースからのリクエストが異なるレーンにルーティングされ、動作に一貫性がなくなる可能性があることです。

  • レーンルーティングモードは、レーングループ内のすべてのレーンで一貫している必要があります。ゲートウェイルーティングルールのパスとレーンルーティングモードは、グループ内の最初のレーンを作成するときにのみ調整できます。

  1. End-to-end Canary Release ページの下部で、[最初の分割スイムレーンを作成] をクリックします。選択したマイクロサービススペースにスイムレーンがすでに存在する場合は、[スイムレーンを作成] をクリックします。

  2. [レーンの作成] パネルで、レーンのパラメーターを設定し、OK をクリックします。

パラメーター

説明

ノードタグの追加

カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。

レーン情報の入力

レーンタグ:レーンルールに一致するトラフィックの宛先タグ。

一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。

ルーティングとカナリアリリースルールの設定

このレーンにトラフィックをルーティングするためのルールを定義します。

  • パスを入力します。空のままにすると、すべてのパスが一致します。

  • カナリアリリースモード[比率によるカナリアリリース] を選択します。

  • トラフィックの割合:30%。

説明

ゲートウェイパスごとに異なるトラフィックの割合を設定することもできます。この機能を使用する場合、すべてのレーングループにわたる同じパスの合計トラフィック割合が 100% を超えないようにしてください。

コンテンツによるルート

パラメーター

説明

ノードタグの追加

カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。

レーン情報の入力

レーンタグ:このレーンの条件に一致するトラフィックの宛先タグ。この例では、レーンタグを gray に設定します。

一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。

ルーティングとカナリアリリースルールの設定

ルーティングルールの条件を設定します。

  • パスを入力します。空のままにすると、すべてのパスが一致します。

  • カナリアリリースモード[コンテンツによるカナリアリリース] を選択します。

  • カナリアリリース条件:新しいルールを追加し、[すべての条件を満たす] を選択します。

    この例では、パラメーター name の値が xiaoming であるリクエストをルーティングする条件を設定します。

    • パラメータータイプ:パラメーター

    • パラメーター:name

    • 条件:==

    • :xiaoming

比率によるルート
重要

MSE Java エージェントがバージョン 3.2.3 以降であることを確認してください。そうでない場合、パーセンテージベースのカナリアリリースが正しく機能しない可能性があります。

パラメーター

説明

ノードタグの追加

カナリアアプリケーションノードに手動でタグを追加して、通常のノードと区別します。

レーン情報の入力

レーンタグ:このレーンの条件に一致するトラフィックの宛先タグ。この例では、レーンタグを gray に設定します。

一致関係の確認:このタグを持つアプリケーションノードの数が正しいことを確認します。

ルーティングとカナリアリリースルールの設定

ルーティングルールの条件を設定します。

  • パスを入力します。空のままにすると、すべてのパスが一致します。

  • カナリアリリースモード[比率によるカナリアリリース] を選択します。

  • トラフィックの割合:30%。

レーンを作成した後、End-to-end Canary Release ページの [トラフィック分散] セクションでその詳細を表示し、次の操作を実行できます。

  • Actions 列で、[有効化] をクリックします。これにより、レーンがアクティブになり、そのルールに従ってトラフィックがルーティングされます。ルールに一致するトラフィックは、対応するレーンタグを持つアプリケーションバージョンに優先的にルーティングされます。そのようなバージョンが存在しない場合、トラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。

  • Actions 列で、Close をクリックします。これにより、レーンが無効になり、後続のトラフィックはタグ付けされていないアプリケーションバージョンにルーティングされます。

  • 图标 アイコンをクリックして、レーンのトラフィックの割合を表示します。

  • 应用状态图标 アイコンをクリックして、レーン内のアプリケーションのステータスを設定します。

ステップ 6:ベーストラフィックとカナリアトラフィックのテスト

リクエストコンテンツ別
  1. 次の curl コマンドを実行して、ベーストラフィックをテストします。

    curl 8.130.x.x/A/a
    A[192.168.x.x][config=base] -> B[192.168.x.x] -> C[192.168.x.x]
    説明

    コマンド内の 8.130.x.x は、Spring Cloud Gateway によって公開されるパブリック IP アドレスです。

  2. 次の curl コマンドを実行して、カナリアトラフィックをテストします。

    curl 8.130.x.x/A/a?name=xiaoming
    Agray[192.168.x.x][config=base] -> B[192.168.x.x] -> Cgray[192.168.x.x]
    説明
    • リクエストにパラメーター name=xiaoming が含まれている場合、それはカナリアタグに一致し、そのタグがダウンストリームに伝播されます。

    • たとえば、アプリケーション A と C に送信されたカナリアタグ付きのリクエストは、アプリケーション A と C のカナリアノードにルーティングされます。

    • リクエストがアプリケーション B に到達すると、アプリケーション B のカナリアノードが存在しないため、ベースノードにルーティングされます。

比率別

比率によるトラフィック分割をテストするには、次の Python 3 スクリプトを使用します。requests パッケージがインストールされていることを確認し、x.x.x.x をご利用の Spring Cloud Gateway の Ingress SLB アドレスに置き換えてください。

# pip3 install requests
# python3 traffic.py
import requests
TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/A/a'
def parse_tag(text:str):
    '''
    A[10.0.23.64][config=base] -> B[10.0.23.65] -> C[10.0.23.61]
    Agray[10.0.23.64][config=base] -> B[10.0.23.65] -> Cgray[10.0.23.61]
    Ablue[10.0.23.64][config=base] -> B[10.0.23.65] -> Cblue[10.0.23.61]
    '''
    print(text)
    app_parts = text.split(' -> ')
    # tag_app: C[10.0.23.61] / Cgray[10.0.23.61]
    tag_app = app_parts[-1]
    splits = tag_app.split('[')
    # tag_part: C / Cgray
    tag_part = splits[0]
    tag = tag_part[1:]
    return tag if len(tag) > 0 else 'base'
def get_tag(url:str):
    resp = requests.get(url)
    resp.encoding = resp.apparent_encoding
    return parse_tag(resp.text)
def cal_tag_count(url:str, total_request:int):
    count_map = {}
    for i in range(total_request):
        tag = get_tag(url)
        if tag not in count_map:
            count_map[tag] = 1
        else:
            count_map[tag] += 1
    print()
    print('Total Request:', total_request)
    print('Traffic Distribution:', count_map)
if __name__ == '__main__':
    cal_tag_count(ENTRY_URL, TOTAL_REQUEST)

スクリプトを実行すると、出力にはトラフィックの約 30% がカナリア環境にルーティングされていることが示されます。

ステップ 7:可観測性

アプリケーションの問題が発生した場合、MSE の可観測性を使用して例外データを表示し、問題を迅速に特定します。

マイクロサービスガバナンスの可観測性

MSE マイクロサービスガバナンスの End-to-end Canary Release ページで、ターゲットアプリケーションをクリックします。[アプリケーション QPS モニタリング] セクションには、対応するレーンのベースバージョンとカナリアバージョンのトラフィックデータが表示されます。

image

  • 合計 QPS:アプリケーションの合計秒間クエリ数 (QPS)。

  • 例外 QPS:アプリケーションの失敗したリクエスト数。

  • カナリアQPS:アプリケーションのカナリアバージョンの秒間クエリ数 (QPS)。

関連ドキュメント