Todos los productos
Search
Centro de documentos

Microservices Engine:Versión canary de extremo a extremo con Spring Cloud Gateway o Zuul autogestionado

Última actualización: Sep 05, 2026

Spring Cloud Gateway y Zuul son puertas de enlace API comunes en una arquitectura de microservices que admiten el reenvío de rutas y el procesamiento de filtros. Puede configurar reglas de enrutamiento para dirigir las solicitudes a un entorno canary y así validar y probar una versión canary. La función de versión canary de extremo a extremo en Microservices Engine (MSE) le permite implementar la limitación de tráfico de extremo a extremo sin modificar su código de negocio. Este tema muestra cómo configurar una puerta de enlace Spring Cloud Gateway o Zuul para habilitar una versión canary de extremo a extremo.

Requisitos previos

Contexto

Este tema demuestra cómo usar MSE para una versión canary de extremo a extremo mediante la simulación de una cadena de llamadas de servicio real. Puede implementar esta función sin modificar el código de su aplicación. Simplemente configure una regla de tráfico para la aplicación de ingreso. MSE propaga esta etiqueta a lo largo de la cadena de llamadas de servicio. Durante cada llamada de servicio, MSE enruta preferentemente el tráfico que coincide con la condición canary hacia la versión canary correspondiente. Si no existe una versión canary correspondiente, el tráfico vuelve automáticamente a la versión base (también conocida como versión estable).

En este ejemplo, se despliegan cuatro aplicaciones de negocio (spring-cloud-gateway, spring-cloud-a, spring-cloud-b y spring-cloud-c) y un Nacos Server que actúa como registro. La cadena de llamadas de servicio es: spring-cloud-gateway->A->B->C.

Las llamadas entre aplicaciones incluyen tanto llamadas de servicio de Spring Cloud como de Dubbo.

image

La versión canary de extremo a extremo utiliza el etiquetado de tráfico para enrutar preferentemente el tráfico canary hacia los nodos canary. Esto le permite realizar una validación canary controlada y garantizar la estabilidad del sistema.

La validación de versiones canary de extremo a extremo suele utilizar las siguientes estrategias:

  • Dirigir un pequeño porcentaje del tráfico de producción en vivo a la versión canary para realizar pruebas.

  • Filtrar el tráfico de producción en vivo según reglas específicas, como un encabezado o una cookie determinados.

Este tema describe cómo configurar ambas estrategias para admitir diversos escenarios de versión canary dentro de una arquitectura de microservices.

Paso 1: Conectar aplicaciones a MSE

Conecte las aplicaciones de microservices en un clúster de Container Service for Kubernetes (ACK) a Microservice Engine (MSE). Puede elegir un método de conexión según sus necesidades. Para obtener más información, consulte Connect microservice applications in an ACK cluster to Microservice Engine (MSE).

Conexión por namespace

  1. Inicie sesión en la consola de Microservice Engine (MSE) y seleccione una región en la barra de navegación superior.

  2. En el panel de navegación izquierdo, vaya a Microservices Governance > Application Governance.

  3. En la página Application list, haga clic en ACK Application Access.

  4. En el cuadro de diálogo ACK Application Access, configure los parámetros y haga clic en OK.

    Parámetro

    Descripción

    Cluster type

    Seleccione ACK Cluster, ACK Serverless Cluster o ACS Cluster.

    Nota

    Si no ha autorizado a Container Service para acceder a Microservice Engine (MSE), haga clic en Authorize.

    Cluster Name/ID

    Seleccione el Cluster Name/ID del clúster destino. Puede buscar por palabra clave.

    ack-onepilot

    Muestra el estado de conexión de ack-onepilot. Para obtener más información sobre el componente ack-onepilot y cómo actualizarlo, consulte ack-onepilot component y Install and upgrade the Microservice Engine (MSE) component.

    • Si ack-onepilot no está instalado, el sistema inicia automáticamente la instalación después de seleccionar un clúster ACK. Aparece un mensaje que indica que la instalación tarda aproximadamente un minuto.

      Si utiliza un RAM user y recibe un error de permiso, inicie sesión en la consola de Container Service for Kubernetes, vaya al clúster destino, haga clic en Component Management, busque ack-onepilot y luego haga clic en Install.

    • Si ack-onepilot ya está instalado, la consola muestra su estado como "Installed" seguido del número de versión, por ejemplo, Installed 4.2.0.

    Nota
    • Este paso conecta el componente ack-onepilot. Para ver sus detalles, inicie sesión en la consola de Container Service for Kubernetes, vaya al clúster destino y luego seleccione Operations & Maintenance > Component Management.

    • Después de instalar ack-onepilot, este inyecta automáticamente un probe, lo que puede aumentar el tiempo de inicio de la aplicación hasta en 10 segundos.

    • Cuando conecta aplicaciones mediante el método basado en namespaces, si el clúster destino no se encuentra en una de las siguientes regiones, asegúrese de que el clúster pueda acceder a la red pública y conectarse a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), China (Shanghai-Finance), China (Shenzhen), China (Hong Kong), Singapore, Germany (Frankfurt), Australia (Sydney), US (Silicon Valley) y US (Virginia).

    Access Type

    Seleccione Namespace Access.

    Cluster Namespace

    Seleccione un Cluster Namespace.

    Microservices Governance Namespace

    Seleccione un Microservices Governance Namespace.

