Todos os produtos
Search
Central de documentação

Microservices Engine:Use o MSE para garantir inicialização e encerramento graceful de aplicações de microsserviços

Última atualização: Jun 28, 2026

Para evitar perda de tráfego durante implantações, muitas aplicações de alta concorrência realizam deploys apenas em horários de baixa demanda. Embora essa abordagem reduza problemas, ela ainda gera altos custos operacionais devido a fatores imprevisíveis. O MSE otimiza profundamente os processos de inicialização e encerramento das aplicações. Durante o encerramento, o MSE utiliza mecanismos de espera adaptativa e notificação proativa para garantir que todas as requisições pendentes sejam concluídas antes do serviço ficar offline, evitando interrupções abruptas. Na inicialização, o MSE alinha com precisão o gerenciamento do ciclo de vida dos microsserviços a cada fase da implantação por meio de sondas de prontidão (readiness probes), assegurando lançamentos estáveis de novas versões do serviço.

Pré-requisitos

Visão geral da arquitetura de demonstração

Considere uma arquitetura de aplicação composta por um gateway Zuul e instâncias de aplicações de microsserviços de backend (Spring Cloud). A cadeia de chamadas de backend inclui a aplicação de carrinho de compras A, a aplicação de centro de transações B e a aplicação de centro de inventário C. Essas aplicações utilizam o Nacos para registro e descoberta de serviços.

Na aplicação spring-cloud-zuul, conforme ilustrado na figura a seguir, ocorrem chamadas simultâneas tanto para a versão canary release quanto para a versão normal da spring-cloud-a, a uma taxa de 100 consultas por segundo (QPS).应用部署流量架构图

Implantar aplicações e ativar a governança de microsserviços

Importante

Como esta demonstração inclui tarefas CronHPA, instale primeiro o componente ack-kubernetes-cronhpa-controller no seu cluster. Para mais detalhes, consulte Etapa 1: Instale o componente CronHPA.

  1. Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.

  3. Na página Deployments, clique em Create from YAML.

  4. Em Sample Template, selecione Custom. Cole o seguinte YAML no campo Template e clique em Create.

    Este arquivo de demonstração chama-se mse-demo.yaml. Ele implanta o gateway Zuul e três aplicações (A, B e C). As aplicações A e B possuem, cada uma, uma versão baseline e uma versão canary release. A versão baseline da aplicação B tem o encerramento graceful desativado, enquanto sua versão canary possui o encerramento graceful ativado. A aplicação C tem o aquecimento de serviço (warmup) ativado, com duração de 120 segundos.

    Expandir para visualizar o arquivo YAML

    # Nacos Server
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nacos-server
      name: nacos-server
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nacos-server
      template:
        metadata:
          labels:
            app: nacos-server
            msePilotCreateAppName: nacos-server
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: MODE
              value: standalone
            image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
            imagePullPolicy: Always
            name: nacos-server
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
          dnsPolicy: ClusterFirst
          restartPolicy: Always
    # Nacos Server Service configuration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    # Zuul gateway application
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-zuul
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-zuul
      template:
        metadata:
          labels:
            app: spring-cloud-zuul
            msePilotCreateAppName: spring-cloud-zuul
            msePilotAutoEnable: "on"
        spec:
          containers:
            - env:
                - name: JAVA_HOME
                  value: /usr/lib/jvm/java-1.8-openjdk/jre
                - name: LANG
                  value: C.UTF-8
              image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.1
              imagePullPolicy: Always
              name: spring-cloud-zuul
              ports:
                - containerPort: 20000
    # Application A baseline version, with full-link pass-through enabled by machine dimension.
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-a
      name: spring-cloud-a
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata: 
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-a
            ports:
            - containerPort: 20001
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    # Application A canary version, with full-link pass-through enabled by machine dimension.
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-a-gray
      name: spring-cloud-a-gray
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-a-gray
      strategy:
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: profiler.micro.service.tag.trace.enable
              value: "true"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-a-gray
            ports:
            - containerPort: 20001
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 10
              periodSeconds: 30
    # Application B baseline version, with graceful shutdown disabled.
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-b
      name: spring-cloud-b
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b
      strategy:
      template:
        metadata:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            - name: micro.service.shutdown.server.enable
              value: "false"
            - name: profiler.micro.service.http.server.enable
              value: "false"
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-b
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    # Application B canary version, with graceful shutdown enabled by default.
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-b-gray
      name: spring-cloud-b-gray
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-b-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-b-gray
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-b-gray
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    # Application C baseline version
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: spring-cloud-c
      name: spring-cloud-c
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: "on"
        spec:
          containers:
          - env:
            - name: LANG
              value: C.UTF-8
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
            imagePullPolicy: Always
            name: spring-cloud-c
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 10
              periodSeconds: 30
    # HPA configuration
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-b
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-b
       jobs:
       - name: "scale-down"
         schedule: "0 0/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 0/5 * * * *"
         targetSize: 2
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-b-gray
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-b-gray
       jobs:
       - name: "scale-down"
         schedule: "0 0/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 0/5 * * * *"
         targetSize: 2
    ---
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: CronHorizontalPodAutoscaler
    metadata:
      labels:
        controller-tools.k8s.io: "1.0"
      name: spring-cloud-c
    spec:
       scaleTargetRef:
          apiVersion: apps/v1beta2
          kind: Deployment
          name: spring-cloud-c
       jobs:
       - name: "scale-down"
         schedule: "0 2/5 * * * *"
         targetSize: 1
       - name: "scale-up"
         schedule: "10 2/5 * * * *"
         targetSize: 2
    # Expose Zuul gateway via SLB for demonstration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zuul-slb
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 20000
      selector:
        app: spring-cloud-zuul
      type: ClusterIP
    # Expose Application A as a Kubernetes Service
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: spring-cloud-a-base
    spec:
      ports:
        - name: http
          port: 20001
          protocol: TCP
          targetPort: 20001
      selector:
        app: spring-cloud-a
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: spring-cloud-a-gray
    spec:
      ports:
        - name: http
          port: 20001
          protocol: TCP
          targetPort: 20001
      selector:
        app: spring-cloud-a-gray
    # Nacos Server SLB Service configuration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-slb
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: LoadBalancer
  5. Ative a governança de microsserviços para suas aplicações implantadas. Para mais detalhes, consulte Ative a governança do MSE para aplicações de microsserviços ACK e ACS (Java).

