All Products
Search
Document Center

Alibaba Cloud Service Mesh:Mengelola layanan Spring Cloud

Last Updated:Apr 21, 2026

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 CloudRegistri layananMigrasi didukung tanpa modifikasi kode
Spring Cloud AlibabaMicroservices Engine (MSE) NacosYa
Spring Cloud AlibabaNacos yang dikelola sendiriYa
Spring Cloud NetflixEurekaYa. ASM versi 1.13.4.53 atau lebih baru.
Spring Cloud ConsulConsulYa. ASM versi 1.13.4.53 atau lebih baru.
Spring Cloud ZookeeperZookeeperYa. 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:

MetodeRegistri yang didukungPersyaratan
Metode 1: Reverse DNSSemua registriASM 1.13.4.32 atau lebih baru
Metode 2: Lua filterHanya NacosSDK klien Nacos sebelum versi 2.0 (v2.0+ menggunakan gRPC, tidak kompatibel dengan Lua)

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

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.

Demo architecture

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)

Catatan

Memerlukan ASM 1.13.4.32 atau lebih baru.

Penting
  • 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.

  1. Hubungkan kubectl ke lapisan kontrol ASM. Lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.

  2. Buat file bernama any-spring-cloud-support.yaml: Ganti nilai berikut berdasarkan lingkungan Anda:

    ParameterDeskripsiCara 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"
  3. Terapkan EnvoyFilter:

       kubectl apply -f any-spring-cloud-support.yaml

Metode 2: Lua filter (hanya Nacos)

  1. Hubungkan kubectl ke lapisan kontrol ASM. Lihat Gunakan kubectl pada lapisan kontrol untuk mengakses resource Istio.

  2. Buat file bernama external-nacos-svc.yaml untuk 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). Port 8848 adalah port default Nacos. Jika Nacos yang Anda kelola sendiri menggunakan port berbeda, perbarui nilai number.

       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: DNS
  3. Terapkan entri layanan:

       kubectl apply -f external-nacos-svc.yaml
  4. Buat file bernama external-envoyfilter.yaml untuk 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)
                    end
  5. Terapkan EnvoyFilter:

       kubectl apply -f external-envoyfilter.yaml

Langkah 2: Deploy layanan Spring Cloud

Penting

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.

Catatan

Setiap layanan Spring Cloud memerlukan resource layanan Kubernetes dengan alamat IP cluster.

  1. Hubungkan kubectl ke bidang data ACK. Lihat Dapatkan file kubeconfig kluster.

  2. 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 -
  3. Verifikasi bahwa semua pod berjalan dengan 2/2 kontainer (aplikasi + sidecar): Output yang diharapkan: Angka 2/2 pada kolom READY mengonfirmasi bahwa kontainer aplikasi dan proxy sidecar Envoy keduanya berjalan.

       kubectl get pods
       consumer-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

  1. Buat file bernama test-gateway.yaml untuk 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:
           - "*"
  2. Hubungkan kubectl ke lapisan kontrol ASM dan terapkan gateway:

       kubectl apply -f test-gateway.yaml
  3. Buat file bernama consumer.yaml untuk 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: 8080
  4. Terapkan 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)

  1. Dapatkan alamat IP gerbang masuk:

    1. Login ke Konsol ASM.

    2. Pada panel navigasi kiri, pilih Service Mesh > Mesh Management.

    3. Klik nama instans ASM Anda, lalu pilih ASM Gateways > Ingress Gateway.

    4. Catat Service address pada halaman Ingress Gateway.

  2. 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/world
       Hello Nacos Discovery From v1world
       Hello Nacos Discovery From v2world
       Hello Nacos Discovery From v1world
       Hello Nacos Discovery From v2world

Terapkan aturan routing (setelah)

  1. Buat file bernama service-provider.yaml untuk 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: v2
  2. Terapkan aturan tujuan:

       kubectl apply -f service-provider.yaml
  3. Buat file bernama service-provider-vs.yaml untuk mendefinisikan layanan virtual yang merutekan permintaan /echo/hello ke 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: v2
  4. Terapkan layanan virtual:

       kubectl apply -f service-provider-vs.yaml
  5. Uji aturan routing: Semua tanggapan sekarang berasal hanya dari V1: Bandingkan dengan perilaku round-robin sebelumnya: Permintaan /echo/hello sekarang 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/hello
       Hello 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_cidrs dalam 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:

  1. 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.

  2. 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.