Um plug-in de roteamento de backend (também chamado de plug-in do tipo Routing no console) avalia atributos da requisição, como identidade do chamador, ambiente, IP do cliente e parâmetros personalizados, e encaminha cada requisição ao serviço de backend apropriado. Use este plug-in para roteamento multilocatário, implantações blue-green e divisão de tráfego baseada em ambiente.
Como funciona
O API Gateway avalia as regras de roteamento em ordem. A primeira regra cuja condição corresponder à requisição determina o backend. Se nenhuma regra corresponder, a requisição seguirá para o backend padrão definido na API.
Cada regra de roteamento especifica:
Uma condition que a requisição deve atender
Um backend de destino para as requisições correspondentes
(Opcional) Um weight para distribuir o tráfego entre vários backends correspondentes
(Opcional) Constant parameters para anexar à requisição antes do encaminhamento
Casos de uso
|
Cenário |
Como funciona |
Abordagem de configuração |
|
Roteamento multilocatário |
Encaminha chamadores VIP para clusters de servidores dedicados |
Use |
|
Roteamento baseado em ambiente |
Direciona requisições de estágio de teste para um servidor de testes |
Use |
|
Implantação blue-green |
Divide o tráfego entre versões estáveis e novas |
Atribua pesos a várias rotas com condições |
|
Hashing consistente |
Fixa requisições do mesmo IP ou com o mesmo parâmetro em um único backend |
Defina |
Formato de configuração
Os plug-ins aceitam JSON ou YAML. Ambos os formatos compartilham o mesmo esquema e permitem conversão mútua.
O modelo YAML a seguir mostra a estrutura básica:
---
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!!!"
Objeto Route
|
Campo |
Obrigatório |
Descrição |
|
|
Sim |
Nome exclusivo dentro do plug-in. Aceita apenas letras e dígitos. Quando uma requisição corresponde a esta regra, o API Gateway adiciona um cabeçalho |
|
|
Sim |
Expressão condicional que determina se uma requisição corresponde a esta regra. As regras são avaliadas em ordem; a primeira correspondência prevalece. Consulte Expressões condicionais. |
|
|
Sim |
Configuração de backend que substitui o backend padrão da API. Deve estar em conformidade com a especificação OpenAPI do API Gateway. Uma configuração incompleta retorna |
|
|
Não |
Parâmetros constantes personalizados anexados à requisição antes do encaminhamento. Cada parâmetro requer |
|
|
Não |
Peso de tráfego para esta rota. Usado quando várias rotas correspondem. Consulte Distribuição ponderada de tráfego. |
Expressões condicionais
Sintaxe
As expressões condicionais usam sintaxe semelhante a SQL:
$ParamName = 'value' and $AnotherParam = 'value'
Regras:
Prefixe cada parâmetro com
$. Referencie qualquer parâmetro de requisição definido na API (modo MAPPING ou PASSTHROUGH).Combine expressões com
andeor. Use parênteses()para controlar a precedência.Um parâmetro inexistente em uma condição é avaliado como
false.
Tipos de dados suportados:
|
Tipo |
Descrição |
Exemplo |
|
STRING |
Coloque entre aspas simples ou duplas |
|
|
INTEGER |
Valores inteiros |
|
|
NUMBER |
Valores de ponto flutuante |
|
|
BOOLEAN |
Valores booleanos |
|
Parâmetros do sistema
Referencie estes parâmetros integrados sem defini-los na API. Se uma API definir um parâmetro com o mesmo nome, o valor do parâmetro da API terá precedência.
|
Parâmetro |
Descrição |
Valores de exemplo |
|
|
Estágio de implantação da API |
|
|
|
Nome de domínio do grupo de APIs |
- |
|
|
Hora em que a requisição foi recebida (UTC) |
- |
|
|
AppId do chamador |
|
|
|
AppKey do chamador |
- |
|
|
Endereço IP do cliente |
|
|
|
Nome da API solicitada |
- |
|
|
Protocolo da requisição |
|
|
|
String UserAgent do cliente |
- |
Exemplos de expressões
Roteie requisições para APIs publicadas no estágio de teste:
$CaStage = 'TEST'
Corresponda a um usuário específico de um endereço IP específico:
$UserName = 'Admin' and $CaClientIp = '47.47.XX.XX'
Corresponda a vários AppIds via HTTPS:
$CaHttpScheme = 'HTTPS' and ($CaAppId = 1001 or $CaAppId = 1098 or $CaAppId = 2011)
Tipos de backend
A configuração de backend em uma regra de roteamento substitui o backend padrão da API vinculada. Para alterar apenas campos específicos sem trocar o tipo de backend, especifique somente os campos a serem substituídos. As configurações de backend devem ser consistentes com os arquivos Swagger importados para o API Gateway. Para mais informações, consulte Importar arquivos Swagger para criar APIs com extensões do API Gateway.
Para distribuir requisições por peso, especifique todos os parâmetros de backend. Para detalhes sobre a prioridade do cabeçalho Host, consulte Configurar o cabeçalho Host. O tempo limite mínimo configurável é de 300 ms. Valores abaixo desse limiar assumem o padrão de 300 ms.
Referência de parâmetros de backend
|
Tipo de backend |
Parâmetro |
Descrição |
|
HTTP |
|
URL do backend, ex.: |
|
|
Substituição do cabeçalho Host (maior prioridade) |
|
|
|
Caminho da requisição, ex.: |
|
|
|
Método HTTP, ex.: |
|
|
|
Tempo limite em milissegundos (mínimo de 300 ms) |
|
|
HTTP-VPC |
|
Nome da autorização de acesso à VPC |
|
|
Substituição do cabeçalho Host (maior prioridade) |
|
|
|
Protocolo para o backend VPC, ex.: |
|
|
|
Caminho da requisição |
|
|
|
Método HTTP |
|
|
|
Tempo limite em milissegundos (mínimo de 300 ms) |
|
|
FC |
|
Região do Function Compute, ex.: |
|
|
Tipo de gatilho: |
|
|
|
Nome do serviço FC (FCEvent) |
|
|
|
Nome da função FC (FCEvent) |
|
|
|
URL da função (HttpTrigger) |
|
|
|
ARN da função RAM para o API Gateway acessar o FC |
|
|
|
Método HTTP (apenas HttpTrigger) |
|
|
OSS |
|
Região do Object Storage Service (OSS), ex.: |
|
|
Nome do bucket OSS |
|
|
|
Chave do objeto, ex.: |
|
|
|
Tempo limite em milissegundos (mínimo de 300 ms) |
|
|
|
Operação OSS, ex.: |
|
|
MOCK |
|
Corpo da resposta simulada |
|
|
Código de status HTTP para a resposta simulada |
|
|
|
Array de cabeçalhos de resposta (cada um com |
Exemplos de configuração
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
Distribuição ponderada de tráfego
Atribua pesos às rotas para distribuir o tráfego proporcionalmente. Rotas com pesos maiores recebem mais requisições.
---
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"
Regras de distribuição de tráfego:
|
Condição |
Comportamento |
|
Uma rota corresponde |
Todas as requisições vão para o backend dessa rota |
|
Várias rotas correspondem |
As requisições são distribuídas proporcionalmente pelo peso |
|
Nenhuma rota corresponde |
As requisições vão para o backend padrão da API |
A distribuição baseada em peso exige a especificação de todos os parâmetros de backend em cada rota.
Hashing consistente
O hashing consistente distribui requisições com base em um fator de hash. Requisições com o mesmo fator de hash sempre chegam ao mesmo backend.
Fatores de hash suportados:
|
Fator de hash |
Descrição |
|
Endereço IP de source |
Requisições do mesmo IP de cliente vão para o mesmo backend |
|
Parâmetro de requisição |
Requisições com o mesmo valor de parâmetro vão para o mesmo backend |
Exemplo: hashing por IP de 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"
Neste exemplo, parameters mapeia clientIp para o parâmetro de sistema CaClientIp. O campo routeByHash seleciona clientIp como fator de hash. Requisições do mesmo IP de cliente são roteadas consistentemente para o mesmo backend entre as rotas correspondentes.
Cenários de roteamento
Roteamento por ID de aplicativo
Encaminhe chamadores VIP (AppId 10098 ou 10099) para um backend dedicado de virtual private cloud (VPC):
---
routes:
- name: Vip
condition: "$CaAppId = 10098 or $CaAppId = 10099"
backend:
type: "HTTP-VPC"
vpcAccessName: "slbAccessForVip"
Roteamento por ambiente
Envie todas as requisições de estágio de teste para um servidor de teste público:
---
routes:
- name: Vip
condition: "$CaStage = 'TEST'"
backend:
type: "HTTP"
address: "https://test-env.foo.com"
Implantação blue-green
Divida o tráfego em 5%/95% entre um servidor beta e um backend de produção 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"sempre corresponde.condition: "1 = 0"nunca corresponde. Useweightpara controlar a distribuição de tráfego entre rotas correspondentes.
Limitações
|
Restrição |
Limite |
Código de erro |
|
Tamanho dos metadados do plug-in |
16.384 bytes |
|
|
Rotas por plug-in |
160 |
|
|
Tamanho da expressão condicional |
512 bytes |
|
|
Intervalo mínimo de atualização |
45 segundos |
|