All Products
Search
Document Center

Microservices Engine:Terapkan rilis canary ujung ke ujung menggunakan gateway cloud-native MSE

Last Updated:Mar 19, 2026

Merilis versi baru dari beberapa layanan mikro secara bersamaan memerlukan cara untuk menguji semuanya sekaligus sebelum mengarahkan seluruh traffic produksi ke versi tersebut. Rilis canary ujung ke ujung mengarahkan permintaan dengan karakteristik tertentu melalui versi canary dari setiap layanan dalam rantai panggilan, sementara traffic biasa tetap mengalir melalui versi dasar. Jika suatu layanan tidak memiliki versi canary, traffic secara otomatis dialihkan kembali ke versi dasarnya.

Microservices Engine (MSE) menerapkan rilis canary ujung ke ujung dengan menggabungkan gateway cloud-native dan Microservices Governance. Definisikan jalur lalu lintas terisolasi untuk versi canary aplikasi Anda, konfigurasikan aturan routing di gateway, dan biarkan MSE menyebarkan aturan tersebut ke seluruh rantai panggilan—tanpa perubahan kode bisnis.

Implementation process

Konsep utama

ConceptDescription
LaneLingkungan runtime terisolasi untuk aplikasi dengan versi yang sama. Hanya permintaan yang sesuai dengan aturan routing tertentu yang mencapai aplikasi bertag dalam suatu lane. Aplikasi dan lane memiliki hubungan banyak-ke-banyak.
Lane groupKumpulan lane yang membedakan antara tim atau skenario berbeda.
Base environmentLingkungan tempat aplikasi tanpa tag berjalan. Lingkungan ini menyediakan pemulihan bencana bagi lingkungan lainnya.
MSE Cloud-native GatewayGateway yang kompatibel dengan Kubernetes Ingress dan mendukung penemuan layanan dari berbagai sumber, termasuk kluster Container Service for Kubernetes (ACK) dan instans Nacos.

Skenario contoh

Skenario pemesanan e-commerce berikut menunjukkan rilis canary ujung ke ujung dari gateway cloud-native MSE hingga backend Spring Cloud.

Arsitektur mencakup tiga aplikasi:

ApplicationRolePort
Application APusat transaksi20001
Application BPusat komoditas20002
Application CPusat inventaris20003

Rantai panggilan adalah: Client > MSE cloud-native gateway > A > B > C

Penemuan layanan menggunakan instans MSE Nacos. Akses berbasis klien dan berbasis HTML ke aplikasi backend didukung.

Versi baru dirilis untuk Application A dan Application C. Sebelum diluncurkan secara penuh, uji versi canary melalui rilis canary ujung ke ujung. Application B tidak memiliki versi canary, sehingga tetap melayani dari versi dasarnya.

Scenario diagram

Batasan

Prasyarat

Sebelum memulai, pastikan Anda telah:

Penting

Versi agen Java MSE harus 3.2.3 atau lebih baru. Versi sebelumnya dapat menyebabkan masalah.

Catatan MSE cloud-native gateway harus dideploy di virtual private cloud (VPC) yang sama dengan kluster ACK atau instans MSE Nacos Anda.

Langkah 1: Deploy versi dasar aplikasi backend

  1. Masuk ke Konsol ACK.

  2. Pada panel navigasi kiri, klik Clusters. Lalu, klik nama kluster target.

  3. Pada panel navigasi kiri, pilih Workloads > Deployments.

  4. Pilih namespace dan klik Create from YAML.

  5. Tempel kode YAML untuk Application A, Application B, dan Application C. Pilih YAML yang sesuai berdasarkan sumber layanan Anda.

Gunakan instans MSE Nacos sebagai sumber layanan

Penting

Ganti {nacos server address} dengan titik akhir internal instans MSE Nacos Anda dan hapus tanda kurung kurawal {}.

Show YAML code

# Base version of Application A
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        app: spring-cloud-a
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-a
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 30
          periodSeconds: 60
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: {nacos server address}
        - name: dubbo.registry.address
          value: 'nacos://{nacos server address}:8848'
---
# Base version of Application B
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-b
  template:
    metadata:
      labels:
        app: spring-cloud-b
        msePilotCreateAppName: spring-cloud-b
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-b
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20002
        livenessProbe:
          tcpSocket:
            port: 20002
          initialDelaySeconds: 30
          periodSeconds: 60
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: {nacos server address}
        - name: dubbo.registry.address
          value: 'nacos://{nacos server address}:8848'
---
# Base version of Application C
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        app: spring-cloud-c
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20003
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 30
          periodSeconds: 60
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: {nacos server address}
        - name: dubbo.registry.address
          value: 'nacos://{nacos server address}:8848'

Gunakan kluster ACK sebagai sumber layanan

  1. Deploy instans Nacos yang dikelola sendiri sebagai registri layanan.

