Todos os produtos
Search
Central de documentação

Microservices Engine:Lançamento canário de ponta a ponta com Spring Cloud Gateway ou Zuul autogerenciado

Última atualização: Jun 28, 2026

Spring Cloud Gateway e Zuul são gateways de API comuns em arquiteturas de microsserviços que oferecem suporte a encaminhamento de rotas e processamento de filtros. Configure regras de roteamento para direcionar requisições a um ambiente canário e validar uma versão canário. O recurso de lançamento canário de ponta a ponta no Microservices Engine (MSE) permite implementar limitação de tráfego de ponta a ponta sem modificar o código de negócio. Este tópico mostra como configurar um gateway Spring Cloud Gateway ou Zuul para ativar o lançamento canário de ponta a ponta.

Pré-requisitos

Contexto

Este tópico demonstra como usar o MSE para um lançamento canário de ponta a ponta simulando uma cadeia real de chamadas de serviço. Implemente esse recurso sem modificar o código da aplicação. Basta configurar uma regra de tráfego para a aplicação de entrada. O MSE propaga essa tag por toda a cadeia de chamadas de serviço. Durante cada chamada, o MSE roteia preferencialmente o tráfego correspondente à condição canário para a versão canário adequada. Caso não exista uma versão canário correspondente, o tráfego retorna automaticamente à versão base (também conhecida como versão estável).

Neste exemplo, quatro aplicações de negócio (spring-cloud-gateway, spring-cloud-a, spring-cloud-b e spring-cloud-c) e um Nacos Server atuando como registro são implantados. A cadeia de chamadas de serviço é: spring-cloud-gateway->A->B->C.

As chamadas entre as aplicações incluem tanto chamadas de serviço Spring Cloud quanto Dubbo.

image

O lançamento canário de ponta a ponta utiliza marcação de tráfego para rotear preferencialmente o tráfego canário para nós canários. Isso permite realizar validações canárias controladas e garantir a estabilidade do sistema.

A validação do lançamento canário de ponta a ponta geralmente utiliza as seguintes estratégias:

  • Direcionar uma pequena porcentagem do tráfego de produção ativo para a versão canário para testes.

  • Filtrar o tráfego de produção ativo com base em regras específicas, como um header ou cookie especificado.

Este tópico descreve como configurar ambas as estratégias para suportar diversos cenários de lançamento canário em uma arquitetura de microsserviços.

Etapa 1: Conectar aplicações ao MSE

Conecte as aplicações de microsserviços em um cluster Container Service for Kubernetes (ACK) ao Microservice Engine (MSE). Escolha um método de conexão adequado às suas necessidades. Para mais informações, consulte Conectar aplicações de microsserviços em um cluster ACK ao Microservice Engine (MSE).

Conexão por namespace

  1. Faça login no console do Microservice Engine (MSE) e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.

  3. Na página Application list, clique em ACK Application Access.

  4. Na caixa de diálogo ACK Application Access, configure os parâmetros e clique em OK.

    Parâmetro

    Descrição

    Cluster type

    Selecione ACK Cluster, ACK Serverless Cluster ou ACS Cluster.

    Nota

    Se você ainda não autorizou o Container Service a acessar o Microservice Engine (MSE), clique em Authorize.

    Cluster Name/ID

    Selecione o Cluster Name/ID do cluster de destino. É possível pesquisar por palavra-chave.

    ack-onepilot

    Exibe o status de conexão do ack-onepilot. Para mais informações sobre o componente ack-onepilot e como atualizá-lo, consulte Componente ack-onepilot e Instale e atualize o componente do Microservice Engine (MSE).

    • Se o ack-onepilot não estiver instalado, o sistema inicia automaticamente a instalação após a seleção de um cluster ACK. Uma mensagem indica que a instalação leva cerca de um minuto.

      Se você usar um usuário RAM e receber um erro de permissão, faça login no console do Container Service for Kubernetes, acesse o cluster de destino, clique em Component Management, localize ack-onepilot e clique em Install.

    • Se o ack-onepilot já estiver instalado, o console exibirá seu status como "Installed" seguido pelo número da versão, por exemplo, Installed 4.2.0.

    Nota
    • Esta etapa conecta o componente ack-onepilot. Para visualizar seus detalhes, faça login no console do Container Service for Kubernetes, acesse o cluster de destino e escolha Operations & Maintenance > Component Management.

    • Após a instalação do ack-onepilot, ele injeta automaticamente um probe, o que pode aumentar o tempo de inicialização da aplicação em até 10 segundos.

    • Ao conectar aplicações usando o método baseado em namespace, se o cluster de destino não estiver em uma das regiões a seguir, garanta que o cluster possa acessar a rede pública e se conectar a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), China (Shanghai-Finance), China (Shenzhen), China (Hong Kong), Singapura, Alemanha (Frankfurt), Austrália (Sydney), EUA (Silicon Valley) e EUA (Virginia).

    Access Type

    Selecione Namespace Access.

    Cluster Namespace

    Selecione um Cluster Namespace.

    Microservices Governance Namespace

    Selecione um Microservices Governance Namespace.