Conexión por aplicación individual

  1. Inicie sesión en la consola de Microservice Engine (MSE) y seleccione una región en la barra de navegación superior.

  2. En el panel de navegación izquierdo, vaya a Microservices Governance > Application Governance.

  3. En la página Application list, haga clic en ACK Application Access.

  4. En el cuadro de diálogo ACK Application Access, configure los parámetros y haga clic en OK.

    Parámetro

    Descripción

    Cluster type

    Seleccione ACK Cluster, ACK Serverless Cluster o ACS Cluster.

    Nota

    Si no ha autorizado a Container Service para acceder a Microservice Engine (MSE), haga clic en Authorize.

    Cluster Name/ID

    Seleccione el Cluster Name/ID del clúster destino. Puede buscar por palabra clave.

    ack-onepilot

    Muestra el estado de conexión de ack-onepilot. Para obtener más información sobre el componente ack-onepilot y cómo actualizarlo, consulte ack-onepilot component y Install and upgrade the Microservice Engine (MSE) component.

    • Si ack-onepilot no está instalado, el sistema inicia automáticamente la instalación después de seleccionar un clúster ACK. Aparece un mensaje que indica que la instalación tarda aproximadamente un minuto.

      Si utiliza un RAM user y recibe un error de permiso, inicie sesión en la consola de Container Service for Kubernetes, vaya al clúster destino, haga clic en Component Management, busque ack-onepilot y luego haga clic en Install.

    • Si ack-onepilot ya está instalado, la consola muestra su estado como "Installed" seguido del número de versión, por ejemplo, Installed 4.2.0.

    Nota
    • Este paso conecta el componente ack-onepilot. Para ver sus detalles, inicie sesión en la consola de Container Service for Kubernetes, vaya al clúster destino y luego seleccione Operations & Maintenance > Component Management.

    • Después de instalar ack-onepilot, este inyecta automáticamente un probe, lo que puede aumentar el tiempo de inicio de la aplicación hasta en 10 segundos.

    • Cuando conecta aplicaciones mediante el método basado en namespaces, si el clúster destino no se encuentra en una de las siguientes regiones, asegúrese de que el clúster pueda acceder a la red pública y conectarse a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), China (Shanghai-Finance), China (Shenzhen), China (Hong Kong), Singapore, Germany (Frankfurt), Australia (Sydney), US (Silicon Valley) y US (Virginia).

    Access Type

    Seleccione Single Application Access.

    Access Procedure

    Siga los pasos proporcionados.

    Paso 1: Vaya a la página Workloads > Deployments del clúster y cambie al namespace de la aplicación.

    Paso 2: Busque la aplicación destino y haga clic en View YAML.

    Paso 3: Edite las etiquetas con el siguiente formato y haga clic en Update.

    spec:
      template:
        metadata:
          labels:
            # Set to "on" to enable the connection. The value must be enclosed in double quotation marks.
            msePilotAutoEnable: "on"
            # Specify the governance namespace. If the namespace does not exist, it is automatically created.
            mseNamespace: default
            # Specify the application name to connect to MSE. The name must be enclosed in double quotation marks.
            msePilotCreateAppName: "your-deployment-name"