Penting

Kode YAML di bawah ini mendaftarkan titik akhir versi dasar ke instans Nacos yang dikelola sendiri.

Show YAML code for the self-managed Nacos instance

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
  1. Deploy versi dasar Application A, Application B, dan Application C.

Show YAML code for base versions (ACK service source)

# Base version of Application A
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        app: spring-cloud-a
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-a
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 30
          periodSeconds: 60
        # Access the self-managed Nacos instance
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
---
# Base version of Application B
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-b
  template:
    metadata:
      labels:
        app: spring-cloud-b
        msePilotCreateAppName: spring-cloud-b
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-b
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20002
        livenessProbe:
          tcpSocket:
            port: 20002
          initialDelaySeconds: 30
          periodSeconds: 60
        # Access the self-managed Nacos instance
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
---
# Base version of Application C
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        app: spring-cloud-c
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20003
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 30
          periodSeconds: 60
        # Access the self-managed Nacos instance
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'
  1. Buat Kubernetes Service untuk Application A agar gateway dapat mengarahkan traffic kepadanya.

Show YAML code for the Application A service

apiVersion: v1
kind: Service
metadata:
  name: sc-a
  namespace: default
spec:
  ports:
    - port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a
  type: ClusterIP

Langkah 2: Ekspos Application A melalui gateway

Konfigurasikan MSE cloud-native gateway untuk mengarahkan traffic eksternal ke Application A. Pilih salah satu pendekatan berikut berdasarkan apakah layanan tersebut sudah ditambahkan.

Tambahkan layanan baru

Jika Application A belum ditambahkan ke gateway, tambahkan terlebih dahulu:

  1. Masuk ke Konsol MSE. Pada panel navigasi kiri, pilih MSE Cloud-native Gateway > Gateways dan klik nama gateway. Pada panel navigasi kiri, klik Routes. Pada tab Services, klik Add Service. Untuk detail, lihat Add a service.

    • ACK cluster sebagai sumber layanan: Atur Service Source ke Container Service, namespace ke default, dan Services ke sc-a.

    • Instans MSE Nacos sebagai sumber layanan: Atur Service Source ke MSE Nacos, namespace ke public, dan Services ke sc-A.

  2. Pada tab Routes, klik Add Route untuk membuat entri rute untuk sc-a (atau sc-A). Untuk detail, lihat Create a route.

    ParameterValue
    PathPilih Prefix dan masukkan /a
    Route PointPilih Single Service
    Backend ServicePilih sc-A

Gunakan layanan yang sudah ada

Jika Application A sudah diimpor, ubah entri rute yang ada:

  1. Masuk ke Konsol MSE. Pada panel navigasi kiri, pilih MSE Cloud-native Gateway > Gateways dan klik nama gateway. Pada tab Routes, ubah entri rute.

    ParameterValue
    PathPilih Prefix dan masukkan /a
    Route PointPilih Single Service
    Backend ServicePilih sc-A

Langkah 3: Verifikasi traffic versi dasar

  1. Masuk ke Konsol MSE. Pilih wilayah pada bilah navigasi atas.

  2. Di panel navigasi sebelah kiri, pilih Cloud-native Gateway > Gateways, lalu klik nama gerbang.

  3. Pada panel navigasi kiri, klik Overview. Pada tab Endpoint, temukan alamat IP ingress instans Server Load Balancer (SLB).

  4. Kirim permintaan untuk memverifikasi bahwa traffic mengalir melalui versi dasar:

# Ganti x.x.1.1 dengan alamat IP ingress SLB
curl x.x.1.1/a

Output yang diharapkan:

A[10.0.3.178][config=base] -> B[10.0.3.195] -> C[10.0.3.201]

Application B dan Application C tidak memiliki akhiran versi, yang mengonfirmasi bahwa seluruh traffic mengalir melalui versi dasar.

Langkah 4: Deploy versi canary Application A dan Application C

Application A dan Application C menerima pembaruan fitur baru. Application B tetap tidak berubah dan hanya menjalankan versi dasar.

  1. Masuk ke Konsol ACK.

  2. Pada panel navigasi kiri, klik Clusters. Lalu, klik nama kluster target.

  3. Pada panel navigasi kiri, pilih Workloads > Deployments.

  4. Pilih namespace dan klik Create from YAML.

  5. Tempel kode YAML untuk versi canary Application A dan Application C. Pilih YAML yang sesuai berdasarkan sumber layanan Anda.

Gunakan instans MSE Nacos sebagai sumber layanan

Penting

Ganti {nacos server address} dengan titik akhir internal instans MSE Nacos Anda dan hapus tanda kurung kurawal {}.

Show YAML code

