Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:Manage Spring Cloud services

Son Güncelleme:Oct 07, 2026

Kodunuzu değiştirmeden Spring Cloud uygulamalarınızı Service Mesh (ASM) ile entegre ederek cloud-native hizmet yönetimi yeteneklerinden yararlanabilirsiniz. Bu konuda, ASM kullanarak Spring Cloud hizmetlerinin nasıl yönetileceği açıklanmaktadır.

Önkoşullar

Arka Plan

Spring Cloud; Spring Cloud Netflix, Spring Cloud Alibaba ve Spring Cloud Consul gibi çeşitli uygulamalara sahip bir standarttır. ASM açısından bu uygulamalar arasındaki temel fark, kullandıkları hizmet kayıt defteridir. Aşağıdaki tabloda farklı Spring Cloud sürümleri için ASM geçiş desteği listelenmiştir.


Spring Cloud sürümü


Hizmet kayıt defteri


Geçiş desteği


Spring Cloud Alibaba


Microservices Engine (MSE) Nacos (bir Alibaba Cloud hizmeti)


Desteklenir


Spring Cloud Alibaba


Nacos (kendi tarafından yönetilen)


Desteklenir


Spring Cloud Netflix


Eureka


Desteklenir. ASM örnek sürümünün 1.13.4.53 veya üzeri olması gerekir.


Spring Cloud Consul


Consul


Desteklenir. ASM örnek sürümünün 1.13.4.53 veya üzeri olması gerekir.


Spring Cloud Zookeeper


Zookeeper


Desteklenir. ASM örnek sürümünün 1.13.4.53 veya üzeri olması gerekir.

Demo genel bakış

Bu konuda, Spring Cloud ve Nacos kullanılarak oluşturulan bir uygulama örnek olarak ele alınmıştır. Örnek kodu nacos-example deposundan indirebilirsiniz.

Uygulama bir tüketici hizmetinden ve bir sağlayıcı hizmetinden oluşur. Sağlayıcı hizmetinin, her ikisi de bir Nacos kayıt defterine kayıtlı olan v1 ve v2 olmak üzere iki sürümü vardır. Tüketici hizmeti, sağlayıcı hizmetinin adreslerini Nacos kayıt defterinden alır ve istekler arasında yük dengeleme yapar. Tüketici hizmeti bir istek aldığında isteği bir sağlayıcıya iletir ve sağlayıcının yanıtını döndürür. İki sağlayıcı sürümü farklı yanıtlar verir:

  • v1 sağlayıcısı, bir echo isteğine Hello Nacos Discovery From v1xxx yanıtını verir.

  • v2 sağlayıcısı, bir echo isteğine Hello Nacos Discovery From v2xxx yanıtını verir.

Yanıtta, .xxx ifadesi echo API'sine iletilen parametre için bir yer tutucudur. Örneğin, /echo/world yoluna yapılan bir istek v1 sağlayıcısına gönderilirse dönüş değeri Hello Nacos Discovery From v1world olur.

image

Tüketici ve sağlayıcı hizmetleri için hizmet ağı yeteneklerini etkinleştirmezseniz, yani uygulama pod'larına sidecar enjekte edilmezse istekler yine de işlenir ancak Istio tarafından sağlanan hizmet yönetimi yeteneklerinden yoksun kalır. Aşağıdaki adımlarda, Spring Cloud hizmetlerini yönetmek için ASM'nin nasıl kullanılacağı gösterilmektedir.

Adım 1: Spring Cloud desteğini etkinleştirme

Yöntem 1: Tüm sürümler ve kayıt defterleri için

Not

ASM örnek sürümünün 1.13.4.32 veya üzeri olması gerekir.

Önemli