Paso 2: Desplegar aplicaciones

  1. Inicie sesión en la consola de Container Service for Kubernetes (ACK). En el panel de navegación izquierdo, seleccione Clusters.

  2. En la página Clusters, haga clic en su clúster destino. En el panel de navegación izquierdo, vaya a Workloads > Deployments.

  3. En la página Deployments, seleccione un Namespaces y luego haga clic en Create from YAML.

    Este ejemplo despliega un Nacos Server como registro, junto con cuatro aplicaciones de negocio: spring-cloud-gateway, spring-cloud-a, spring-cloud-b y spring-cloud-c. También puede obtener el código fuente del Demo.

    • YAML para Nacos Server (registro)

      Ver archivo YAML

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nacos-server
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nacos-server
        template:
          metadata:
            labels:
              msePilotAutoEnable: "off"
              app: nacos-server
          spec:
            containers:
              - name: nacos-server
                image: 'registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2'
                env:
                  - name: MODE
                    value: standalone
                  - name: JVM_XMS
                    value: 512M
                  - name: JVM_XMX
                    value: 512M
                  - name: JVM_XMN
                    value: 256M
                imagePullPolicy: Always
                livenessProbe:
                  failureThreshold: 3
                  initialDelaySeconds: 15
                  periodSeconds: 10
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                readinessProbe:
                  failureThreshold: 5
                  initialDelaySeconds: 15
                  periodSeconds: 15
                  successThreshold: 1
                  tcpSocket:
                    port: 8848
                  timeoutSeconds: 3
                resources:
                  requests:
                    cpu: '1'
                    memory: 2Gi
            dnsPolicy: ClusterFirst
            restartPolicy: Always
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nacos-server
      spec:
        type: ClusterIP
        ports:
          - name: nacos-server-8848-8848
            port: 8848
            protocol: TCP
            targetPort: 8848
          - name: nacos-server-9848-9848
            port: 9848
            protocol: TCP
            targetPort: 9848
        selector:
          app: nacos-server
    • YAML para la aplicación spring-cloud-c

      Ver archivo YAML

      # Source: mse-simple-demo/templates/spring-cloud-c-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-c
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-c
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-c"
              app: "spring-cloud-c"
          spec:
            containers:
              - name: spring-cloud-c
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                - name: http-port
                  containerPort: 20003
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • YAML para la aplicación spring-cloud-b

      Ver archivo YAML

      # Source: mse-simple-demo/templates/spring-cloud-b-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-b
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-b
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-b"
              app: "spring-cloud-b"
          spec:
            containers:
              - name: spring-cloud-b
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20002
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • YAML para la aplicación spring-cloud-a

      Ver archivo YAML

      # Source: mse-simple-demo/templates/spring-cloud-a-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-a
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-a
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-a"
              app: "spring-cloud-a"
          spec:
            containers:
              - name: spring-cloud-a
                image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - name: http-port
                    containerPort: 20001
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
    • YAML para la aplicación spring-cloud-gateway

      Ver archivo YAML

      # Source: mse-simple-demo/templates/spring-cloud-gateway-deployment.yaml
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: spring-cloud-gateway
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: spring-cloud-gateway
        template:
          metadata:
            labels:
              msePilotAutoEnable: "on"
              msePilotCreateAppName: "spring-cloud-gateway"
              app: spring-cloud-gateway
          spec:
            containers:
              - image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-gateway:3.0.1"
                imagePullPolicy: Always
                env:
                  - name: nacos.host
                    value: "nacos-server"
                  - name: nacos.namespace
                    value: "public"
                  - name: enable.auto
                    value: "true"
                  - name: enable.rpc.invoke
                    value: "true"
                  - name: enable.sql
                    value: "false"
                  - name: enable.sentinel.demo.flow
                    value: "true"
                name: "spring-cloud-gateway"
                resources:
                  requests:
                    cpu: 1
                    memory: 2Gi
                  limits:
                    cpu: 1
                    memory: 2Gi
                ports:
                  - containerPort: 20000
            affinity:
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      topologyKey: failure-domain.beta.kubernetes.io/zone
                    weight: 50
                  - podAffinityTerm:
                      topologyKey: kubernetes.io/hostname
                    weight: 100
      ---
      # Source: mse-simple-demo/templates/spring-cloud-gateway-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
          service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
        name: spring-cloud-gateway-slb
      spec:
        ports:
          - port: 80
            protocol: TCP
            targetPort: 20000
        selector:
          app: spring-cloud-gateway
        type: LoadBalancer

    Ejecute el siguiente comando para comprobar el estado del despliegue:

    kubectl get svc,deploy

    Salida esperada:

    NAME                               TYPE           CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
    service/kubernetes                 ClusterIP      172.16.x.x   <none>       443/TCP             23h
    service/nacos-server               ClusterIP      172.16.x.x   <none>       8848/TCP,9848/TCP   94s
    service/spring-cloud-gateway-slb   LoadBalancer   172.16.x.x   8.130.x.x    80:32641/TCP        57s
    NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/nacos-server           1/1     1            1           94s
    deployment.apps/spring-cloud-a         1/1     1            1           66s
    deployment.apps/spring-cloud-b         1/1     1            1           74s
    deployment.apps/spring-cloud-c         1/1     1            1           83s
    deployment.apps/spring-cloud-gateway   1/1     1            1           57s

