全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan label lalu lintas untuk mengimplementasikan rilis canary ujung ke ujung

更新时间:Jun 28, 2025

Untuk mengimplementasikan rilis canary ujung ke ujung pada beberapa layanan, Anda dapat mengonfigurasi label lalu lintas guna mengidentifikasi karakteristik lalu lintas dan membagi lalu lintas masuk gateway menjadi lalu lintas reguler dan lalu lintas canary. Karakteristik lalu lintas canary dilewatkan di antara layanan yang digunakan untuk memproses permintaan pengguna, sehingga mewujudkan rilis canary ujung ke ujung. Topik ini menjelaskan cara menggunakan label lalu lintas untuk mengimplementasikan rilis canary ujung ke ujung pada layanan mikro.

Prasyarat

Deskripsi fitur

Rilis canary dapat diimplementasikan melalui berbagai metode. Misalnya, Anda dapat menggunakan ASM untuk menerapkan aplikasi dalam mode rilis biru-hijau dan mode rilis bertahap. Mode sampel ini cocok untuk rilis layanan tunggal dan menggunakan VirtualService dari Istio sumber terbuka untuk menentukan bobot lalu lintas setiap versi layanan. Namun, mode ini tidak dapat memenuhi persyaratan dalam skenario rilis canary layanan ganda.

ASM menyediakan fitur rilis canary ujung ke ujung berdasarkan pelabelan lalu lintas dan pengarahan berbasis label. Fitur ini memungkinkan Anda mengimplementasikan rilis canary untuk beberapa layanan secara bersamaan. Selama pengujian canary bisnis, sistem membagi lalu lintas masuk menjadi lalu lintas reguler dan lalu lintas canary serta mengidentifikasi karakteristik lalu lintas. Jika lalu lintas permintaan diidentifikasi sebagai lalu lintas canary, permintaan tersebut diarahkan ke layanan rilis canary. Dengan demikian, sistem tidak hanya mendistribusikan lalu lintas ke layanan backend versi berbeda berdasarkan rasio tertentu, tetapi juga melewatkan karakteristik lalu lintas canary di antara semua layanan yang digunakan untuk memproses permintaan pengguna. Untuk informasi lebih lanjut, lihat Label Lalu Lintas.

Deskripsi konfigurasi

Anda dapat klik di sini untuk mengunduh file konfigurasi contoh. Gambar berikut menunjukkan rantai panggilan layanan dalam contoh:

应用服务调用链路

Dalam contoh ini, ketika Layanan A memanggil Layanan B, Layanan A berisi logika implementasi kode untuk melewatkan header HTTP my-trace-id. Untuk informasi lebih lanjut, lihat file konfigurasi main.go di jalur src/mock-abc/go/main.go.

Catatan

Jika Anda menggunakan aplikasi lain, pastikan aplikasi tersebut berisi logika untuk melewatkan header HTTP. Fungsi selanjutnya bergantung pada header HTTP.

File Penerapan Aplikasi untuk Versi Dasar: application-base.yaml

apiVersion: v1
kind: Service
metadata:
  name: mocka
  labels:
    app: mocka
    service: mocka
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mocka
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mocka-base
  labels:
    app: mocka
    version: base
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mocka
      version: base
  template:
    metadata:
      labels:
        app: mocka
        version: base
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: base
        - name: app
          value: mocka
        - name: upstream_url
          value: "http://mockb:8000/"
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: mockb
  labels:
    app: mockb
    service: mockb
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mockb
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mockb-base
  labels:
    app: mockb
    version: base
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mockb
      version: base
  template:
    metadata:
      labels:
        app: mockb
        version: base
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: base
        - name: app
          value: mockb
        ports:
        - containerPort: 8000
                

File Penerapan Aplikasi untuk Versi Rilis Canary: application-canary.yaml