Sınırlamalar:

  • Hedef hizmet için bir Kubernetes Service oluşturmanız gerekir. Hizmet bağlantı noktası ve hedef bağlantı noktası, uygulamanın dinleme bağlantı noktasına ayarlanmalıdır.

  • 1.23.6.32 öncesi ASM sürümlerinde bu çözümü kullanırken REGISTRY_ONLY özelliğini devre dışı bırakmanız gerekir.

  1. kubectl kullanarak kontrol düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. kubectl kullanarak kontrol düzlemindeki Istio kaynaklarına erişim.

  2. ASM kümesinde bir EnvoyFilter oluşturun.

    1. Aşağıdaki içeriğe sahip any-spring-cloud-support.yaml adlı bir dosya oluşturun.

      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: # reverse_dns filter specification
             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"

      Parametreleri iş gereksinimlerinize göre YAML dosyasında değiştirin. Parametrelerin açıklamaları aşağıdadır:

      • portNumber: Spring Cloud hizmetinin bağlantı noktasıdır. Bağlantı noktaları aynı değilse bu parametreyi kaldırabilirsiniz. Bağlantı noktaları tekilleştirilebiliyorsa, her biri belirli bir portNumber değerine bağlanan birden fazla EnvoyFilter kaynağı yapılandırabilirsiniz.

      • pod_cidrs: ACK veya ACK Serverless kümesinin pod CIDR bloğudur. Bu değeri bulmak için Container Service Management Console adresinde oturum açın ve Cluster Information sayfasına gidin. Cluster Resources sekmesinde, VPC altındaki Pod CIDR bloğunu bulun ve bu değeri parametre olarak kullanın.

    2. EnvoyFilter öğesini uygulamak için aşağıdaki komutu çalıştırın.

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

Yöntem 2: Yalnızca Nacos kayıt defterleri için

  1. kubectl kullanarak kontrol düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. kubectl kullanarak kontrol düzlemindeki Istio kaynaklarına erişim.

  2. Bir ServiceEntry oluşturun.

    1. Aşağıdaki içeriğe sahip external-nacos-svc.yaml adlı bir dosya oluşturun.

      kind: ServiceEntry
      metadata:
        name: external-nacos-svc
      spec:
        hosts:
        - "NACOS_SERVER_HOST"  ## Replace this with your Nacos Server HOST, for example, "mse-xxx-p.nacos-ans.mse.aliyuncs.com".
        location: MESH_EXTERNAL
        ports:
        - number: 8848
          name: http
        resolution: DNS

      Önceki YAML dosyasında, 8848 Nacos için varsayılan bağlantı noktasıdır. Kendi tarafından yönetilen bir Nacos sunucusu kullanıyorsanız ve bağlantı noktasını değiştirdiyseniz number parametresini buna göre değiştirmeniz gerekir.

    2. ServiceEntry'i oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f external-nacos-svc.yaml
  3. Bir EnvoyFilter oluşturun.

    1. Aşağıdaki içeriğe sahip external-envoyfilter.yaml adlı bir dosya oluşturun.

      apiVersion: networking.istio.io/v1alpha3
      kind: EnvoyFilter
      metadata:
        labels:
          provider: "asm"
          asm-system: "true"
        name: nacos-subscribe-lua
        namespace: istio-system
      spec:
        configPatches:
          # The first patch adds the lua filter to the listener/http connection manager.
        - 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: # lua filter specification
             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()
                     -- /nacos/v1/ns/instance/list?healthyOnly=false&namespaceId=public&clientIP=10.122.63.81&serviceName=DEFAULT_GROUP%40%40service-provider&udpPort=53174&encoding=UTF-8
                     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
    2. EnvoyFilter'i oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f external-envoyfilter.yaml

Adım 2: Spring Cloud hizmetlerini dağıtma

Not
  • Kayıt işlemini yakalamak için iş yüklerini oluşturmadan önce EnvoyFilter'ı oluşturmanız gerekir. Bir iş yükü EnvoyFilter'dan önce oluşturulduysa bu iş yükü için rolling update gerçekleştirmeniz gerekir.

  • Her hizmet için ClusterIP türünde bir Kubernetes Service oluşturmanız gerekir.

  1. kubectl kullanarak veri düzlemi kümesine bağlanın. Daha fazla bilgi için bkz. Kümenin kubeconfig dosyasını alma ve kubectl ile kümeye bağlanma.

  2. Spring Cloud hizmetlerini dağıtmak için aşağıdaki komutları çalıştırın.

    export NACOS_ADDRESS=xxxx # Replace xxxx with the address of your MSE or self-managed Nacos. We recommend using an internal VPC address.
    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. Spring Cloud hizmetlerini kontrol etmek için aşağıdaki komutu çalıştırın.

     kubectl get pods

    Beklenen çıktı:

    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

Adım 3: Ağ geçidi ve sanal hizmet oluşturma

  1. Bir Istio ağ geçidi oluşturun.

    1. Aşağıdaki içeriğe sahip test-gateway.yaml adlı bir dosya oluşturun.

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: test-gateway
      spec:
        selector:
          istio: ingressgateway # use istio default controller
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
    2. ASM örneğinin kubeconfig dosyasını kullanarak Istio ağ geçidini oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f test-gateway.yaml
  2. Bir sanal hizmet oluşturun.

    1. Aşağıdaki içeriğe sahip consumer.yaml adlı bir dosya oluşturun.

      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
    2. Sanal hizmeti oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f consumer.yaml

