Un plug-in de routage backend (également appelé plug-in de type Routing dans la console) évalue les attributs de la requête, tels que l'identité de l'appelant, l'environnement, l'adresse IP du client et les paramètres personnalisés, puis achemine chaque requête vers le service backend approprié. Utilisez ce plug-in pour le routage multi-locataire, les déploiements blue-green et la répartition du trafic basée sur l'environnement.
Fonctionnement
API Gateway évalue les règles de routage dans l'ordre. La première règle dont la condition correspond à la requête détermine le backend. Si aucune règle ne correspond, la requête est envoyée au backend par défaut défini dans l'API.
Chaque règle de routage spécifie :
Une condition à laquelle la requête doit correspondre
Un backend vers lequel acheminer les requêtes correspondantes
(Facultatif) Un weight pour répartir le trafic entre plusieurs backends correspondants
(Facultatif) Des Constant parameters à joindre à la requête avant le transfert
Cas d'utilisation
|
Scénario |
Fonctionnement |
Approche de configuration |
|
Routage multi-locataire |
Acheminez les appelants VIP vers des clusters de serveurs dédiés |
Faites correspondre |
|
Routage basé sur l'environnement |
Dirigez les requêtes de l'étape de test vers un serveur de test |
Faites correspondre |
|
Déploiement blue-green |
Répartissez le trafic entre les versions stable et nouvelle |
Attribuez des poids à plusieurs routes avec des conditions |
|
Hachage cohérent |
Épinglez les requêtes provenant de la même adresse IP ou ayant le même paramètre à un seul backend |
Définissez |
Format de configuration
Les plug-ins acceptent les formats JSON ou YAML. Les deux formats partagent le même schéma et sont interchangeables.
Le modèle YAML suivant illustre la structure de base :
---
routes:
# Route VIP callers to a dedicated VPC backend
- name: Vip
condition: "$CaAppId = 123456"
backend:
type: "HTTP-VPC"
vpcAccessName: "slbAccessForVip"
# Return a mock response for outdated clients
- name: MockForOldClient
condition: "$ClientVersion < '2.0.5'"
backend:
type: "MOCK"
statusCode: 400
body: "This version is not supported!!!"
Objet Route
|
Champ |
Obligatoire |
Description |
|
|
Oui |
Nom unique au sein du plug-in. Lettres et chiffres uniquement. Lorsqu'une requête correspond à cette règle, API Gateway ajoute un en-tête |
|
|
Oui |
Expression conditionnelle qui détermine si une requête correspond à cette règle. Les règles sont évaluées dans l'ordre ; la première correspondance l'emporte. |
|
|
Oui |
Configuration du backend qui remplace le backend par défaut de l'API. Doit être conforme à la spécification OpenAPI d'API Gateway. Une configuration incomplète renvoie |
|
|
Non |
Paramètres constants personnalisés joints à la requête avant le transfert. Chaque paramètre nécessite |
|
|
Non |
Poids du trafic pour cette route. Utilisé lorsque plusieurs routes correspondent. |
Expressions conditionnelles
Syntaxe
Les expressions conditionnelles utilisent une syntaxe similaire à SQL :
$ParamName = 'value' and $AnotherParam = 'value'
Règles :
Préfixez chaque paramètre par
$. Référencez n'importe quel paramètre de requête défini dans l'API (mode MAPPING ou PASSTHROUGH).Combinez les expressions avec
andetor. Utilisez des parenthèses()pour contrôler la priorité.Un paramètre inexistant dans une condition est évalué à
false.
Types de données pris en charge :
|
Type |
Description |
Exemple |
|
STRING |
Entourez de guillemets simples ou doubles |
|
|
INTEGER |
Valeurs entières |
|
|
NUMBER |
Valeurs à virgule flottante |
|
|
BOOLEAN |
Valeurs booléennes |
|
Paramètres système
Vous pouvez référencer ces paramètres intégrés sans les définir dans l'API. Si une API définit un paramètre portant le même nom, la valeur du paramètre de l'API est prioritaire.
|
Paramètre |
Description |
Exemples de valeurs |
|
|
Étape de déploiement de l'API |
|
|
|
Nom de domaine du groupe d'API |
- |
|
|
Heure de réception de la requête (UTC) |
- |
|
|
AppId de l'appelant |
|
|
|
AppKey de l'appelant |
- |
|
|
Adresse IP du client |
|
|
|
Nom de l'API demandée |
- |
|
|
Protocole de la requête |
|
|
|
Chaîne UserAgent du client |
- |
Exemples d'expressions
Acheminez les requêtes pour les API publiées à l'étape de test :
$CaStage = 'TEST'
Faites correspondre un utilisateur spécifique depuis une adresse IP spécifique :
$UserName = 'Admin' and $CaClientIp = '47.47.XX.XX'
Faites correspondre plusieurs AppIds via HTTPS :
$CaHttpScheme = 'HTTPS' and ($CaAppId = 1001 or $CaAppId = 1098 or $CaAppId = 2011)
Types de backend
La configuration du backend dans une règle de routage remplace le backend par défaut de l'API liée. Pour modifier uniquement certains champs sans changer de type de backend, spécifiez uniquement les champs à remplacer. Les configurations de backend doivent être cohérentes avec les fichiers Swagger importés dans API Gateway. Pour plus d'informations, consultez la rubrique Importer des fichiers Swagger pour créer des API avec des extensions API Gateway.
Pour distribuer les requêtes par poids, spécifiez tous les paramètres du backend. Pour les détails sur la priorité de l'en-tête Host, consultez la rubrique Configurer l'en-tête Host. Le délai d'expiration minimum configurable est de 300 ms. Les valeurs inférieures à ce seuil sont ramenées à 300 ms par défaut.
Référence des paramètres du backend
|
Type de backend |
Paramètre |
Description |
|
HTTP |
|
URL du backend, par ex. |
|
|
Remplacement de l'en-tête Host (priorité la plus élevée) |
|
|
|
Chemin de la requête, par ex. |
|
|
|
Méthode HTTP, par ex. |
|
|
|
Délai d'expiration en millisecondes (minimum 300 ms) |
|
|
HTTP-VPC |
|
Nom d'autorisation d'accès VPC |
|
|
Remplacement de l'en-tête Host (priorité la plus élevée) |
|
|
|
Protocole pour le backend VPC, par ex. |
|
|
|
Chemin de la requête |
|
|
|
Méthode HTTP |
|
|
|
Délai d'expiration en millisecondes (minimum 300 ms) |
|
|
FC |
|
Région Function Compute, par ex. |
|
|
Type de déclencheur : |
|
|
|
Nom du service FC (FCEvent) |
|
|
|
Nom de la fonction FC (FCEvent) |
|
|
|
URL de la fonction (HttpTrigger) |
|
|
|
ARN du rôle RAM permettant à API Gateway d'accéder à FC |
|
|
|
Méthode HTTP (HttpTrigger uniquement) |
|
|
OSS |
|
Région Object Storage Service (OSS), par ex. |
|
|
Nom du bucket OSS |
|
|
|
Clé de l'objet, par ex. |
|
|
|
Délai d'expiration en millisecondes (minimum 300 ms) |
|
|
|
Opération OSS, par ex. |
|
|
MOCK |
|
Corps de la réponse simulée |
|
|
Code d'état HTTP pour la réponse simulée |
|
|
|
Tableau des en-têtes de réponse (chacun avec |
Exemples de configuration
HTTP
---
backend:
type: HTTP
address: "http://10.10.100.2:8000"
httpTargetHostName: "a.b.com"
path: "/users/{userId}"
method: GET
timeout: 7000
HTTP-VPC
---
backend:
type: HTTP-VPC
vpcAccessName: vpcAccess1
vpcTargetHostName: "a.b.com"
vpcScheme: "https"
path: "/users/{userId}"
method: GET
timeout: 10000
Function Compute (FCEvent)
---
backend:
type: FC
fcRegion: cn-shanghai
fcType: FCEvent
serviceName: fcService
functionName: fcFunction
roleArn: "acs:ram::111111111:role/aliyunapigatewayaccessingfcrole"
Function Compute (HttpTrigger)
---
backend:
type: FC
fcRegion: cn-shenzhen
method: GET
fcType: HttpTrigger
fcUrl: https://1833848375796824.cn-shenzhen.fc.aliyuncs.com/2016-08-15/proxy/servicetest/fctest3/fctest3
roleArn: acs:ram::1833848375796824:role/aliyunapigatewayaccessingfcrole
OSS
---
backend:
type: OSS
ossRegionId: cn-hangzhou
bucketName: bucketName
key: /objectName
timeout: 10000
action: putObject
MOCK
---
backend:
type: MOCK
mockResult: "mock resul sample"
mockStatusCode: 200
mockHeaders:
- name: server
value: mock
- name: proxy
value: GW
Répartition pondérée du trafic
Attribuez des poids aux routes pour répartir le trafic proportionnellement. Les routes avec des poids plus élevés reçoivent davantage de requêtes.
---
routes:
- name: Backend01
condition: "1 = 1" # Always matches
weight: 100
backend:
type: "HTTP"
address: "https://test01.com"
path: "/web/cloudapi"
- name: Backend02
condition: "1 = 1"
weight: 80
backend:
type: "HTTP"
address: "https://test02.com"
path: "/web/cloudapi"
Règles de répartition du trafic :
|
Condition |
Comportement |
|
Une seule route correspond |
Toutes les requêtes sont envoyées au backend de cette route |
|
Plusieurs routes correspondent |
Les requêtes sont réparties proportionnellement selon le poids |
|
Aucune route ne correspond |
Les requêtes sont envoyées au backend par défaut de l'API |
La répartition basée sur le poids nécessite de spécifier tous les paramètres du backend dans chaque route.
Hachage cohérent
Le hachage cohérent distribue les requêtes en fonction d'un facteur de hachage. Les requêtes ayant le même facteur de hachage atteignent toujours le même backend.
Facteurs de hachage pris en charge :
|
Facteur de hachage |
Description |
|
Adresse IP source |
Les requêtes provenant de la même adresse IP client sont dirigées vers le même backend |
|
Paramètre de requête |
Les requêtes ayant la même valeur de paramètre sont dirigées vers le même backend |
Exemple : hachage par adresse IP source
---
parameters:
clientIp: "System:CaClientIp"
routeByHash: clientIp
routes:
- name: route1
condition: "1 = 1"
backend:
type: "MOCK"
statusCode: 200
mockResult: "Hello World!!!"
- name: route2
condition: "1 = 1"
backend:
type: "MOCK"
statusCode: 400
mockResult: "mock resul sample"
- name: route3
condition: "1 = 0" # Never matches
backend:
type: "HTTP"
address: "https://test.com"
constant-parameters:
- name: x-route-by-hash
location: header
value: "route-by-hash"
Dans cet exemple, parameters mappe clientIp au paramètre système CaClientIp. Le champ routeByHash sélectionne clientIp comme facteur de hachage. Les requêtes provenant de la même adresse IP client sont systématiquement acheminées vers le même backend parmi les routes correspondantes.
Scénarios de routage
Routage par ID d'application
Acheminez les appelants VIP (AppId 10098 ou 10099) vers un backend Virtual Private Cloud (VPC) dédié :
---
routes:
- name: Vip
condition: "$CaAppId = 10098 or $CaAppId = 10099"
backend:
type: "HTTP-VPC"
vpcAccessName: "slbAccessForVip"
Routage par environnement
Envoyez toutes les requêtes de l'étape de test vers un serveur de test public :
---
routes:
- name: Vip
condition: "$CaStage = 'TEST'"
backend:
type: "HTTP"
address: "https://test-env.foo.com"
Déploiement blue-green
Répartissez le trafic à 5 %/95 % entre un serveur bêta et un backend de production VPC :
---
routes:
- name: BlueGreenPercent05
condition: "1 = 1"
weight: 5
backend:
type: "HTTP"
address: "https://beta-version.api.foo.com"
path: "/web/cloudapi"
constant-parameters:
- name: x-route-blue-green
location: header
value: "route-blue-green"
- name: BlueGreenPercent95
condition: "1 = 1"
weight: 95
backend:
type: HTTP-VPC
path: "/web/cloudapi"
vpcAccessName: testvpc
condition: "1 = 1"correspond toujours.condition: "1 = 0"ne correspond jamais. Utilisezweightpour contrôler la répartition du trafic entre les routes correspondantes.
Limitations
|
Contrainte |
Limite |
Code d'erreur |
|
Taille des métadonnées du plug-in |
16 384 octets |
|
|
Routes par plug-in |
160 |
|
|
Taille de l'expression conditionnelle |
512 octets |
|
|
Intervalle de mise à jour minimum |
45 secondes |
|