Conexão por aplicação individual

  1. Faça login no console do Microservice Engine (MSE) e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.

  3. Na página Application list, clique em ACK Application Access.

  4. Na caixa de diálogo ACK Application Access, configure os parâmetros e clique em OK.

    Parâmetro

    Descrição

    Cluster type

    Selecione ACK Cluster, ACK Serverless Cluster ou ACS Cluster.

    Nota

    Se você ainda não autorizou o Container Service a acessar o Microservice Engine (MSE), clique em Authorize.

    Cluster Name/ID

    Selecione o Cluster Name/ID do cluster de destino. É possível pesquisar por palavra-chave.

    ack-onepilot

    Exibe o status de conexão do ack-onepilot. Para mais informações sobre o componente ack-onepilot e como atualizá-lo, consulte Componente ack-onepilot e Instale e atualize o componente do Microservice Engine (MSE).

    • Se o ack-onepilot não estiver instalado, o sistema inicia automaticamente a instalação após a seleção de um cluster ACK. Uma mensagem indica que a instalação leva cerca de um minuto.

      Se você usar um usuário RAM e receber um erro de permissão, faça login no console do Container Service for Kubernetes, acesse o cluster de destino, clique em Component Management, localize ack-onepilot e clique em Install.

    • Se o ack-onepilot já estiver instalado, o console exibirá seu status como "Installed" seguido pelo número da versão, por exemplo, Installed 4.2.0.

    Nota
    • Esta etapa conecta o componente ack-onepilot. Para visualizar seus detalhes, faça login no console do Container Service for Kubernetes, acesse o cluster de destino e escolha Operations & Maintenance > Component Management.

    • Após a instalação do ack-onepilot, ele injeta automaticamente um probe, o que pode aumentar o tempo de inicialização da aplicação em até 10 segundos.

    • Ao conectar aplicações usando o método baseado em namespace, se o cluster de destino não estiver em uma das regiões a seguir, garanta que o cluster possa acessar a rede pública e se conectar a acm.aliyun.com:8080: China (Qingdao), China (Hangzhou), China (Beijing), China (Shanghai), China (Shanghai-Finance), China (Shenzhen), China (Hong Kong), Singapura, Alemanha (Frankfurt), Austrália (Sydney), EUA (Silicon Valley) e EUA (Virginia).

    Access Type

    Selecione Single Application Access.

    Access Procedure

    Siga as etapas fornecidas.

    Etapa 1: Acesse a página Workloads > Deployments do cluster e mude para o namespace da aplicação.

    Etapa 2: Localize a aplicação de destino e clique em View YAML.

    Etapa 3: Edite os rótulos no formato a seguir e clique em 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"

Etapa 2: Implantar aplicações

  1. Faça login no console do Container Service for Kubernetes (ACK). No painel de navegação à esquerda, escolha Clusters.

  2. Na página Clusters, clique no cluster de destino. No painel de navegação à esquerda, escolha Workloads > Deployments.

  3. Na página Deployments, selecione um Namespaces e clique em Create from YAML.

    Este exemplo implanta um Nacos Server como registro, juntamente com quatro aplicações de negócio: spring-cloud-gateway, spring-cloud-a, spring-cloud-b e spring-cloud-c. Você também pode obter o código-fonte no Demo.

    • YAML para o Nacos Server (registro)

      Visualize arquivo 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 a aplicação spring-cloud-c

      Visualize arquivo 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 a aplicação spring-cloud-b

      Visualize arquivo 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 a aplicação spring-cloud-a

      Visualize arquivo 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 a aplicação spring-cloud-gateway

      Visualize arquivo 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

    Execute o comando a seguir para verificar o status da implantação:

    kubectl get svc,deploy

    Saída 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

Etapa 3: Implantar versões canário de spring-cloud-c e spring-cloud-a

  1. Faça login no console do ACK. Use o YAML a seguir para implantar a versão canário da aplicação spring-cloud-c:

    Arquivo 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. Use o YAML a seguir para implantar a versão canário da aplicação spring-cloud-a:

    Arquivo 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

Etapa 4: Crie um grupo de faixas canário

  1. Faça login no console do MSE Governance Center e selecione uma região na barra de navegação superior.

  2. No painel de navegação à esquerda, escolha .

  3. Na página End-to-end Canary Release, selecione um namespace de microsserviço no topo da página. Se não existir nenhum grupo de faixas no namespace de microsserviço selecionado, clique em Create Lane Group and Lane. Se já existir um grupo de faixas, clique em + Create Lane Group.

  4. No painel Create Lane Group, clique em + Create Lane Group. Na página Create Lane Group, configure os parâmetros a seguir e clique em OK.

    Parâmetro

    Descrição

    Lane group name

    Insira um nome personalizado para o grupo de faixas.

    Ingress type

    Selecione java service gateway.

    ingress application

    Selecione spring-cloud-gateway.

    lane group application

    Selecione spring-cloud-a, spring-cloud-b e spring-cloud-c.

    Após a criação do grupo de faixas, visualize-o na seção lane group da página End-to-end Canary Release. Para editar o grupo de faixas, clique no ícone 编辑.

Etapa 5: Crie uma faixa canário

Nota
  • Para usar o recurso de lançamento canário de ponta a ponta, adicione uma tag especial às suas aplicações canário para distingui-las de outros nós. Em um ambiente de contêiner, adicione alicloud.service.tag: ${tag} em spec.template.metadata.labels. Em um ambiente ECS, adicione o parâmetro de inicialização Java -Dalicloud.service.tag=${tag}.

  • Se você usar um gateway de microsserviço Java como entrada para um lançamento canário de ponta a ponta, o MSE suporta dois modos de roteamento de faixa.

    • Lançamento canário por conteúdo: Este modo é recomendado se for possível identificar o tráfego canário a partir do conteúdo da requisição. Caso contrário, modifique seu sistema para incluir um identificador único nas requisições. Isso garante que todas as requisições dentro de uma sessão sejam roteadas consistentemente.

    • Lançamento canário por proporção: Use este modo como fallback se não for possível identificar o tráfego canário pelo conteúdo da requisição e não for viável modificar o sistema legado. A desvantagem é que requisições da mesma origem podem ser roteadas para faixas diferentes, resultando em comportamento inconsistente.

  • O modo de roteamento de faixa deve ser consistente em todas as faixas de um grupo de faixas. Só é possível ajustar o Path da regra de roteamento do gateway e o modo de roteamento de faixa ao criar a primeira faixa do grupo.

  1. Na parte inferior da página End-to-end Canary Release, clique em Click to Create First Split Lane. Se já existir uma faixa no espaço de microsserviço selecionado, clique em Create Lane.

  2. No painel Create Lane, configure os parâmetros da faixa e clique em OK.

Parâmetro

Descrição

Add node tag

Adicione manualmente uma tag aos nós da sua aplicação canário para distingui-los dos nós regulares.

Enter lane information

Lane Tag: A tag de destino para o tráfego que corresponde às regras da faixa.

Confirm Matching Relationship: Verifique se o número de nós de aplicação com esta tag está correto.

Configure routing and canary release rules

Defina as regras para rotear o tráfego para esta faixa.

  • Insira um Path. Se deixado em branco, todos os caminhos serão correspondidos.

  • Canary Release Mode: Selecione Canary Release by Ratio.

  • Traffic percentage: 30%.

Nota

Também é possível definir porcentagens de tráfego diferentes para cada caminho do gateway. Se utilizar este recurso, certifique-se de que a porcentagem total de tráfego para o mesmo caminho em todos os grupos de faixas não exceda 100%.