apiVersion: v1
kind: Service
metadata:
  name: mocka
  labels:
    app: mocka
    service: mocka
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mocka
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mocka-canary
  labels:
    app: mocka
    version: canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mocka
      version: canary
  template:
    metadata:
      labels:
        app: mocka
        version: canary
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: canary
        - name: app
          value: mocka
        - name: upstream_url
          value: "http://mockb:8000/"
        ports:
        - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: mockb
  labels:
    app: mockb
    service: mockb
spec:
  ports:
  - port: 8000
    name: http
  selector:
    app: mockb
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mockb-canary
  labels:
    app: mockb
    version: canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mockb
      version: canary
  template:
    metadata:
      labels:
        app: mockb
        version: canary
    spec:
      containers:
      - name: default
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/go-http-sample:tracing
        imagePullPolicy: Always
        env:
        - name: version
          value: canary
        - name: app
          value: mockb
        ports:
        - containerPort: 8000
                

Langkah 1: Terapkan layanan contoh di kluster ACK

  1. Aktifkan injeksi proxy sidecar otomatis untuk namespace yang diinginkan (namespace default dalam contoh ini). Untuk informasi lebih lanjut, lihat Aktifkan Injeksi Proxy Sidecar Otomatis.

  2. Gunakan kubectl untuk terhubung ke kluster ACK berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk menerapkan layanan contoh.

    Untuk informasi lebih lanjut tentang file YAML, lihat Deskripsi Konfigurasi.

    kubectl apply -n default -f application-base.yaml
    kubectl apply -n default -f application-canary.yaml

Langkah 2: Konfigurasikan aturan pengarahan awal

  1. Buat file bernama routing.yaml dan salin konten berikut ke file tersebut:

    Konten routing.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: simple-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mocka
    spec:
      host: mocka
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
      subsets:
        - labels:
            version: base
          name: version-base
        - labels:
            version: canary
          name: version-canary
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: dr-mockb
    spec:
      host: mockb
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
      subsets:
        - labels:
            version: base
          name: version-base
        - labels:
            version: canary
          name: version-canary
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mockb
    spec:
      hosts:
        - mockb
      http:
        - route:
            - destination:
                host: mockb
  2. Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk mengonfigurasi aturan pengarahan:

    kubectl apply -n default -f routing.yaml
  3. Periksa apakah layanan versi berbeda dapat diakses.

    1. Dapatkan alamat IP publik gateway masuk di Konsol ASM. Untuk informasi lebih lanjut, lihat Langkah 2: Dapatkan Alamat IP Gateway Masuk ASM.

    2. Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan.

      xxxx adalah alamat IP yang diperoleh di Sublangkah a.

      export ASM_GATEWAY_IP=xxxx
    3. Jalankan perintah berikut untuk memeriksa apakah layanan versi berbeda dapat diakses:

      for i in {1..200};  do curl   -H'my-asm-prefer-tag: version-base'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

      Output yang Diharapkan:

      -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
      -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
      -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
      -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)
      -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
      -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
      -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)

      Output menunjukkan bahwa kebijakan pengarahan beban seimbang acak diadopsi untuk aliran lalu lintas dari gateway masuk ke Layanan A dan dari Layanan A ke Layanan B. Header my-asm-prefer-tag atau header permintaan lain yang ditentukan menggunakan perintah curl tidak mengubah kebijakan pengarahan acak.

Langkah 3: Konfigurasikan label lalu lintas untuk layanan contoh

