Service Mesh (ASM) menambahkan manajemen lalu lintas berbasis Istio ke aplikasi Spring Cloud tanpa perubahan kode. Setelah Anda menghubungkan layanan Spring Cloud ke ASM, Anda dapat menggunakan CRD Istio seperti VirtualService dan DestinationRule untuk mengontrol routing, load balancing, serta pemisahan lalu lintas berbasis versi—sementara aplikasi tetap menggunakan registri layanan yang ada untuk penemuan layanan.
Implementasi dan registri yang didukung
ASM mendukung implementasi Spring Cloud berikut. Semua migrasi tidak memerlukan perubahan kode.
| Implementasi Spring Cloud | Registri layanan | Migrasi didukung tanpa modifikasi kode |
|---|---|---|
| Spring Cloud Alibaba | Microservices Engine (MSE) Nacos | Ya |
| Spring Cloud Alibaba | Nacos yang dikelola sendiri | Ya |
| Spring Cloud Netflix | Eureka | Ya. ASM versi 1.13.4.53 atau lebih baru. |
| Spring Cloud Consul | Consul | Ya. ASM versi 1.13.4.53 atau lebih baru. |
| Spring Cloud Zookeeper | Zookeeper | Ya. ASM versi 1.13.4.53 atau lebih baru. |
Cara kerja
Aplikasi Spring Cloud mengandalkan registri layanan (Nacos, Eureka, Consul, atau Zookeeper) untuk penemuan layanan. ASM menjembatani penemuan berbasis registri ini dengan model native mesh Istio dengan mencegat lalu lintas registri melalui EnvoyFilter. Setelah dicegat, proxy sidecar menyelesaikan nama layanan menjadi alamat IP pod, dan CRD Istio mengatur seluruh lalu lintas antar layanan.
Dua metode memungkinkan jembatan ini pada lapisan kontrol ASM:
| Metode | Registri yang didukung | Persyaratan |
|---|---|---|
| Metode 1: Reverse DNS | Semua registri | ASM 1.13.4.32 atau lebih baru |
| Metode 2: Lua filter | Hanya Nacos | SDK klien Nacos sebelum versi 2.0 (v2.0+ menggunakan gRPC, tidak kompatibel dengan Lua) |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM Edisi Perusahaan atau Edisi Ultimate. Lihat Buat instans ASM
Kluster ACK yang dikelola. Lihat Buat kluster ACK yang dikelola
Kluster ACK yang telah ditambahkan ke instans ASM. Lihat Tambahkan kluster ke instans ASM
Gerbang masuk (ingress gateway) yang telah dideploy. Lihat Buat gerbang masuk
Arsitektur demo
Tutorial ini menggunakan demo Spring Cloud Nacos dengan tiga layanan:
Layanan konsumen: Mengekspos port 8080 dengan titik akhir
/echo. Meneruskan permintaan ke layanan penyedia dan mengembalikan tanggapan.Layanan penyedia (V1): Memberikan respons
Hello Nacos Discovery From v1<parameter>.Layanan penyedia (V2): Memberikan respons
Hello Nacos Discovery From v2<parameter>.
Kedua versi penyedia mendaftar ke registri Nacos. Konsumen menemukannya melalui Nacos dan mendistribusikan permintaan ke V1 dan V2 secara round-robin.
Sebagai contoh, permintaan ke /echo/world mengembalikan salah satu dari Hello Nacos Discovery From v1world atau Hello Nacos Discovery From v2world.

