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.
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.
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Deployments, clique em Create from YAML.
-
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
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.
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance e clique em cartão da aplicação spring-cloud-a.
-
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).
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance e clique em cartão da aplicação spring-cloud-c.
-
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.