Seleção Dinâmica de Back-Ends do API Gateway com Base em Elementos de Solicitação
Descubra como rotear solicitações enviadas ao mesmo gateway de API para back-ends diferentes com base em elementos da solicitação com o Gateway de API.
Um requisito comum é rotear solicitações enviadas ao mesmo gateway de API para back-ends diferentes com base em elementos na solicitação. Por exemplo, para rotear solicitações para back-ends diferentes com base em:
- O host e/ou domínio e/ou subdomínio para o qual uma solicitação foi enviada. Por exemplo, para rotear solicitações de entrada de cars.example.com e trucks.example.com que foram enviadas ao mesmo gateway de API para dois backends completamente diferentes.
- O plano de uso no qual o cliente da API que está enviando uma solicitação está inscrito. Por exemplo, para rotear solicitações de entrada para um host padrão para clientes de API inscritos em um plano de uso
Free Tier
ou para um host de alto desempenho para clientes de API inscritos no plano de usoPremium Tier
. - Cabeçalhos e valores de cabeçalho em uma solicitação. Por exemplo, para rotear uma solicitação que inclua um cabeçalho
Accept
com o valorapplication/xml
para um back-end apropriado que retorne uma resposta desse tipo de conteúdo.
A seleção dinâmica de um back-end permite apresentar uma única fachada aos consumidores de API e protegê-los da complexidade de vários sistemas de back-end.
Você pode rotear solicitações dinamicamente para:
- back-ends de HTTP
- back-ends de função sem servidor
- back-ends de resposta do estoque
Ao definir vários back-ends para a mesma implantação de API, você cria regras para permitir que o gateway de API selecione dinamicamente o back-end para o qual rotear uma solicitação, com base em um elemento na solicitação original.
Para permitir que o gateway de API selecione dinamicamente o back-end correto, use as seguintes variáveis de contexto para capturar elementos da solicitação:
request.auth[<key>]
em que<key>
é o nome de uma reivindicação retornada por uma função de autorizador ou contida em um token JWT.request.headers[<key>]
em que<key>
é o nome de um cabeçalho incluído na solicitação à API.request.host
como o nome do host para o qual a solicitação original foi enviada.request.path[<key>]
em que<key>
é o nome de um parâmetro de caminho definido na especificação de implantação de API.request.query[<key>]
em que<key>
é o nome de um parâmetro de consulta incluído na solicitação à API.request.subdomain[<key>]
em que<key>
é a parte final do nome do host a ser ignorada ao capturar a parte principal do nome do host para a qual a solicitação original foi enviada.request.usage_plan[id]
em queid
é o OCID de um plano de uso no qual o cliente da API está inscrito.
Observe que, se uma variável de contexto tiver vários valores, somente o primeiro valor será usado ao selecionar o back-end. Para obter mais informações sobre variáveis de contexto, consulte Adicionando Variáveis de Contexto a Políticas e Definições de Back-End de HTTP.
Você define o critério para selecionar dinamicamente back-ends em uma especificação de implantação de API:
- usando a Console
- editando um arquivo JSON
Observações sobre a correspondência da regra de back-end
Ao criar as regras para determinar qual back-end usar, você pode especificar o quanto o valor da variável de contexto deve corresponder a um determinado valor para que a solicitação seja roteada para um back-end específico. Você pode exigir uma correspondência exata ou especificar um valor que comece com um curinga ou termine com ele. O gateway de API avalia as regras na ordem especificada (regras de correspondência exata primeiro, seguidas de regras curinga) e usa a primeira regra de correspondência. Você também pode especificar uma regra padrão a ser usada se o valor da variável de contexto não corresponder a nenhuma regra de back-end. Se nenhuma regra for especificada como padrão e o valor da variável de contexto em uma solicitação de entrada não corresponder a nenhuma regra de back-end, a solicitação retornará um erro. A ordem de precedência para determinar qual regra de back-end (e, portanto, qual back-end) usar pode ser resumida como:
- Se o valor da variável de contexto corresponder exatamente ao valor de uma regra, use essa regra.
- Caso contrário, se o valor da variável de contexto corresponder ao valor de uma regra que começa ou termina com um curinga, use a primeira regra que contém um curinga correspondente.
- Caso contrário, se uma regra for especificada como a regra padrão, use essa regra.
- Caso contrário, retorne um erro.
Usando a Console para Adicionar Seleção de Back-End Dinâmico a uma Especificação de Implantação de API
Para adicionar a seleção de back-end dinâmico a uma especificação de implantação de API usando a Console:
-
Crie ou atualize uma implantação de API usando a Console. Selecione a opção Totalmente Nova e insira os detalhes na página Informações Básicas.
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API e Atualizando um Gateway de API.
- Na página Autenticação, especifique como autenticar solicitações feitas para rotas na implantação de API.
Para obter mais informações, consulte Adicionando Autenticação e Autorização a Implantações de API.
-
Na página Rotas, crie uma nova rota e especifique:
-
Caminho: Um caminho para chamadas de API usando os métodos listados para o serviço de back-end. Observe que o caminho da rota que você especificar:
- é relativo ao prefixo do caminho de implantação (consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API)
- deve ser precedido por uma barra ( / ) e pode ser apenas uma barra
- pode conter várias barras (desde que elas não sejam adjacentes) e pode terminar com uma barra
- pode incluir caracteres alfanuméricos maiúsculos e minúsculos
- pode incluir os caracteres especiais
$ - _ . + ! * ' ( ) , % ; : @ & =
- pode incluir parâmetros e curingas (consulte Adicionando Parâmetros de Caminho e Curingas a Caminhos de Rota)
- Métodos: Um ou mais métodos aceitos pelo serviço de back-end. Por exemplo,
GET, PUT
.
-
- Selecione Adicionar vários backends para especificar que você deseja que as solicitações sejam roteadas para diferentes backends, de acordo com a variável de contexto e as regras informadas.
- Na lista Seletor, selecione a tabela de contexto (que contém a variável de contexto) a ser usada ao determinar o back-end para o qual a solicitação será enviada, da seguinte forma:
- Autenticação: Use o valor de uma reivindicação retornada por uma função de autorizador ou contida em um JWT (e salva na tabela de contexto
request.auth
) para determinar o back-end. - Cabeçalhos: Use o valor de um cabeçalho da solicitação original (e salvo na tabela de contexto
request.headers
) para determinar o back-end. - Host: Use o nome do host para o qual a solicitação original foi enviada (extraído do campo do host do cabeçalho do Host na solicitação e salvo na tabela de contexto
request.host
) para determinar o back-end. - Caminho: Use um parâmetro de caminho da solicitação original (e salvo na tabela de contexto
request.path
) para determinar o back-end. - Parâmetros de consulta: Use o valor de um parâmetro de consulta da solicitação original (e salvo na tabela de contexto
request.query
) para determinar o back-end. - Subdomínio: Use a parte inicial do nome do host para a qual a solicitação original foi enviada (apenas essa parte do nome do host não especificada como a chave e salva na tabela de contexto
request.subdomain
) para determinar o back-end. Observe que a chave é a parte final do nome do host a ser usado. - OCID do plano de uso: Use o OCID de um plano de uso no qual o cliente de API está inscrito (identificado de um token de cliente na solicitação original e salvo na tabela de contexto
request.usage_plan
) para determinar o back-end.
- Autenticação: Use o valor de uma reivindicação retornada por uma função de autorizador ou contida em um JWT (e salva na tabela de contexto
- Dependendo da tabela de contexto selecionada, insira o nome da chave a ser usada ao determinar o back-end para o qual a solicitação será enviada.
- Na lista Seletor, selecione a tabela de contexto (que contém a variável de contexto) a ser usada ao determinar o back-end para o qual a solicitação será enviada, da seguinte forma:
- Selecione Definir Backend para informar uma regra para a variável de contexto que, se atendida, encaminhe a solicitação para o back-end definido.
- Informe detalhes para a regra da seguinte forma:
- Nome: especifique um nome para a regra. Use o nome informado para identificar o back-end ao fazer referência a logs e métricas.
- Tipo de correspondência: Especifique o quanto o valor da variável de contexto deve corresponder a um valor informado para que a solicitação seja roteada para esse backend. Selecione Qualquer um de se quiser que a variável de contexto corresponda exatamente ao valor no campo Valores. Selecione Curinga se a variável de contexto tiver que corresponder a um valor no campo Expressão que contenha curingas. A correspondência de valor não faz distinção entre maiúsculas e minúsculas se você selecionar Qualquer um de e faz distinção entre maiúsculas e minúsculas se selecionar Curinga.
- Valores: (Exibido se você tiver selecionado Qualquer um de no campo Tipo de correspondência.) Especifique um valor (ou vários valores em uma lista separada por vírgulas) que a variável de contexto deve corresponder exatamente. Observe que a correspondência não fará distinção entre maiúsculas e minúsculas se você tiver selecionado Qualquer um de. Observe também que os valores devem ser exclusivos em uma única regra de back-end e em todas as regras de back-end definidas para a implantação de API.
- Expressão: (Exibido se você selecionou Curinga no campo Tipo de correspondência) Especifique um valor começando com, ou terminando com, um curinga que a variável de contexto deve corresponder. Use o curinga
*
(asterisco) para indicar zero ou mais caracteres e/ou o curinga+
(sinal de mais) para indicar um ou mais caracteres. Observe que a correspondência fará distinção entre maiúsculas e minúsculas se você tiver selecionado Curinga. Observe que você não pode incluir mais de um curinga em um valor e não pode incluir um curinga no meio de um valor. Observe também que a configuração de curinga incorreta pode fazer com que as solicitações sejam roteadas para back-ends não intencionais. - Tornar padrão: Especifique se o back-end definido para esta regra será usado se nenhuma regra de back-end for correspondente.
- Informe os detalhes do back-end da seguinte forma:
- No campo Tipo de backend, selecione HTTP/HTTPS, Oracle Functions, Resposta de estoque ou Logout como o back-end para o qual rotear a solicitação se a regra informada for atendida.
- Informe os detalhes do back-end selecionado. Os detalhes a serem inseridos dependerão do tipo de back-end selecionado e estão totalmente descritos em:
- Selecione Definir para criar o back-end e a regra associada.
- (Opcional) Selecione Definir Backend novamente para definir back-ends adicionais e regras associadas.
- (Opcional) Selecione Outra Rota para inserir detalhes de rotas adicionais.
- Selecione Próximo para revisar os detalhes informados para a implantação de API.
- Selecione Criar ou Salvar Alterações para criar ou atualizar a implantação de API.
- (Opcional) Confirme se a API foi implantada com êxito, chamando-a (consulte Chamando uma API Implantada em um Gateway de API).
Editando um Arquivo JSON para Adicionar Seleção de Back-End Dinâmico a uma Especificação de Implantação de API
Para adicionar a seleção de backend dinâmico a uma especificação de implantação de API em um arquivo JSON:
-
Usando seu editor de JSON preferido, crie uma nova especificação de implantação de API (consulte Criando uma Especificação de Implantação de API) no formato:
{ "requestPolicies": {}, "routes": [ { "path": "<api-route-path>", "methods": ["<method-list>"], "backend": { "type": "DYNAMIC_ROUTING_BACKEND", "selectionSource": { "type": "SINGLE", "selector": "<context-table-key>" }, "routingBackends": [ { "key": { "type": "<ANY_OF|WILDCARD>", "values": [ "<context-variable-value>" ], "isDefault": "<true|false>", "name": "<rule-name>" }, "backend": { "type": "<backend-type>", "<backend-target>": "<identifier>" } } ] } } ] }
em que:
"requestPolicies"
especifica políticas opcionais para controlar o comportamento de uma implantação de API. Se você quiser aplicar políticas a todas as rotas em uma especificação de implantação de API, coloque as políticas fora da seçãoroutes
. Se quiser aplicar as políticas apenas a uma rota específica, coloque as políticas na seçãoroutes
. Consulte Adicionando Políticas de Solicitação e Políticas de Resposta a Especificações de Implantação de API.-
<api-route-path>
especifica um caminho para chamadas de API usando os métodos listados para o serviço de back-end. Observe que o caminho da rota que você especificar:- é relativo ao prefixo do caminho de implantação (consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API)
- deve ser precedido por uma barra ( / ) e pode ser apenas uma barra
- pode conter várias barras (desde que elas não sejam adjacentes) e pode terminar com uma barra
- pode incluir caracteres alfanuméricos maiúsculos e minúsculos
- pode incluir os caracteres especiais
$ - _ . + ! * ' ( ) , % ; : @ & =
- pode incluir parâmetros e curingas (consulte Adicionando Parâmetros de Caminho e Curingas a Caminhos de Rota)
<method-list>
especifica um ou mais métodos aceitos pelo serviço de back-end, separados por vírgulas. Por exemplo,GET, PUT
."type": "DYNAMIC_ROUTING_BACKEND"
especifica que você deseja selecionar dinamicamente o back-end com base nos elementos da solicitação."type": "SINGLE"
especifica que você deseja usar uma única variável de contexto para selecionar dinamicamente o back-end."selector": "<context-table-key>"
especifica a tabela de contexto (e a chave, se apropriado) a partir da qual obter o valor da variável de contexto que determina o back-end para o qual enviar a solicitação, da seguinte forma:request.auth[<key>]
Use o valor de uma reivindicação retornada por uma função de autorizador ou contida em um JWT (JSON Web Token) para determinar o back-end.<key>
é o nome da reivindicação. Por exemplo,request.auth[tenant]
request.headers[<key>]
Use o valor de um cabeçalho da solicitação original para determinar o back-end.<key>
é o nome do cabeçalho. Por exemplo,request.headers[Accept]
request.host
Use o nome do host para o qual a solicitação original foi enviada (extraída do campo do host do cabeçalho do Host na solicitação) para determinar o back-end.request.path[<key>]
Use um parâmetro de caminho da solicitação original para determinar o back-end.<key>
é o nome do parâmetro de caminho. Por exemplo,request.path[region]
request.query[<key>]
Use o valor de um parâmetro de consulta da solicitação original para determinar o back-end.<key>
é o nome do parâmetro de consulta. Por exemplo,request.query[state]
request.subdomain[<key>]
Use a parte inicial do nome do host para a qual a solicitação original foi enviada (apenas essa parte do nome do host não especificada como a chave) para determinar o back-end. Observe que<key>
é a parte final do nome do host a não ser usada. Por exemplo,request.subdomain[example.com]
request.usage_plan[id]
Use o OCID de um plano de uso no qual o cliente da API está inscrito (identificado com base em um token do cliente na solicitação original) para determinar o back-end.
"key": {...}
especifica a regra que deve ser atendida para enviar uma solicitação ao back-end especificado por"backend": {…}
."type": "<ANY_OF|WILDCARD>"
especifica o quanto o valor da variável de contexto identificada por<context-table-key>
deve corresponder ao valor informado para<context-variable-value>
para que a solicitação seja enviada ao back-end especificado por"backend": {…}
. EspecifiqueANY_OF
se o valor da variável de contexto identificado por<context-table-key>
deve corresponder exatamente ao valor especificado para<context-variable-value>
. EspecifiqueWILDCARD
se o valor da variável de contexto identificado por<context-table-key>
deve corresponder a um valor contendo curingas que você especifica para<context-variable-value>
. A correspondência de valor não fará distinção entre maiúsculas e minúsculas se você especificarANY_OF
e fará distinção entre maiúsculas e minúsculas se especificarWILDCARD
.<context-variable-value>
é um valor que possivelmente corresponde ao valor da variável de contexto identificada por<context-table-key>
. Você pode incluir várias entradas"<context-variable-value>"
no arrayvalues:[...]
, separadas por vírgulas. A solicitação será enviada para o back-end especificado por"backend": {…}
se os valores corresponderem, da seguinte forma:- Se você especificou
"type": "ANY_OF"
, os valores deverão corresponder exatamente. Observe que os valores devem ser exclusivos em uma única regra de back-end e em todas as regras de back-end definidas para uma implantação de API. A correspondência de valor não fará distinção entre maiúsculas e minúsculas se você tiver especificadoANY_OF
. - Se você tiver especificado
"type": "WILDCARD"
, poderá especificar um valor para<context-variable-value>
que comece com um curinga ou termine com ele. Use o curinga*
(asterisco) para indicar zero ou mais caracteres e/ou o curinga+
(sinal de mais) para indicar um ou mais caracteres. Observe que você não pode incluir mais de um curinga em um valor e não pode incluir um curinga no meio de um valor. A correspondência de valor fará distinção entre maiúsculas e minúsculas se você tiver especificadoWILDCARD
. Observe também que a configuração de curinga incorreta pode fazer com que as solicitações sejam roteadas para back-ends não intencionais.
"selector": "request.headers[Accept]"
"type": "ANY_OF"
"values": ["application/xml"]
- Se você especificou
"isDefault": "<true|false>"
é um valor booliano opcional (true
oufalse
) indicando se deve usar o back-end para essa regra se nenhuma regra de back-end corresponder. Se não for especificado, o valor padrãofalse
será usado."name": "<rule-name>"
especifica um nome para a regra. Use esse nome para identificar o back-end ao fazer referência a logs e métricas.<backend-type>
especifica o tipo do serviço de back-end. Os valores válidos sãoORACLE_FUNCTIONS_BACKEND
,HTTP_BACKEND
eSTOCK_RESPONSE_BACKEND
.<backend-target>
e<identifier>
especificam o serviço de back-end. Os valores válidos para<backend-target>
e<identifier>
dependem do valor de<backend-type>
, como se segue:- Se você definir
<backend-type>
comoORACLE_FUNCTIONS_BACKEND
, substitua<backend-target>
porfunctionId
e substitua<identifier>
pelo OCID da função. Por exemplo,"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab5b..."
. Consulte Adicionando uma Função no Serviço OCI Functions como um Backend do Serviço API Gateway - Se você definir
<backend-type>
comoHTTP_BACKEND
, substitua<backend-target>
porurl
e substitua<identifier>
pelo URL do serviço de back-end. Por exemplo,"url": "https://api.weather.gov"
. Consulte Adicionando um URL HTTP ou HTTPS como um Back-End do Serviço API Gateway. - Se você definir
<backend-type>
comoSTOCK_RESPONSE_BACKEND
, substitua<backend-target>
e<identifier>
por pares chave-valor apropriados. Consulte Adicionando Respostas Padrão como um Back-End do Serviço API Gateway
- Se você definir
Por exemplo, a especificação de implantação de API básica a seguir inclui a seleção de back-end dinâmico que roteia solicitações com base no valor do parâmetro de consulta
vehicle-type
informado na solicitação. Se o parâmetro de consultavehicle-type
tiver o valorcar
, a solicitação será roteada paracars-api.example.com
. Se o parâmetro de consultavehicle-type
tiver um valortruck
ouminivan
, a solicitação será roteada para uma função sem servidor no OCI Functions para processamento. Se o valor do parâmetro de consultavehicle-type
não forcar
, nemtruck
nemminivan
, a solicitação será roteada paracars-api.example.com
por padrão:{ "routes": [ { "path": "/users/{path1*}", "methods": [ "GET", "POST", "PUT", "DELETE" ], "backend": { "type": "DYNAMIC_ROUTING_BACKEND", "selectionSource": { "type": "SINGLE", "selector": "request.query[vehicle-type]" }, "routingBackends": [ { "key": { "type": "ANY_OF", "values": [ "cars" ], "isDefault": "true", "name": "car-rule" }, "backend": { "type": "HTTP_BACKEND", "url": "https://cars-api.example.com" } }, { "key": { "type": "ANY_OF", "values": [ "minivan", "truck" ], "name": "truck-minivan-rule" }, "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] } } ] }
- Salve o arquivo JSON que contém a especificação de implantação de API.
-
Use a especificação de implantação de API ao criar ou atualizar uma implantação de API das seguintes formas:
- especificando o arquivo JSON na Console quando você selecionar a opção Carregar uma API existente
- especificando o arquivo JSON em uma solicitação à API REST do serviço API Gateway
Para obter mais informações, consulte Implantando uma API em um Gateway de API por meio da Criação de uma Implantação de API.
-
(Opcional) Confirme se a API foi implantada chamando-a (consulte Chamando uma API Implantada em um Gateway de API).
Exemplos de Seleção Dinâmica de Back-Ends do Serviço API Gateway
Os exemplos nesta seção pressupõem a seguinte definição de implantação de API e a especificação de implantação de API incompleta em um arquivo JSON:
{
"displayName": "Marketing Deployment",
"gatewayId": "ocid1.apigateway.oc1..aaaaaaaab______hga",
"compartmentId": "ocid1.compartment.oc1..aaaaaaaa7______ysq",
"pathPrefix": "/marketing",
"specification": {
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
.
.
.
}
}
]
},
"freeformTags": {},
"definedTags": {}
}
Observe que os exemplos também se aplicam quando você está definindo uma especificação de implantação de API usando caixas de diálogo na Console.
Exemplo 1: Selecionar back-end por Host
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base no host para o qual a solicitação original foi enviada (extraída do campo do host do cabeçalho Host na solicitação). Esse design permite definir um gateway de API que suporte tenants diferentes.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.host"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars.example.com"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivans.examplecloud.com",
"trucks.example.com"
],
"name": "truck-minivan-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do host para o qual a solicitação original foi enviada (extraída do campo do host do cabeçalho Host na solicitação), da seguinte forma:
- Se a solicitação tiver sido enviada para
cars.example.com
, a solicitação será roteada parahttp://cars-api.example.com
. - Se a solicitação tiver sido enviada para
minivans.examplecloud.com
outrucks.example.com
, ela será roteada para um back-end de função sem servidor no OCI Functions. - Se a solicitação tiver sido enviada para outro host, a solicitação será roteada para
http://cars-api.example.com
por padrão.
Exemplo 2: Selecionar back-end por Subdomínio de Host
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um subdomínio na string de host para a qual a solicitação original foi enviada. A string do host é extraída do cabeçalho do Host na solicitação e mascarada por uma string especificada, deixando o subdomínio usado para rotear a solicitação. Esse design permite definir um gateway de API que suporte tenants diferentes.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivans",
"trucks"
],
"name": "truck-minivan-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do subdomínio do host para o qual a solicitação original foi enviada, da seguinte forma:
- se a solicitação tiver sido enviada para
cars.example.com
, a solicitação será roteada parahttp://cars-api.example.com
- se a solicitação tiver sido enviada para
minivans.example.com
outrucks.example.com
, a solicitação será roteada para um back-end de função sem servidor no OCI Functions - se a solicitação tiver sido enviada para outro subdomínio de
example.com
(comocar.example.com
ousedan.example.com
), a solicitação será roteada parahttp://cars-api.example.com
por padrão
Exemplo 3a: Selecione back-end por Subdomínio de Host (modificando o nome do host no URL de back-end e usando um tipo de correspondência ANY_OF)
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um subdomínio na string de host para a qual a solicitação original foi enviada. A string do host é extraída do cabeçalho Host na solicitação e mascarada por uma string especificada, deixando o subdomínio usado para rotear a solicitação. Para validação adicional, você pode incluir a máscara de subdomínio como uma variável de contexto no url de back-end para garantir que as solicitações sejam roteadas apenas para back-ends que você pretende expor. Se você especificar ANY_OF
como o tipo de correspondência, o valor da variável de contexto não poderá incluir curingas e deverá corresponder exatamente a um dos valores routes.routingBackends.key
para que a solicitação seja enviada ao back-end.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars",
"hatchbacks"
],
"name": "car-hatchback-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://${request.subdomain[example.com]}-api.example.com"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do subdomínio do host para o qual a solicitação original foi enviada, da seguinte forma:
- se a solicitação tiver sido enviada para
cars.example.com
ouhatchbacks.example.com
, a solicitação será roteada parahttp://cars-api.example.com
ouhttp://hatchbacks-api.example.com
- se a solicitação tiver sido enviada para outro subdomínio de
example.com
(comosuvs.example.com
ousedans.example.com
), a solicitação falhará.
Se você estiver considerando modificar o nome do host no URL de back-end incluindo uma variável de contexto, conforme mostrado neste exemplo, observe o seguinte:
- Você só pode modificar o url de back-end usando a variável de contexto especificada para
selector
. - Para impor a lista de back-ends permitidos, não defina
"isDefault: "true"
para nenhuma regra.
Exemplo 3b: Selecione back-end por Subdomínio de Host (modificando o nome do host no URL de back-end e usando um tipo de correspondência de WILDCARD)
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um subdomínio na string de host para a qual a solicitação original foi enviada. A string do host é extraída do cabeçalho Host na solicitação e mascarada por uma string especificada, deixando o subdomínio usado para rotear a solicitação. Para validação adicional, você pode incluir a máscara de subdomínio como uma variável de contexto no url de back-end para garantir que as solicitações sejam roteadas apenas para back-ends que você pretende expor. Se você especificar WILDCARD
como o tipo de correspondência, o valor da variável de contexto poderá incluir curingas e deverá corresponder a um dos valores routes.routingBackends.key
para que a solicitação seja enviada ao back-end.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "WILDCARD",
"values": [
"*s"
],
"name": "domestic-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://${request.subdomain[example.com]}-api.example.com"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende de se o subdomínio do host ao qual a solicitação original foi enviada corresponde ao valor routes.routingBackends.key
, incluindo o curinga. Nesse caso, se a solicitação original foi enviada para um subdomínio host que termina na letra 's', da seguinte forma:
- Se a solicitação foi enviada para um subdomínio que termina na letra 's', a solicitação é encaminhada adequadamente. Por exemplo, as solicitações enviadas para
cars.example.com
,hatchbacks.example.com
,suvs.example.com
ousedans.example.com
são roteadas parahttp://cars-api.example.com
,http://hatchbacks-api.example.com
,http://suvs-api.example.com
ouhttp://sedans-api.example.com
, respectivamente. - Se a solicitação foi enviada para um subdomínio que não termina na letra 's', a solicitação falha. Por exemplo, as solicitações enviadas para
truck.example.com
outractor.example.com
falham.
Se você estiver considerando modificar o nome do host no URL de back-end incluindo uma variável de contexto, conforme mostrado neste exemplo, observe o seguinte:
- Você só pode modificar o url de back-end usando a variável de contexto especificada para
selector
. - Ao usar curingas, configure o curinga com cuidado. A configuração incorreta do curinga pode fazer com que as solicitações sejam roteadas para back-ends não intencionais. Por exemplo, no exemplo, as solicitações enviadas para
buses.example.com
são roteadas corretamente parahttp://buses-api.example.com
conforme esperado. No entanto, essa configuração também roteia solicitações enviadas originalmente parabus.example.com
es.example.com
parahttp://bus-api.example.com
ehttp://s-api.example.com
, respectivamente, nenhuma das quais foi planejada.
Exemplo 4: Selecionar back-end por Plano de Uso
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base no OCID de um plano de uso no qual o cliente de API está inscrito (identificado com base em um token de cliente na solicitação original). O OCID do plano de uso é armazenado na variável de contexto request.usage_plan[id]
.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.usage_plan[id]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"ocid1.usageplan.oc1..aaaaaaaaab______gap"
],
"name": "free-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://dev.example.com/"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"ocid1.usageplan.oc1..aaaaaaaaay______lcf"
],
"name": "premium-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://api.example.com"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do plano de uso no qual o cliente de API está inscrito. Dois planos de uso foram definidos da seguinte forma:
Free Tier
, que tem o OCIDocid1.usageplan.oc1..aaaaaaaaab______gap
. Quando esse OCID é o valor da variável de contextorequest.usage_plan[id]
, a solicitação é roteada parahttp://dev.example.com/
. O plano de usoFree Tier
também será usado como padrão se a solicitação não incluir um token do cliente.Premium Tier
, que tem o OCIDocid1.usageplan.oc1..aaaaaaaaay______lcf
. Quando esse OCID é o valor da variável de contextorequest.usage_plan[id]
, a solicitação é roteada parahttp://api.example.com
Exemplo 5: Selecionar back-end por Parâmetro de Cabeçalho
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um parâmetro passado no cabeçalho da solicitação original.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.headers[Accept]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"application/json"
],
"name": "json-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"application/xml"
],
"name": "xml-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://xml.example.com"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do valor do cabeçalho Accept
na solicitação original, da seguinte forma:
- se o cabeçalho
Accept
solicitar uma resposta no formatoapplication/json
, a solicitação será roteada parahttp://api.example.com
- se o cabeçalho
Accept
solicitar uma resposta no formatoapplication/xml
, a solicitação será roteada parahttp://xml.example.com
Exemplo 6: Selecionar back-end por Parâmetro de Autenticação
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um parâmetro de autenticação (também conhecido como 'claim') retornado por uma função de autorizador ou contido em um JWT (JSON Web Token).
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.auth[tenant]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"tenant-cars"
],
"name": "cars-tenant-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"tenant-trucks"
],
"name": "trucks-tenant-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://trucks-api.example.com"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do valor da reivindicação tenant
retornada por uma função de autorizador, da seguinte forma:
- se a variável de contexto
request.auth[tenant]
for definida comotenant-cars
, a solicitação será roteada parahttp://cars-api.example.com
- se a variável de contexto
request.auth[tenant]
for definida comotenant-trucks
, a solicitação será roteada parahttp://trucks-api.example.com
Exemplo 7: Selecionar back-end por Parâmetro de Consulta
Você pode configurar uma implantação de API para selecionar dinamicamente um back-end com base em um parâmetro de consulta transmitido pela solicitação original.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.query[vehicle-type]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"car"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivan",
"truck"
],
"name": "truck-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Neste exemplo, a forma como o gateway de API resolve uma solicitação para https://<gateway-hostname>/marketing/sales
depende do valor do parâmetro de consulta vehicle-type
informado pela solicitação original, da seguinte forma:
- Se o parâmetro de consulta
vehicle-type
tiver o valorcar
, a solicitação será roteada paracars-api.example.com
. - Se o parâmetro de consulta
vehicle-type
tiver um valortruck
ouminivan
, a solicitação será roteada para uma função sem servidor no OCI Functions para processamento. - Se o valor do parâmetro de consulta
vehicle-type
não forcar
, nemtruck
nemminivan
, a solicitação será roteada paracars-api.example.com
por padrão: