Rilis canary standar mengarahkan traffic HTTP dan RPC sinkron ke versi aplikasi baru, tetapi tidak menyentuh antrian pesan asinkron. Pesan yang diproduksi oleh instans canary masih dapat mencapai konsumen garis dasar, sehingga memutus isolasi traffic di seluruh rantai panggilan. Microservices Engine (MSE) mengatasi hal ini dengan memperluas rilis canary ke alur pesan RocketMQ. Traffic yang ditandai tetap berada dalam lingkungan canary secara ujung ke ujung—tanpa perubahan pada kode bisnis.
Cara kerja
MSE mengisolasi traffic pesan melalui dua mekanisme:
Pemisahan kelompok konsumen: MSE menambahkan tag lingkungan ke setiap nama kelompok konsumen. Misalnya, kelompok konsumen bernama
group1menjadigroup1_grayuntuk instans yang ditandai dengan lingkungangray. Setiap lingkungan mendapatkan kelompok konsumennya sendiri, sehingga konsumen canary hanya memproses pesan canary.Penyaringan pesan SQL92: MSE menyuntikkan ekspresi filter SQL92 ke konsumen pesan. Setiap lingkungan hanya mengambil pesan yang membawa label lingkungannya sendiri. Untuk Apache RocketMQ open-source, ini memerlukan
enablePropertyFilter=truedalam konfigurasi broker. Jika penyaringan SQL92 tidak tersedia, MSE dapat kembali menggunakan penyaringan sisi klien denganFilterMessageHook, meskipun ini meningkatkan beban pada produsen dan konsumen serta tidak disarankan untuk produksi.
Digabungkan dengan routing berbasis tag untuk panggilan sinkron dan propagasi tag di seluruh rantai panggilan, mekanisme ini menciptakan lingkungan canary yang sepenuhnya terisolasi yang mencakup traffic HTTP, RPC, dan message queue.
Arsitektur demo
Demo ini menggunakan aplikasi empat layanan yang diterapkan pada Container Service for Kubernetes (ACK). Rantai panggilan menggabungkan Spring Cloud, Dubbo, dan RocketMQ untuk merepresentasikan arsitektur microservices yang khas:

Jalur sinkron: Permintaan ke /A/dubbo masuk melalui spring-cloud-zuul (gateway) dan diteruskan ke spring-cloud-a. spring-cloud-a memanggil spring-cloud-b melalui Dubbo, dan spring-cloud-b memanggil spring-cloud-c.
Jalur asinkron: Setelah menangani permintaan, spring-cloud-c memproduksi pesan RocketMQ. spring-cloud-a mengonsumsi pesan tersebut dan memanggil spring-cloud-b melalui Spring Cloud, yang kemudian memanggil spring-cloud-c.
Panggilan ke /A/dubbo mengembalikan jalur sinkron lengkap:
A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]spring-cloud-a mencatat jalur asinkron setelah mengonsumsi pesan:
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]Ambil kode sumber demo dari repositori GitHub.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Langkah 1: Hubungkan aplikasi ke MSE Microservices Governance
Aktifkan MSE Microservices Governance untuk aplikasi kluster ACK Anda. Pilih salah satu metode berikut. Untuk petunjuk detail, lihat Aktifkan Microservices Governance untuk aplikasi microservice Java di kluster ACK atau ACS.
Opsi A: Aktifkan berdasarkan namespace
Metode ini mengaktifkan governance untuk semua aplikasi dalam namespace ACK tertentu.
Login ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
Pada halaman Application list, klik ACK Application Access.
Pada dialog ACK Application Access, konfigurasikan parameter berikut dan klik OK.
- Untuk melihat detail komponen ack-onepilot, buka Konsol ACK, klik nama kluster, lalu pilih Operations > Add-ons. - Setelah ack-onepilot diinstal, agen akan disuntikkan secara otomatis. Waktu startup aplikasi mungkin bertambah hingga 10 detik. - Jika kluster tidak berada di wilayah berikut, kluster harus memiliki akses internet dan dapat terhubung ke
acm.aliyun.com:8080: Tiongkok (Qingdao), Tiongkok (Hangzhou), Tiongkok (Beijing), Tiongkok (Shanghai), Tiongkok Timur 2 Finance, Tiongkok (Shenzhen), Tiongkok (Hong Kong), Singapura, Jerman (Frankfurt), Australia (Sydney), AS (Silicon Valley), dan AS (Virginia).Parameter Deskripsi Cluster type Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster. Jika ACK tidak memiliki izin untuk memanggil MSE, klik tautan otorisasi ini untuk memberikan izin tersebut. Cluster Name/ID Pilih kluster target. Cari berdasarkan nama atau ID kluster. ack-onepilot Menampilkan status komponen ack-onepilot. Jika belum diinstal, klik Click Install. Lihat ack-onepilot dan Instal dan perbarui komponen Microservices Governance. Access Type Pilih Namespace Access. ACK Cluster Namespace Pilih namespace yang akan diaktifkan. Microservices Governance Namespace Pilih namespace governance MSE. 
Opsi B: Aktifkan untuk satu aplikasi
Metode ini mengaktifkan governance untuk satu aplikasi spesifik dengan menambahkan label ke spesifikasi Deployment-nya.
Login ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
Pada halaman Application list, klik ACK Application Access.
Pada dialog ACK Application Access, konfigurasikan parameter berikut dan klik OK.
Parameter Deskripsi Cluster type Pilih ACK Cluster, ACK Serverless Cluster, atau ACS Cluster. Jika ACK tidak memiliki izin untuk memanggil MSE, klik tautan otorisasi ini untuk memberikan izin tersebut. Cluster Name/ID Pilih kluster target. ack-onepilot Menampilkan status komponen ack-onepilot. Jika belum diinstal, klik Click Install. Access Type Pilih Single Application Access. 
Tambahkan label berikut ke file YAML Deployment Anda di Konsol ACK (Workloads > Deployments > klik nama aplikasi > View in YAML):
spec: template: metadata: labels: # Setel ke "on" untuk mengaktifkan Microservices Governance. Harus diapit tanda kutip ganda. msePilotAutoEnable: "on" # Namespace governance MSE. Jika tidak ada, akan dibuat secara otomatis. mseNamespace: default # Nama aplikasi untuk governance MSE. Harus diapit tanda kutip ganda. msePilotCreateAppName: "your-deployment-name"
Langkah 2: Terapkan aplikasi demo
Terapkan server Nacos, server RocketMQ, dan empat aplikasi bisnis: spring-cloud-zuul, spring-cloud-a, spring-cloud-b, dan spring-cloud-c.
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda.
Di panel navigasi kiri, pilih Workloads > Deployments.
Pilih Namespace dan klik Create From YAML. Gunakan YAML berikut untuk menerapkan semua layanan:
Verifikasi penerapan: Output yang diharapkan:
kubectl get svc,deployNAME 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
Langkah 3: Aktifkan rilis canary berbasis pesan
Aktifkan rilis canary berbasis pesan untuk produsen pesan (spring-cloud-c) dan konsumen pesan (spring-cloud-a). Fitur ini hanya berlaku jika diaktifkan di kedua sisi.
Sebelum memulai
Tinjau persyaratan dan batasan berikut:
| Persyaratan | Detail |
|---|---|
| Redeployment | Setelah mengaktifkan atau menonaktifkan rilis canary berbasis pesan, redeploy aplikasi di Konsol ACK agar perubahan berlaku. |
| Jenis pesan yang didukung | Hanya pesan RocketMQ (versi open-source dan versi komersial Alibaba Cloud). |
| RocketMQ open-source | Server dan klien harus versi 4.5.0 atau lebih baru. |
| ApsaraMQ for RocketMQ 4.x | Edisi Perusahaan diperlukan untuk penyaringan SQL92. Pembatasan ini tidak berlaku untuk penyaringan sisi klien atau ApsaraMQ for RocketMQ 5.x. |
| Klien ONS | Versi 1.8.0.Final atau lebih baru. |
| Nama kelompok konsumen | MSE menambahkan tag lingkungan ke nama kelompok konsumen (misalnya, group1 menjadi group1_gray). Jika Anda menggunakan ApsaraMQ for RocketMQ Alibaba Cloud, buat kelompok konsumen baru terlebih dahulu. |
| Penyaringan SQL92 | Diaktifkan secara default. Untuk Apache RocketMQ open-source, tambahkan enablePropertyFilter=true ke broker.conf. |
| Penyaringan sisi klien | Jika penyaringan SQL92 tidak tersedia, gunakan FilterMessageHook sebagai gantinya. Ini memerlukan pengaktifan rilis canary berbasis pesan di semua aplikasi dan memilih penyaringan sisi klien. Karena setiap lingkungan memproses semua pesan dan menyaring secara lokal, pendekatan ini meningkatkan beban. Hindari penggunaannya di produksi. |
Aktifkan fitur
Login ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
Pada halaman Application list, klik kartu resource aplikasi (spring-cloud-c atau spring-cloud-a).
Di panel navigasi kiri, klik Traffic management.
Pada tab Message Grayscale, aktifkan sakelar Enable Message Grayscale dan klik OK.