Paso 3: Desplegar versiones canary de spring-cloud-c y spring-cloud-a

  1. Inicie sesión en la consola de ACK. Utilice el siguiente YAML para desplegar la versión canary de la aplicación spring-cloud-c:

    Archivo YAML

    # Source: mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-c-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-c"
            alicloud.service.tag: gray
            app: "spring-cloud-c-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-c
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20002
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100
  2. Utilice el siguiente YAML para desplegar la versión canary de la aplicación spring-cloud-a:

    Archivo YAML

    # Source: mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-a-gray
          version: gray
      template:
        metadata:
          labels:
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "spring-cloud-a"
            alicloud.service.tag: gray
            app: "spring-cloud-a-gray"
            version: gray
        spec:
          containers:
            - name: spring-cloud-a
              image: "registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1"
              imagePullPolicy: Always
              env:
                - name: nacos.host
                  value: "nacos-server"
                - name: nacos.namespace
                  value: "public"
              resources:
                requests:
                  cpu: 1
                  memory: 2Gi
                limits:
                  cpu: 1
                  memory: 2Gi
              ports:
                - name: http-port
                  containerPort: 20001
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    topologyKey: failure-domain.beta.kubernetes.io/zone
                  weight: 50
                - podAffinityTerm:
                    topologyKey: kubernetes.io/hostname
                  weight: 100

Paso 4: Crear un grupo de carriles canary

  1. Inicie sesión en la consola de MSE Governance Center y seleccione una región en la barra de navegación superior.

  2. En el panel de navegación izquierdo, vaya a .

  3. En la página End-to-end Canary Release, seleccione un namespace de microservices en la parte superior de la página. Si no existe ningún grupo de carriles en el namespace de microservices seleccionado, haga clic en Create Lane Group and Lane. Si ya existe un grupo de carriles, haga clic en + Create Lane Group.

  4. En el panel Create Lane Group, haga clic en + Create Lane Group. En la página Create Lane Group, configure los siguientes parámetros y luego haga clic en OK.

    Parámetro

    Descripción

    Lane group name

    Introduzca un nombre personalizado para el grupo de carriles.

    Ingress type

    Seleccione java service gateway.

    ingress application

    Seleccione spring-cloud-gateway.

    lane group application

    Seleccione spring-cloud-a, spring-cloud-b y spring-cloud-c.

    Una vez creado el grupo de carriles, podrá verlo en la sección lane group de la página End-to-end Canary Release. Para editar el grupo de carriles, haga clic en el icono 编辑.

Paso 5: Crear un carril canary