Roteamento por conteúdo

Parâmetro

Descrição

Add node tag

Adicione manualmente uma tag aos nós da sua aplicação canário para distingui-los dos nós regulares.

Enter lane information

Lane Tag: A tag de destino para o tráfego que corresponde às condições desta faixa. Este exemplo define a tag da faixa como gray.

Confirm Matching Relationship: Verifique se o número de nós de aplicação com esta tag está correto.

Configure routing and canary release rules

Defina as condições da regra de roteamento.

  • Insira um Path. Se deixado em branco, todos os caminhos serão correspondidos.

  • Canary Release Mode: Selecione Canary Release by Content.

  • Canary Release Condition: Adicione uma nova regra e selecione Meet All Conditions.

    Este exemplo define a condição para rotear requisições onde o parâmetro name tem o valor xiaoming.

    • Parameter Type: Parameter

    • Parameter: name

    • Condition: ==

    • Value: xiaoming

Roteamento por proporção

Importante

Certifique-se de que o agente Java do MSE seja da versão 3.2.3 ou posterior. Caso contrário, os lançamentos canário baseados em porcentagem podem não funcionar corretamente.

Parâmetro

Descrição

Add node tag

Adicione manualmente uma tag aos nós da sua aplicação canário para distingui-los dos nós regulares.

Enter lane information

Lane Tag: A tag de destino para o tráfego que corresponde às condições desta faixa. Este exemplo define a tag da faixa como gray.

Confirm Matching Relationship: Verifique se o número de nós de aplicação com esta tag está correto.

Configure routing and canary release rules

Defina as condições da regra de roteamento.

  • Insira um Path. Se deixado em branco, todos os caminhos serão correspondidos.

  • Canary Release Mode: Selecione Canary Release by Ratio.

  • Traffic percentage: 30%.

Após criar a faixa, visualize seus detalhes na seção Traffic Distribution da página End-to-end Canary Release e execute as seguintes ações:

  • Na coluna Actions, clique em Enable. Isso ativa a faixa e roteia o tráfego de acordo com suas regras. O tráfego que corresponde à regra é roteado preferencialmente para a versão da aplicação com a tag de faixa correspondente. Se tal versão não existir, o tráfego será roteado para a versão da aplicação sem tag.

  • Na coluna Actions, clique em Close. Isso desativa a faixa, e o tráfego subsequente é roteado para a versão da aplicação sem tag.

  • Clique no ícone 图标 para visualizar a porcentagem de tráfego da faixa.

  • Clique no ícone 应用状态图标 para definir o status das aplicações na faixa.

Etapa 6: Testar tráfego base e canário

Por conteúdo da requisição

  1. Execute o seguinte comando curl para testar o tráfego 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

    No comando, 8.130.x.x é o endereço IP público exposto pelo Spring Cloud Gateway.

  2. Execute o seguinte comando curl para testar o tráfego canário:

    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
    • Quando a requisição inclui o parâmetro name=xiaoming, ela corresponde à tag canário, que é então propagada para jusante.

    • Por exemplo, uma requisição com tag canário enviada para as aplicações A e C é roteada para os nós canário das aplicações A e C.

    • Quando a requisição chega à aplicação B, ela é roteada para o nó base porque não existe um nó canário para a aplicação B.

Por proporção

Para testar a divisão de tráfego por proporção, use o script Python 3 a seguir. Certifique-se de que o pacote requests esteja instalado e substitua x.x.x.x pelo endereço SLB de entrada do seu 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)

Após executar o script, a saída mostra que aproximadamente 30% do tráfego é roteado para o ambiente canário.

Etapa 7: Observabilidade

Se ocorrer um problema na aplicação, utilize a observabilidade do MSE para visualizar dados de exceção e localizar rapidamente o problema.

Observabilidade da Governança de Microsserviços

Na página End-to-end Canary Release da Governança de Microsserviços do MSE, clique na aplicação de destino. A seção Application QPS Monitoring mostra dados de tráfego para as versões base e canário da faixa correspondente.

image

  • Total QPS: Total de consultas por segundo (QPS) da aplicação.

  • Exception QPS: Número de requisições falhas da aplicação.

  • CanaryQPS: Consultas por segundo (QPS) da versão canário da aplicação.

Documentos relacionados