Unduh kode sumber demo dari repositori nacos-examples.
Tanpa injeksi sidecar, layanan ini berfungsi normal tetapi tidak terlihat oleh Istio. Langkah-langkah berikut menambahkan manajemen lalu lintas berbasis mesh di atas penemuan layanan Spring Cloud yang sudah ada.
Langkah 1: Aktifkan dukungan Spring Cloud pada lapisan kontrol ASM
Metode 1: Reverse DNS (semua registri)
Memerlukan ASM 1.13.4.32 atau lebih baru.
Harus tersedia layanan Kubernetes sebagai layanan tujuan. Port layanan dan port tujuan harus sesuai dengan port tempat aplikasi dirutekan melalui instans Server Load Balancer (SLB).
Untuk ASM 1.23.6.32 atau lebih baru, nonaktifkan REGISTRY_ONLY.
Hubungkan kubectl ke lapisan kontrol ASM. Lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.
Buat file bernama
any-spring-cloud-support.yaml: Ganti nilai berikut berdasarkan lingkungan Anda:Parameter Deskripsi Cara menemukannya portNumberPort layanan Spring Cloud Anda. Hapus parameter ini untuk mencocokkan semua port, atau buat resource EnvoyFilter terpisah untuk menargetkan port tertentu. Konfigurasi aplikasi pod_cidrsBlok CIDR Pod kluster ACK atau ACK Serverless. Di Container Service Management Console, buka Clusters, klik kluster Anda, lalu buka tab Cluster Resources. Klik tautan VPC untuk melihat blok CIDR vSwitch. apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: labels: provider: "asm" asm-system: "true" name: any-spring-cloud-support namespace: istio-system spec: configPatches: - applyTo: HTTP_FILTER match: proxy: proxyVersion: "^1.*" context: SIDECAR_OUTBOUND listener: portNumber: 8070 filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: com.aliyun.reverse_dns typed_config: "@type": "type.googleapis.com/udpa.type.v1.TypedStruct" type_url: type.googleapis.com/envoy.config.filter.reverse_dns.v3alpha.CommonConfig value: pod_cidrs: - "10.0.128.0/18"Terapkan EnvoyFilter:
kubectl apply -f any-spring-cloud-support.yaml
Metode 2: Lua filter (hanya Nacos)
Hubungkan kubectl ke lapisan kontrol ASM. Lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.
Buat file bernama
external-nacos-svc.yamluntuk mendefinisikan entri layanan bagi server Nacos: Ganti<your-nacos-server-host>dengan titik akhir server Nacos (misalnya,mse-xxx-p.nacos-ans.mse.aliyuncs.com). Port8848adalah port default Nacos. Jika Nacos yang Anda kelola sendiri menggunakan port berbeda, perbarui nilainumber.kind: ServiceEntry metadata: name: external-nacos-svc spec: hosts: - "<your-nacos-server-host>" # Contoh: mse-xxx-p.nacos-ans.mse.aliyuncs.com location: MESH_EXTERNAL ports: - number: 8848 name: http resolution: DNSTerapkan entri layanan:
kubectl apply -f external-nacos-svc.yamlBuat file bernama
external-envoyfilter.yamluntuk EnvoyFilter berbasis Lua:apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: labels: provider: "asm" asm-system: "true" name: nacos-subscribe-lua namespace: istio-system spec: configPatches: - applyTo: HTTP_FILTER match: proxy: proxyVersion: "^1.*" context: SIDECAR_OUTBOUND listener: portNumber: 8848 filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.lua typed_config: "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua" inlineCode: | -- copyright: ASM (Alibaba Cloud ServiceMesh) function envoy_on_request(request_handle) local request_headers = request_handle:headers() local path = request_headers:get(":path") if string.match(path,"^/nacos/v1/ns/instance/list") then local servicename = string.gsub(path,".*&serviceName.*40([%w.\\_\\-]+)&.*","%1") request_handle:streamInfo():dynamicMetadata():set("context", "request.path", path) request_handle:streamInfo():dynamicMetadata():set("context", "request.servicename", servicename) request_handle:logInfo("subscribe for serviceName: " .. servicename) else request_handle:streamInfo():dynamicMetadata():set("context", "request.path", "") end end function envoy_on_response(response_handle) local request_path = response_handle:streamInfo():dynamicMetadata():get("context")["request.path"] if request_path == "" then return end local servicename = response_handle:streamInfo():dynamicMetadata():get("context")["request.servicename"] response_handle:logInfo("modified response ip to serviceName:" .. servicename) local bodyObject = response_handle:body(true) local body= bodyObject:getBytes(0,bodyObject:length()) body = string.gsub(body,"%s+","") body = string.gsub(body,"(ip\":\")(%d+.%d+.%d+.%d+)","%1"..servicename) response_handle:body():setBytes(body) endTerapkan EnvoyFilter:
kubectl apply -f external-envoyfilter.yaml
Langkah 2: Deploy layanan Spring Cloud
Terapkan EnvoyFilter dari Langkah 1 sebelum melakukan deploy layanan. Filter tersebut harus sudah aktif untuk mencegat proses pendaftaran layanan. Jika layanan sudah di-deploy, picu rolling update pada deployment tersebut.
Setiap layanan Spring Cloud memerlukan resource layanan Kubernetes dengan alamat IP cluster.
Hubungkan kubectl ke bidang data ACK. Lihat Dapatkan file kubeconfig kluster.
Deploy layanan demo: Ganti
<your-nacos-endpoint>dengan titik akhir registri MSE Nacos atau registri Nacos yang Anda kelola sendiri.# Tetapkan titik akhir registri Nacos (disarankan menggunakan endpoint VPC) export NACOS_ADDRESS=<your-nacos-endpoint> # Unduh dan terapkan deployment demo wget https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/springcloud/demo.yaml -O demo.yaml sed -e "s/NACOS_SERVER_CLUSTERIP/$NACOS_ADDRESS/g" demo.yaml | kubectl apply -f -Verifikasi bahwa semua pod berjalan dengan 2/2 kontainer (aplikasi + sidecar): Output yang diharapkan: Angka
2/2pada kolom READY mengonfirmasi bahwa kontainer aplikasi dan proxy sidecar Envoy keduanya berjalan.kubectl get podsconsumer-bdd464654-jn8q7 2/2 Running 0 25h provider-v1-66bc67fb6d-46pgl 2/2 Running 0 25h provider-v2-76568c45f6-85z87 2/2 Running 0 25h
Langkah 3: Buat gateway dan layanan virtual Istio
Buat file bernama
test-gateway.yamluntuk gateway Istio:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: test-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"Hubungkan kubectl ke lapisan kontrol ASM dan terapkan gateway:
kubectl apply -f test-gateway.yamlBuat file bernama
consumer.yamluntuk layanan virtual yang merutekan lalu lintas masuk ke konsumen:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: consumer spec: hosts: - "*" gateways: - test-gateway http: - match: - uri: prefix: / route: - destination: host: consumer.default.svc.cluster.local port: number: 8080Terapkan layanan virtual:
kubectl apply -f consumer.yaml
Langkah 4: Verifikasi manajemen traffic
Langkah ini mengonfirmasi bahwa ASM mengontrol lalu lintas Spring Cloud. Pertama, amati perilaku round-robin default tanpa aturan routing, lalu terapkan aturan routing Istio dan verifikasi perubahannya.
Amati perilaku default (sebelum aturan routing)
Dapatkan alamat IP gerbang masuk:
Login ke Konsol ASM.
Pada panel navigasi kiri, pilih Service Mesh > Mesh Management.
Klik nama instans ASM Anda, lalu pilih ASM Gateways > Ingress Gateway.
Catat Service address pada halaman Ingress Gateway.
Kirim beberapa permintaan ke layanan konsumen: Tanggapan bergantian antara V1 dan V2 secara round-robin: Ini mengonfirmasi bahwa konsumen menemukan kedua versi penyedia melalui Nacos dan mendistribusikan lalu lintas secara merata. Belum ada aturan routing Istio yang berlaku.
curl <ingress-gateway-ip>/echo/worldHello Nacos Discovery From v1world Hello Nacos Discovery From v2world Hello Nacos Discovery From v1world Hello Nacos Discovery From v2world
Terapkan aturan routing (setelah)
Buat file bernama
service-provider.yamluntuk mendefinisikan aturan tujuan dengan subset berbasis versi.apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: service-provider spec: host: service-provider subsets: - name: v1 labels: label: v1 - name: v2 labels: label: v2Terapkan aturan tujuan:
kubectl apply -f service-provider.yamlBuat file bernama
service-provider-vs.yamluntuk mendefinisikan layanan virtual yang merutekan permintaan/echo/helloke V1 dan semua permintaan lain ke V2:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: service-provider spec: hosts: - service-provider http: - name: "hello-v1" match: - uri: prefix: "/echo/hello" route: - destination: host: service-provider subset: v1 - name: "default" route: - destination: host: service-provider subset: v2Terapkan layanan virtual:
kubectl apply -f service-provider-vs.yamlUji aturan routing: Semua tanggapan sekarang berasal hanya dari V1: Bandingkan dengan perilaku round-robin sebelumnya: Permintaan
/echo/hellosekarang dirutekan eksklusif ke V1, sedangkan semua permintaan lain dialihkan ke V2. CRD Istio telah mengambil alih routing lalu lintas Spring Cloud, mengonfirmasi bahwa ASM mengelola layanan tersebut.curl <ingress-gateway-ip>/echo/helloHello Nacos Discovery From v1hello Hello Nacos Discovery From v1hello
FAQ
Traffic tidak dicegat oleh mesh
Periksa apakah pemblokiran lalu lintas diaktifkan untuk port atau alamat IP registri:
Metode 1 (reverse DNS): Anda harus memblokir alamat IP pod. Pastikan nilai
pod_cidrsdalam EnvoyFilter Anda mencakup blok CIDR pod yang benar dari kluster ACK Anda.Metode 2 (Lua filter): Anda harus memblokir alamat IP server Nacos dan alamat IP cluster.
Layanan tidak terdaftar dengan benar
Hal ini biasanya terjadi ketika EnvoyFilter belum aktif sebelum layanan dimulai. Filter tersebut harus mencegat proses pendaftaran sejak awal. Restart deployment yang terpengaruh:
kubectl rollout restart deployment <deployment-name>Juga pastikan setiap layanan Spring Cloud memiliki resource layanan Kubernetes yang sesuai dengan alamat IP cluster.
Aturan routing tidak berlaku
Dua penyebab umum:
Versi SDK klien Nacos (hanya Metode 2): Metode 2 memerlukan SDK klien Nacos sebelum versi 2.0. Versi 2.0+ menggunakan gRPC alih-alih HTTP, yang tidak kompatibel dengan filter Lua. Beralihlah ke Metode 1 jika SDK klien Nacos Anda versi 2.0 atau lebih baru—Metode 1 bekerja dengan semua versi Nacos.
Versi sidecar usang: Jika versi gambar sidecar lebih lama dari 1.13.4.32, bidang data mungkin belum diperbarui setelah peningkatan lapisan kontrol. Restart deployment yang terpengaruh untuk menggunakan versi sidecar terbaru.