Nota
  • Para utilizar la función de versión canary de extremo a extremo, agregue una tag especial a sus aplicaciones canary para distinguirlas de otros nodos. En un entorno de contenedores, añada alicloud.service.tag: ${tag} bajo spec.template.metadata.labels. En un entorno de ECS, agregue el parámetro de inicio de Java -Dalicloud.service.tag=${tag}.

  • Si utiliza un gateway de microservices Java como ingreso para una versión canary de extremo a extremo, MSE admite dos modos de enrutamiento de carriles.

    • Versión canary por contenido: Este modo se recomienda si puede identificar el tráfico canary a partir del contenido de la solicitud. De lo contrario, modifique su sistema para incluir un identificador único en las solicitudes. Esto garantiza que todas las solicitudes dentro de una sesión se enruten de manera consistente.

    • Versión canary por proporción: Utilice este modo como alternativa si no puede identificar el tráfico canary desde el contenido de la solicitud y no es posible modificar el sistema heredado. La desventaja es que las solicitudes del mismo origen podrían dirigirse a diferentes carriles, lo que provoca un comportamiento inconsistente.

  • El modo de enrutamiento de carriles debe ser uniforme en todos los carriles de un grupo. Solo puede ajustar la regla de enrutamiento Path del gateway y el modo de enrutamiento al crear el primer carril del grupo.

  1. En la parte inferior de la página End-to-end Canary Release, haga clic en Click to Create First Split Lane. Si ya existe un carril en el espacio de microservices seleccionado, haga clic en Create Lane.

  2. En el panel Create Lane, configure los parámetros del carril y haga clic en OK.

Parámetro

Descripción

Add node tag

Agregue manualmente una etiqueta a los nodos de su aplicación canary para distinguirlos de los nodos regulares.

Enter lane information

Lane Tag: La etiqueta de destino para el tráfico que coincide con las reglas del carril.

Confirm Matching Relationship: Compruebe que el número de nodos de aplicación con esta etiqueta sea correcto.

Configure routing and canary release rules

Defina las reglas para dirigir el tráfico hacia este carril.

  • Introduzca un Path. Si se deja vacío, coinciden todas las rutas.

  • Canary Release Mode: Seleccione Canary Release by Ratio.

  • Traffic percentage: 30%.

Nota

También puede establecer diferentes porcentajes de tráfico para cada ruta del gateway. Si utiliza esta función, asegúrese de que el porcentaje total de tráfico para la misma ruta en todos los grupos de carriles no exceda el 100%.

Enrutamiento por contenido

Parámetro

Descripción

Add node tag

Agregue manualmente una etiqueta a los nodos de su aplicación canary para distinguirlos de los nodos regulares.

Enter lane information

Lane Tag: La etiqueta de destino para el tráfico que cumple las condiciones de este carril. En este ejemplo, la etiqueta del carril se establece en gray.

Confirm Matching Relationship: Compruebe que el número de nodos de aplicación con esta etiqueta sea correcto.

Configure routing and canary release rules

Establezca las condiciones de la regla de enrutamiento.

  • Introduzca un Path. Si se deja vacío, coinciden todas las rutas.

  • Canary Release Mode: Seleccione Canary Release by Content.

  • Canary Release Condition: Agregue una nueva regla y seleccione Meet All Conditions.

    En este ejemplo, la condición se configura para enrutar solicitudes donde el parámetro name tiene el valor xiaoming.

    • Parameter Type: Parameter

    • Parameter: name

    • Condition: ==

    • Value: xiaoming

Enrutamiento por proporción

Importante

Asegúrese de que el agente Java de MSE sea la versión 3.2.3 o posterior. De lo contrario, las versiones canary basadas en porcentaje podrían no funcionar correctamente.

Parámetro

Descripción

Add node tag

Agregue manualmente una etiqueta a los nodos de su aplicación canary para distinguirlos de los nodos regulares.

Enter lane information

Lane Tag: La etiqueta de destino para el tráfico que cumple las condiciones de este carril. En este ejemplo, la etiqueta del carril se establece en gray.

Confirm Matching Relationship: Compruebe que el número de nodos de aplicación con esta etiqueta sea correcto.

Configure routing and canary release rules

Establezca las condiciones de la regla de enrutamiento.

  • Introduzca un Path. Si se deja vacío, coinciden todas las rutas.

  • Canary Release Mode: Seleccione Canary Release by Ratio.

  • Traffic percentage: 30%.