ASM memungkinkan Anda mengonfigurasi label lalu lintas menggunakan CustomResourceDefinition (CRD) TrafficLabel dan mengarahkan lalu lintas ke workload berbeda berdasarkan label lalu lintas. Untuk informasi lebih lanjut, lihat Label Lalu Lintas.

  1. Buat file bernama trafficlabel.yaml dan salin konten berikut ke file tersebut:

    Konten trafficlabel.yaml

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: trafficlabel-ns
      namespace: default
    spec:
      rules:
      - labels:
        - name: asm-labels-sample
          valueFrom:
          - $getExternalInboundRequestHeader(my-asm-prefer-tag, my-trace-id)
    ---
    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: ingressgateway
      namespace: istio-system
    spec:
      rules:
      - labels:
        - name: asm-labels-sample
          valueFrom:
          - $getInboundRequestHeader(my-asm-prefer-tag)
      workloadSelector:
        labels:
          istio: ingressgateway

    Deskripsi Konfigurasi:

    • Label lalu lintas trafficlabel-ns berlaku untuk semua layanan di namespace default, seperti layanan mocka dan mockb yang diterapkan dalam contoh ini. Label lalu lintas ingressgateway hanya berlaku untuk gateway ingressgateway.

    • Dalam contoh ini, header permintaan my-asm-prefer-tag digunakan untuk membedakan versi. Oleh karena itu, setel parameter pertama dalam getExternalInboundRequestHeader ke my-asm-prefer-tag. Modifikasi konfigurasi berdasarkan kebutuhan bisnis Anda.

    • Dalam contoh ini, my-trace-id adalah header HTTP yang perlu dilewatkan. Oleh karena itu, setel parameter kedua dalam getExternalInboundRequestHeader ke my-trace-id. Modifikasi konfigurasi berdasarkan kebutuhan bisnis Anda.

  2. Gunakan kubectl untuk terhubung ke instance ASM berdasarkan informasi dalam file kubeconfig dan jalankan perintah berikut untuk mengonfigurasi label lalu lintas:

    kubectl apply -f trafficlabel.yaml

Langkah 4: Konfigurasikan aturan pengarahan berbasis label

Anda dapat mengonfigurasi aturan pengarahan berbasis label untuk mengontrol aliran lalu lintas.

1. Periksa rilis canary di sisi penyedia layanan

Periksa apakah pengarahan lalu lintas dari Layanan A ke Layanan B sesuai harapan. Secara spesifik, periksa apakah lalu lintas canary yang mengalir ke Layanan A diteruskan ke versi rilis canary Layanan B, dan apakah lalu lintas dasar yang mengalir ke Layanan A diteruskan ke versi dasar Layanan B.

Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis label dikonfigurasi untuk Layanan B:验证服务提供侧的灰度

  1. Buat file bernama vs-tf-mockb.yaml dan salin konten berikut ke file tersebut:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-mockb
    spec:
      hosts:
        - mockb
      http:
        - route:
            - destination:
                host: mockb
                subset: $asm-labels-sample
  2. Jalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk Layanan A:

    kubectl apply -n default -f vs-tf-mockb.yaml
  3. Jalankan perintah berikut untuk memeriksa apakah lalu lintas canary yang mengalir ke Layanan A diteruskan ke versi rilis canary Layanan B:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-canary'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: canary, ip: 172.17.0.54)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: canary, ip: 172.17.0.54)
  4. Jalankan perintah berikut untuk memeriksa apakah lalu lintas dasar yang mengalir ke Layanan A diteruskan ke versi dasar Layanan B:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-base'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: canary, ip: 172.17.0.129)-> mockb(version: base, ip: 172.17.0.70)
    -> mocka(version: base, ip: 172.17.0.132)-> mockb(version: base, ip: 172.17.0.70)

    Hasil menunjukkan bahwa lalu lintas canary masuk dan lalu lintas dasar masuk yang mengalir ke Layanan A tidak diarahkan ke versi yang diharapkan dari Layanan B. Anda perlu mengonfigurasi aturan pengarahan berbasis label lalu lintas untuk Layanan A. Untuk informasi lebih lanjut, lanjutkan ke langkah berikutnya.

2. Periksa fitur rilis canary ujung ke ujung