# Canary version of Application A
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a-gray
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-a-gray
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        app: spring-cloud-a-gray
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-a
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 30
          periodSeconds: 60
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: {nacos server address}
        - name: dubbo.registry.address
          value: 'nacos://{nacos server address}:8848'
---
# Canary version of Application C
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c-gray
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-c-gray
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        app: spring-cloud-c-gray
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20003
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 30
          periodSeconds: 60
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: {nacos server address}
        - name: dubbo.registry.address
          value: 'nacos://{nacos server address}:8848'

Gunakan kluster ACK sebagai sumber layanan

YAML canary menambahkan alicloud.service.tag: gray ke spec.template.metadata.labels untuk membedakan node canary dari node dasar.

Penting

Titik akhir versi canary didaftarkan ke instans Nacos yang dikelola sendiri.

Show YAML code

# Canary version of Application A
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a-gray
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        app: spring-cloud-a
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-a
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 30
          periodSeconds: 60
        # Access the self-managed Nacos instance
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'

---
# Canary version of Application C
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c-gray
  namespace: default
spec:
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        app: spring-cloud-c
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1
        imagePullPolicy: Always
        ports:
          - containerPort: 20003
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 30
          periodSeconds: 60
        # Access the self-managed Nacos instance
        env:
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server
        - name: dubbo.registry.address
          value: 'nacos://nacos-server:8848'

Langkah 5: Buat lane group

Lane group menentukan kumpulan aplikasi yang berpartisipasi dalam rilis canary.

  1. Masuk ke Konsol MSE dan pilih wilayah pada bilah navigasi atas.

  2. Pada panel navigasi kiri, pilih Microservices Governance > Full link grayscale.

  3. Klik Create Lane Group and Lane. Jika lane group sudah ada di namespace layanan mikro yang dipilih, klik Create Lane Group.

  4. Pada panel Create Lane Group, konfigurasikan parameter berikut dan klik OK:

    ParameterValue
    Lane Group NameMasukkan nama untuk lane group
    Ingress TypePilih MSE Cloud-native Gateway
    Ingress GatewayPilih gateway cloud-native target
    Lane Group ApplicationPilih spring-cloud-a, spring-cloud-b, dan spring-cloud-c

    Create lane group

Setelah dibuat, lane group muncul di bagian Lane Group pada halaman Full link grayscale. Untuk mengubahnya, klik ikon edit.

Langkah 6: Buat lane

Lane menentukan aturan routing yang mengarahkan traffic tertentu ke versi canary aplikasi Anda.

Catatan
  • Tag node aplikasi canary untuk membedakannya dari node dasar. Di lingkungan kontainer, tambahkan alicloud.service.tag: ${tag} ke spec.template.metadata.labels. Di lingkungan Elastic Compute Service (ECS), tambahkan parameter startup Java -Dalicloud.service.tag=${tag}.
  • Mode routing lane harus sama untuk semua lane dalam satu lane group. Anda hanya dapat mengatur mode saat membuat lane pertama.

MSE mendukung dua mode routing ketika tipe ingress adalah MSE Cloud-native Gateway:

Routing modeWhen to useBehavior
Routing by request contentKonten permintaan (header, parameter) dapat mengidentifikasi traffic canaryPermintaan canary tetap berada dalam lingkungan yang sama sepanjang rantai panggilan
Routing by percentageKonten permintaan tidak dapat mengidentifikasi traffic canary dan sistem tidak dapat dimodifikasi untuk menambahkan pengenalPermintaan dari sumber yang sama dapat diarahkan ke lane berbeda

Buat lane dengan routing berdasarkan konten permintaan

  1. Di bagian bawah halaman Full link grayscale, klik Create First Split Lane (atau Create Lane jika lane sudah ada).

  2. Pada panel Create Lane, konfigurasikan parameter berikut dan klik OK:

    ParameterConfiguration
    Add Node TagTambahkan tag ke node aplikasi canary untuk membedakannya dari node dasar
    Enter lane informationAtur Lane Tag ke nilai tag untuk permintaan yang diarahkan ke lane ini. Gunakan Confirm Matching Relationship untuk memverifikasi jumlah node bertag yang diharapkan
    Add Canary Release RuleAtur Canary Release Mode ke Canary Release by Content. Atur Canary Release Condition ke Meet All Conditions. Konfigurasikan kondisi: Parameter Type = Header, Parameter = canary, Condition = ==, Value = gray

Canary release conditions

ConditionEffect
Meet All ConditionsMengarahkan traffic yang memenuhi semua kondisi yang ditentukan
Meet Any ConditionMengarahkan traffic yang memenuhi setidaknya satu kondisi yang ditentukan

Condition operators