Después de crear el carril, puede consultar sus detalles en la sección Traffic Distribution de la página End-to-end Canary Release y realizar las siguientes acciones:

  • En la columna Actions, haga clic en Enable. Esto activa el carril y dirige el tráfico según sus reglas. El tráfico que coincide con la regla se enruta preferentemente a la versión de la aplicación con la etiqueta de carril correspondiente. Si no existe dicha versión, el tráfico se dirige a la versión de la aplicación sin etiquetar.

  • En la columna Actions, haga clic en Close. Esto desactiva el carril y el tráfico subsiguiente se dirige a la versión de la aplicación sin etiquetar.

  • Haga clic en el icono 图标 para ver el porcentaje de tráfico del carril.

  • Haga clic en el icono 应用状态图标 para establecer el estado de las aplicaciones en el carril.

Paso 6: Probar el tráfico base y canary

Por contenido de solicitud

  1. Ejecute el siguiente comando curl para probar el tráfico base:

    curl 8.130.x.x/A/a
    A[192.168.x.x][config=base] -> B[192.168.x.x] -> C[192.168.x.x]
    Nota

    En el comando, 8.130.x.x es la dirección IP pública expuesta por Spring Cloud Gateway.

  2. Ejecute el siguiente comando curl para probar el tráfico canary:

    curl 8.130.x.x/A/a?name=xiaoming
    Agray[192.168.x.x][config=base] -> B[192.168.x.x] -> Cgray[192.168.x.x]
    Nota
    • Cuando la solicitud incluye el parámetro name=xiaoming, coincide con la etiqueta canary, la cual se propaga posteriormente a los servicios descendentes.

    • Por ejemplo, una solicitud con una etiqueta canary enviada a las aplicaciones A y C se dirige a los nodos canary de dichas aplicaciones.

    • Cuando la solicitud llega a la aplicación B, se dirige al nodo base porque no existe un nodo canary para dicha aplicación.

Por proporción

Para probar la división de tráfico por proporción, utilice el siguiente script de Python 3. Asegúrese de que el paquete requests esté instalado y reemplace x.x.x.x con la dirección SLB de ingreso de su Spring Cloud Gateway.

# pip3 install requests
# python3 traffic.py
import requests
TOTAL_REQUEST = 100
ENTRY_URL = 'http://x.x.x.x/A/a'
def parse_tag(text:str):
    '''
    A[10.0.23.64][config=base] -> B[10.0.23.65] -> C[10.0.23.61]
    Agray[10.0.23.64][config=base] -> B[10.0.23.65] -> Cgray[10.0.23.61]
    Ablue[10.0.23.64][config=base] -> B[10.0.23.65] -> Cblue[10.0.23.61]
    '''
    print(text)
    app_parts = text.split(' -> ')
    # tag_app: C[10.0.23.61] / Cgray[10.0.23.61]
    tag_app = app_parts[-1]
    splits = tag_app.split('[')
    # tag_part: C / Cgray
    tag_part = splits[0]
    tag = tag_part[1:]
    return tag if len(tag) > 0 else 'base'
def get_tag(url:str):
    resp = requests.get(url)
    resp.encoding = resp.apparent_encoding
    return parse_tag(resp.text)
def cal_tag_count(url:str, total_request:int):
    count_map = {}
    for i in range(total_request):
        tag = get_tag(url)
        if tag not in count_map:
            count_map[tag] = 1
        else:
            count_map[tag] += 1
    print()
    print('Total Request:', total_request)
    print('Traffic Distribution:', count_map)
if __name__ == '__main__':
    cal_tag_count(ENTRY_URL, TOTAL_REQUEST)

Después de ejecutar el script, la salida muestra que aproximadamente el 30% del tráfico se dirige al entorno canary.

Paso 7: Observability

Si ocurre un problema en la aplicación, utilice la observability de MSE para consultar datos de excepciones y localizar rápidamente el problema.

Observability de Microservices Governance

En la página End-to-end Canary Release de MSE Microservices Governance, haga clic en la aplicación objetivo. La sección Application QPS Monitoring muestra los datos de tráfico para las versiones base y canary del carril correspondiente.

image

  • Total QPS: Total de consultas por segundo (QPS) para la aplicación.

  • Exception QPS: Número de solicitudes con errores para la aplicación.

  • CanaryQPS: Consultas por segundo (QPS) para la versión canary de la aplicación.

Documentos relacionados