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.
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
Inicie sesión en la consola de Microservice Engine (MSE) y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, vaya a Microservices Governance > Application Governance.
En la página Application list, haga clic en ACK Application Access.
-
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.
NotaSi 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
Inicie sesión en la consola de Microservice Engine (MSE) y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, vaya a Microservices Governance > Application Governance.
En la página Application list, haga clic en ACK Application Access.
-
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.
NotaSi 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
Inicie sesión en la consola de Container Service for Kubernetes (ACK). En el panel de navegación izquierdo, seleccione Clusters.
En la página Clusters, haga clic en su clúster destino. En el panel de navegación izquierdo, vaya a .
-
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)
-
YAML para la aplicación spring-cloud-c
-
YAML para la aplicación spring-cloud-b
-
YAML para la aplicación spring-cloud-a
-
YAML para la aplicación spring-cloud-gateway
Ejecute el siguiente comando para comprobar el estado del despliegue:
kubectl get svc,deploySalida 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
-
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:
-
Utilice el siguiente YAML para desplegar la versión canary de la aplicación spring-cloud-a:
Paso 4: Crear un grupo de carriles canary
Inicie sesión en la consola de MSE Governance Center y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, vaya a .
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.
-
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
Para utilizar la función de versión canary de extremo a extremo, agregue una
tagespecial a sus aplicaciones canary para distinguirlas de otros nodos. En un entorno de contenedores, añadaalicloud.service.tag: ${tag}bajospec.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.
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.
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.
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.
|
Enrutamiento por proporción
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.
|
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
-
Ejecute el siguiente comando
curlpara 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]NotaEn el comando,
8.130.x.xes la dirección IP pública expuesta por Spring Cloud Gateway. -
Ejecute el siguiente comando
curlpara 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]NotaCuando 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.

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.