Adım 4: Hizmet yönetimini doğrulama

  1. Giriş ağ geçidinin IP adresini alın.

    1. ASM konsolunda oturum açın. Sol gezinme bölmesinde Service Mesh > Mesh Management seçeneğini belirleyin.

    2. Mesh Management sayfasında ASM örneğinin adına tıklayın. Sol gezinme bölmesinde ASM Gateways > Ingress Gateway seçeneğini belirleyin.

    3. Ingress Gateway sayfasında giriş ağ geçidinin Service address değerini görüntüleyin.

  2. Giriş ağ geçidi üzerinden Spring Cloud tüketici hizmetine istek göndermek için aşağıdaki komutu çalıştırın.

    curl <IP address of the ingress gateway>/echo/world

    Beklenen çıktı:

    Hello Nacos Discovery From v1world
    Hello Nacos Discovery From v2world
    Hello Nacos Discovery From v1world
    Hello Nacos Discovery From v2world

    Çıktı, isteklerin varsayılan olarak round-robin yöntemiyle v1 ve v2 sağlayıcılara yönlendirildiğini gösterir.

  3. Bir hedef kuralı ve sanal hizmet oluşturun.

    1. Aşağıdaki içeriğe sahip service-provider.yaml adlı bir dosya oluşturun.

      ---
      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. Hedef kuralını oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f service-provider.yaml
    3. Aşağıdaki içeriğe sahip service-provider1.yaml adlı bir dosya oluşturun.

      Aşağıdaki sanal hizmet, /echo/hello yolundaki istekleri v1 sağlayıcıya, diğer tüm istekleri ise v2 sağlayıcıya yönlendirir.

      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. Sanal hizmeti oluşturmak için aşağıdaki komutu çalıştırın.

      kubectl apply -f service-provider1.yaml
  4. Spring Cloud tüketici hizmetine istek göndermek için aşağıdaki komutu çalıştırın.

    curl <IP address of the ingress gateway>/echo/hello

    Beklenen çıktı:

    Hello Nacos Discovery From v1hello
    Hello Nacos Discovery From v1hello

    Çıktı, /echo/hello yoluna yapılan tüm isteklerin v1 sağlayıcıya, diğer isteklerin ise v2 sağlayıcıya yönlendirildiğini gösterir. Bu durum, Istio'nun artık Spring Cloud trafiğini kontrol ettiğini ve hizmetleri Istio yönlendirme kurallarını kullanarak yönetebilmenizi sağlar.

SSS

Spring Cloud hizmetlerinde sorun giderme

  1. Nacos bağlantı noktası veya IP adresi için trafik yakalama özelliğinin etkin olup olmadığını kontrol edin.

    • reverse_dns yöntemini kullanıyorsanız pod IP adreslerini yakalamanız gerekir.

    • Lua betiği yöntemini kullanıyorsanız Nacos Sunucu IP adresini ve küme IP adresini yakalamanız gerekir.

  2. Kayıt işlemini yakalamak için iş yüklerinden önce EnvoyFilter'ı oluşturmanız gerekir. İş yükü önce oluşturulduysa üzerinde rolling update gerçekleştirmeniz gerekir.

  3. Her hizmet için ClusterIP türünde bir Kubernetes Service'in bulunduğunu kontrol edin.

  4. ASM kontrol düzleminde Spring Cloud desteğini etkinleştirmek için hangi yöntemi kullandığınızı kontrol edin.

    Yöntem 2 kullanılıyorsa Nacos client SDK sürümü 2,0'dan önce olmalıdır. Nacos client SDK 2,0 ve sonraki sürümler sunucuya bağlanmak için gRPC kullanır; bu durum Yöntem 2 ile uyumsuzdur. Yöntem 1 Nacos sürümüne bağlı değildir ve tüm Nacos sürümlerini destekler.

  5. Hizmetlerin sidecar sürümünü kontrol edin. Sidecar görüntü sürümü 1.13.4.32'den önceyse yalnızca ASM örneğinin kontrol düzlemi yükseltilmiş demektir; veri düzlemi yükseltilmemiştir. Etkilenen hizmet dağıtımlarında rolling update gerçekleştirmeniz gerekir.