Login ke Konsol ACK dan redeploy aplikasi agar konfigurasi berlaku.
Ulangi langkah 3–6 untuk aplikasi lainnya (spring-cloud-a atau spring-cloud-c).
Langkah 4: Terapkan versi canary
Terapkan versi canary dari tiga aplikasi: spring-cloud-a-gray, spring-cloud-b-gray, dan spring-cloud-c-gray. Setiap Deployment canary menggunakan gambar kontainer yang sama dengan garis dasar tetapi menyertakan label alicloud.service.tag: gray untuk mengidentifikasi instans canary. Label msePilotCreateAppName menggunakan nama aplikasi garis dasar sehingga MSE memperlakukan canary dan garis dasar sebagai versi dari aplikasi yang sama.
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda.
Di panel navigasi kiri, pilih Workloads > Deployments.
Pilih Namespace dan klik Create From YAML. Gunakan YAML berikut untuk menerapkan versi canary:
Langkah 5: Konfigurasikan routing traffic dan verifikasi hasil
Buat aturan routing berbasis tag
Login ke Konsol MSE dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance.
Klik kartu resource untuk aplikasi spring-cloud-a. Pada halaman Application Overview, grafik QPS Trend Graph menegaskan bahwa seluruh traffic dialihkan ke versi garis dasar.
Di panel navigasi kiri, klik Traffic Governance, lalu klik tab Tag-based Routing.
Pada kolom Traffic Rule untuk tag
gray, klik Add.
Pada panel Create Label Route, definisikan aturan traffic dan klik OK. Contoh ini mengarahkan permintaan dengan
name=xiaomingke lingkungan canary. Untuk detail kondisi dan operator yang tersedia, lihat Konfigurasikan routing berbasis tag.
Aktifkan propagasi tag
Propagasi tag meneruskan tag canary melalui seluruh rantai panggilan. Setelah Anda mengaktifkan propagasi tag, traffic yang sesuai aturan routing akan dilewatkan secara ujung ke ujung, sehingga Anda tidak perlu mengonfigurasi aturan berulang kali.
Pada tab Tag-based Routing, klik nama aturan routing untuk tag
gray.Pada panel Rule Details, klik Edit.
Pada panel Modify Tag-based Routing Rule, aktifkan sakelar Tag Propagation dan klik OK.
Verifikasi rilis canary ujung ke ujung
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, pilih Network > Services.
Klik layanan zuul-slb. Di bawah Basic Information, klik alamat di sebelah External IP Address (External IP).
Pada halaman panggilan layanan, masukkan
/A/dubbo?name=xiaomingdan klik Start Call.
Tanggapan menegaskan routing ujung ke ujung melalui lingkungan canary:

Data traffic untuk spring-cloud-b menegaskan bahwa traffic canary terisolasi dari traffic garis dasar:

Langkah 6: Kendalikan konsumsi pesan garis dasar
Secara default, konsumen garis dasar menerima pesan dari semua lingkungan, termasuk canary. Untuk mencegah instans garis dasar mengonsumsi pesan canary, konfigurasikan parameter Tags To Be Ignored By The Baseline Environment.
Login ke Konsol MSE.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Klik kartu resource untuk aplikasi spring-cloud-a.
Di panel navigasi kiri, klik Traffic Governance, lalu klik tab Message Grayscale.
Klik tombol Edit di sebelah Tags To Be Ignored By The Baseline Environment. Pilih
graydi kotak input dan klik OK.
Setelah perubahan ini, pesan dengan tag lingkungan gray hanya dikonsumsi oleh spring-cloud-a-gray, bukan oleh instans spring-cloud-a garis dasar. Pengaturan ini berlaku langsung—tidak diperlukan restart aplikasi.
Verifikasi
Periksa log aplikasi spring-cloud-a di Konsol ACK. Sebelum perubahan, garis dasar mengonsumsi pesan dari kedua lingkungan. Setelah mengatur Tags To Be Ignored By The Baseline Environment ke gray, garis dasar hanya mengonsumsi pesan yang diproduksi oleh garis dasar.

Langkah selanjutnya
Konfigurasikan routing berbasis tag: Siapkan kondisi dan operator routing lanjutan di luar pencocokan parameter sederhana.
Aktifkan Microservices Governance untuk aplikasi microservice Java di kluster ACK atau ACS: Jelajahi metode tambahan untuk menghubungkan aplikasi ke governance MSE.