Visualize dados observáveis

Tanto a spring-cloud-b quanto a spring-cloud-b-gray possuem o CronHPA ativado, simulando um dimensionamento agendado a cada 5 minutos. Clique em nome da aplicação e, em seguida, na aba Scaling para ver os detalhes.

  • Aplicação spring-cloud-b:

    Na página CronHPA, a aplicação spring-cloud-b apresenta duas tarefas de dimensionamento agendado, ambas executadas com sucesso (status: Succeed). A tarefa scale-down roda no cronograma 0 0/5 * * * * com contagem alvo de réplicas igual a 1. Já a tarefa scale-up executa no cronograma 10 0/5 * * * * com contagem alvo de réplicas igual a 2.

  • Aplicação spring-cloud-b-gray:

    A página CronHPA exibe duas tarefas agendadas: scale-down (cronograma 0 0/5 * * * *, contagem alvo de réplicas 1) e scale-up (cronograma 10 0/5 * * * *, contagem alvo de réplicas 2), ambas com status Succeed.

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

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance e clique em cartão da aplicação spring-cloud-a.

  3. A página Application Overview exibe os dados observáveis desta aplicação.

    Os dados mostram:

    • A versão spring-cloud-a-gray apresentou zero erros de requisição durante o dimensionamento dos pods, indicando ausência de perda de tráfego.

    • A versão spring-cloud-a, que possui o encerramento graceful desativado, sofreu 20 falhas de requisição de spring-cloud-a para spring-cloud-b durante o dimensionamento dos pods, resultando em perda de tráfego.

Ative a inicialização graceful

A aplicação spring-cloud-c usa o CronHPA para simular o comportamento de inicialização, realizando dimensionamento a cada 5 minutos — reduzindo para um nó no segundo 0 do minuto 2 e aumentando para dois nós no segundo 10 do minuto 2. Na página CronHPA, o CronHPA da spring-cloud-c possui duas tarefas: scale-down (cronograma 0 2/5 * * * *, contagem alvo de réplicas 1, status Succeed) e scale-up (cronograma 10 2/5 * * * *, contagem alvo de réplicas 2, status Succeed).

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

  2. No painel de navegação à esquerda, escolha Microservices Governance > Application Governance e clique em cartão da aplicação spring-cloud-c.

  3. No painel de navegação à esquerda, escolha Traffic management e selecione a aba Graceful Start/Shutdown. Ative a opção Graceful Start. Na caixa de diálogo Prompt message, clique em OK. A duração do aquecimento (warmup) é definida por padrão como 120 segundos.

    Após ativar o aquecimento, o tráfego direcionado a uma aplicação reiniciada aumenta gradualmente ao longo do tempo. Em cenários de início lento — como quando uma aplicação precisa pré-construir pools de conexões ou caches durante a inicialização — ativar o aquecimento de serviço garante uma inicialização ordenada dos recursos e uma entrada em operação segura, sem perda de tráfego.