OperatorDescription
==Pencocokan eksak. Nilai traffic harus persis sama dengan nilai kondisi.
!=Tidak sama. Nilai traffic harus berbeda dari nilai kondisi.
inPencocokan inklusif. Nilai traffic harus ada dalam daftar yang ditentukan.
PercentagePencocokan berbasis hash. Mengarahkan traffic ketika hash(get(key)) % 100 < value.
Regular expressionPencocokan regex. Nilai traffic harus sesuai dengan pola yang ditentukan.

Buat lane dengan routing berdasarkan persentase

Catatan Routing berdasarkan persentase memerlukan ack-onepilot versi 3.0.18 atau lebih baru dan versi agen 3.2.3 atau lebih baru.
  1. Di bagian bawah halaman Full link grayscale, klik Create First Split Lane (atau Create Lane jika lane sudah ada).

  2. Pada panel Create Lane, konfigurasikan parameter berikut dan klik OK:

    ParameterConfiguration
    Add Node TagTambahkan tag ke node aplikasi canary untuk membedakannya dari node dasar
    Enter lane informationAtur Lane Tag ke nilai tag untuk permintaan yang diarahkan ke lane ini. Gunakan Confirm Matching Relationship untuk memverifikasi jumlah node bertag yang diharapkan
    Configure Routing and Canary Release RulesAtur Canary Release Mode ke Canary Release by Ratio. Atur Flow ratio ke 30 (persentase)
Catatan Anda juga dapat mengonfigurasi persentase traffic berbeda untuk setiap entri rute dasar gateway. Jika diaktifkan, jumlah persentase traffic di seluruh lane group untuk entri rute dasar tertentu tidak boleh melebihi 100%.

Mengelola jalur

Setelah membuat lane, lane tersebut muncul di bagian Traffic Distribution pada halaman Full link grayscale. Tindakan yang tersedia:

ActionEffect
EnableMengaktifkan lane sehingga traffic diarahkan berdasarkan konfigurasi lane. Traffic yang sesuai diarahkan ke versi aplikasi bertag. Jika tidak ada versi bertag, traffic dialihkan kembali ke versi tanpa tag.
DisableMenonaktifkan lane. Seluruh traffic diarahkan ke versi aplikasi tanpa tag.

Anda juga dapat melihat persentase traffic lane dan mengonfigurasi status aplikasi dalam lane dari halaman ini.

Langkah 7: Verifikasi traffic canary

Verifikasi routing berdasarkan konten permintaan

Kirim permintaan dengan header canary: gray untuk menguji apakah traffic mengalir melalui versi canary:

# Ganti x.x.x.x dengan alamat IP ingress SLB
curl -H "canary: gray" x.x.x.x/a

Output yang diharapkan:

Agray[10.0.3.177][config=base] -> B[10.0.3.195] -> Cgray[10.0.3.180]

Akhiran gray pada Application A dan Application C mengonfirmasi bahwa traffic canary mencapai versi canary. Application B tidak memiliki versi canary, sehingga traffic diarahkan ke versi dasarnya.

Verifikasi routing berdasarkan persentase

Jalankan skrip Python berikut untuk menguji distribusi traffic. Ganti x.x.x.x dengan alamat IP SLB gateway cloud-native.

pip3 install requests
python3 traffic.py

Expand to view the Python script

import requests


TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/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]
    '''
    print(text)
    app_parts = text.split(' -> ')
    tag_app = app_parts[-1]

    splits = tag_app.split('[')
    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)

Hasil yang diharapkan: sekitar 30% permintaan diarahkan ke lingkungan canary.

Percentage routing test result

(Opsional) Pantau traffic canary

Pantau traffic canary dari lokasi berikut untuk mengidentifikasi masalah sedini mungkin.

Pantau dari gateway cloud-native

Pada halaman Routes MSE cloud-native gateway, klik tab Services. Klik nama layanan target, lalu lihat data metrik pada tab Monitor.

Gateway monitoring

Pantau dari Microservices Governance

Pada halaman Full link grayscale, klik aplikasi target. Di bagian QPS Data, lihat data traffic untuk versi dasar dan canary:

MetricDescription
Total QPSTotal permintaan per detik untuk aplikasi
Exception QPSJumlah permintaan error untuk aplikasi
GrayQPSPermintaan per detik untuk versi canary
Microservices Governance monitoring

Pantau dari Application Real-Time Monitoring Service (ARMS)

Jika aplikasi terhubung ke ARMS, lihat data traffic canary pada tab Full link grayscale di halaman Scenario-based Analysis di Konsol ARMS. Gunakan data ini untuk memutuskan apakah akan rollback atau melanjutkan rilis penuh.

ARMS monitoring

Langkah selanjutnya

  • Setelah memverifikasi bahwa versi canary stabil, promosikan dengan memperbarui deployment dasar untuk menggunakan versi gambar baru dan menghapus deployment canary.

  • Untuk rollback, nonaktifkan lane dan hapus deployment canary. Seluruh traffic secara otomatis kembali ke versi dasar.