Konfigurasikan file aturan pengarahan berbasis label lalu lintas bernama a-vs-tf.yaml untuk Layanan A dan buat file tersebut berlaku untuk gateway masuk. Hasil yang diharapkan adalah lalu lintas canary permintaan masuk pertama kali diteruskan ke versi rilis canary Layanan A dan kemudian ke versi rilis canary Layanan B, dan lalu lintas dasar pertama kali diteruskan ke versi dasar Layanan A dan kemudian ke versi dasar Layanan B.

Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis label dikonfigurasi untuk Layanan A:验证全链路灰度

  1. Buat file bernama vs-tf-mocka.yaml dan salin konten berikut ke file tersebut:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
              subset: $asm-labels-sample
  2. Jalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk gateway masuk:

    kubectl apply -n default -f vs-tf-mocka.yaml
  3. Jalankan perintah berikut untuk memeriksa apakah lalu lintas canary permintaan masuk pertama kali diteruskan ke versi rilis canary Layanan A dan kemudian ke versi rilis canary Layanan B:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-canary'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)
  4. Jalankan perintah berikut untuk memeriksa apakah lalu lintas dasar permintaan masuk pertama kali diteruskan ke versi dasar Layanan A dan kemudian ke versi dasar Layanan B:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-base'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)

3. Periksa apakah distribusi lalu lintas berbasis bobot yang sesuai dengan pengarahan berbasis label memenuhi persyaratan

Gambar berikut menunjukkan aliran lalu lintas setelah aturan pengarahan berbasis bobot dan label dikonfigurasi untuk Layanan A:验证路由权重

  1. Buat file bernama vs-tf-mocka-90-10.yaml dan salin konten berikut ke file tersebut:

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-gateway-mocka
    spec:
      gateways:
      - simple-gateway
      hosts:
        - "*"
      http:
      - route:
          - destination:
              host: mocka
              subset: version-base
            weight: 90
          - destination:
              host: mocka
              subset: $asm-labels-sample
            weight: 10
  2. Jalankan perintah berikut untuk membuat aturan pengarahan berlaku untuk gateway masuk:

    kubectl apply -n default -f vs-tf-mocka-90-10.yaml
  3. Jalankan perintah berikut untuk memeriksa apakah lalu lintas canary permintaan masuk diteruskan ke versi rilis canary dan versi dasar Layanan A:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-canary'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: canary, ip: 172.17.0.130)
    -> mocka(version: canary, ip: 172.17.0.69)-> mockb(version: canary, ip: 172.17.0.130)

    Hasil menunjukkan bahwa sekitar 90% lalu lintas canary permintaan masuk diteruskan ke versi dasar Layanan A, dan sekitar 10% diteruskan ke versi rilis canary Layanan A. Menurut aturan pengarahan di atas, sekitar 90% lalu lintas permintaan diteruskan ke versi dasar Layanan A, dan sisanya 10% diteruskan berdasarkan nilai header my-asm-prefer-tag. Perintah permintaan menetapkan nilai my-asm-prefer-tag ke version-canary. Oleh karena itu, 10% lalu lintas permintaan diteruskan ke versi rilis canary Layanan A.

  4. Jalankan perintah berikut untuk memeriksa apakah semua lalu lintas dasar permintaan masuk diteruskan ke versi dasar Layanan A:

    for i in {1..200};  do curl -H'my-asm-prefer-tag: version-base'  -H'my-trace-id: x000'$i  http://${ASM_GATEWAY_IP}/; echo; sleep 1; done;

    Output yang Diharapkan:

    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)
    -> mocka(version: base, ip: 172.17.0.90)-> mockb(version: base, ip: 172.17.0.93)

    Menurut aturan pengarahan di atas, sekitar 90% lalu lintas permintaan diteruskan ke versi dasar Layanan A, dan sisanya 10% diteruskan berdasarkan nilai header my-asm-prefer-tag. Perintah permintaan menetapkan nilai my-asm-prefer-tag ke version-base. Oleh karena itu, 10% lalu lintas permintaan diteruskan ke versi dasar Layanan A.