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.
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
Faça login no console do Microservice Engine (MSE) e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.
Na página Application list, clique em ACK Application Access.
-
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.
NotaSe 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
Faça login no console do Microservice Engine (MSE) e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Microservices Governance > Application Governance.
Na página Application list, clique em ACK Application Access.
-
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.
NotaSe 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
Faça login no console do Container Service for Kubernetes (ACK). No painel de navegação à esquerda, escolha Clusters.
Na página Clusters, clique no cluster de destino. No painel de navegação à esquerda, escolha .
-
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)
-
YAML para a aplicação spring-cloud-c
-
YAML para a aplicação spring-cloud-b
-
YAML para a aplicação spring-cloud-a
-
YAML para a aplicação spring-cloud-gateway
Execute o comando a seguir para verificar o status da implantação:
kubectl get svc,deploySaí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
-
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:
-
Use o YAML a seguir para implantar a versão canário da aplicação spring-cloud-a:
Etapa 4: Crie um grupo de faixas canário
Faça login no console do MSE Governance Center e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha .
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.
-
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
Para usar o recurso de lançamento canário de ponta a ponta, adicione uma
tagespecial às suas aplicações canário para distingui-las de outros nós. Em um ambiente de contêiner, adicionealicloud.service.tag: ${tag}emspec.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.
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.
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.
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.
|
Roteamento por proporção
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.
|
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
-
Execute o seguinte comando
curlpara 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]NotaNo comando,
8.130.x.xé o endereço IP público exposto pelo Spring Cloud Gateway. -
Execute o seguinte comando
curlpara 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]NotaQuando 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.

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.