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 uso Premium 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 valor application/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 que id é 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:

  1. 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.

  2. 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.

  3. 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:

    • Métodos: Um ou mais métodos aceitos pelo serviço de back-end. Por exemplo, GET, PUT.
  4. 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.
    1. 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.
    2. 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.
  5. 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.
  6. 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.
  7. Informe os detalhes do back-end da seguinte forma:
    1. 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.
    2. 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:
    3. Selecione Definir para criar o back-end e a regra associada.
  8. (Opcional) Selecione Definir Backend novamente para definir back-ends adicionais e regras associadas.
  9. (Opcional) Selecione Outra Rota para inserir detalhes de rotas adicionais.
  10. Selecione Próximo para revisar os detalhes informados para a implantação de API.
  11. Selecione Criar ou Salvar Alterações para criar ou atualizar a implantação de API.
  12. (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:

  1. 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ção routes. Se quiser aplicar as políticas apenas a uma rota específica, coloque as políticas na seção routes. 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:

    • <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": {…}. Especifique ANY_OF se o valor da variável de contexto identificado por <context-table-key> deve corresponder exatamente ao valor especificado para <context-variable-value>. Especifique WILDCARD 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ê especificar ANY_OF e fará distinção entre maiúsculas e minúsculas se especificar WILDCARD.
    • <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 array values:[...], 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 especificado ANY_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 especificado WILDCARD. 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.
      Por exemplo, se você quiser que uma solicitação de um cliente de API que possa aceitar uma resposta xml (conforme indicado no cabeçalho Aceitar da solicitação) seja roteada para um back-end que retorne xml, você poderá especificar:
      • "selector": "request.headers[Accept]"
      • "type": "ANY_OF"
      • "values": ["application/xml"]
    • "isDefault": "<true|false>" é um valor booliano opcional (true ou false) 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ão false 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ão ORACLE_FUNCTIONS_BACKEND, HTTP_BACKEND e STOCK_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:

    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 consulta vehicle-type tiver o valor car, a solicitação será roteada para cars-api.example.com. Se o parâmetro de consulta vehicle-type tiver um valor truck ou minivan, 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 for car, nem truck nem minivan, a solicitação será roteada para cars-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"
                }
              }
            ]
          }
        }
      ]
    }
  2. Salve o arquivo JSON que contém a especificação de implantação de API.
  3. 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.

  4. (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 para http://cars-api.example.com.
  • Se a solicitação tiver sido enviada para minivans.examplecloud.com ou trucks.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 para http://cars-api.example.com
  • se a solicitação tiver sido enviada para minivans.example.com ou trucks.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 (como car.example.com ou sedan.example.com), a solicitação será roteada para http://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 ou hatchbacks.example.com, a solicitação será roteada para http://cars-api.example.com ou http://hatchbacks-api.example.com
  • se a solicitação tiver sido enviada para outro subdomínio de example.com (como suvs.example.com ou sedans.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 ou sedans.example.com são roteadas para http://cars-api.example.com, http://hatchbacks-api.example.com, http://suvs-api.example.com ou http://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 ou tractor.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 para http://buses-api.example.com conforme esperado. No entanto, essa configuração também roteia solicitações enviadas originalmente para bus.example.com e s.example.com para http://bus-api.example.com e http://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 OCID ocid1.usageplan.oc1..aaaaaaaaab______gap. Quando esse OCID é o valor da variável de contexto request.usage_plan[id], a solicitação é roteada para http://dev.example.com/. O plano de uso Free Tier também será usado como padrão se a solicitação não incluir um token do cliente.
  • Premium Tier, que tem o OCID ocid1.usageplan.oc1..aaaaaaaaay______lcf. Quando esse OCID é o valor da variável de contexto request.usage_plan[id], a solicitação é roteada para http://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 formato application/json, a solicitação será roteada para http://api.example.com
  • se o cabeçalho Accept solicitar uma resposta no formato application/xml, a solicitação será roteada para http://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 como tenant-cars, a solicitação será roteada para http://cars-api.example.com
  • se a variável de contexto request.auth[tenant] for definida como tenant-trucks, a solicitação será roteada para http://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 valor car, a solicitação será roteada para cars-api.example.com.
  • Se o parâmetro de consulta vehicle-type tiver um valor truck ou minivan, 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 for car, nem truck nem minivan, a solicitação será roteada para cars-api.example.com por padrão: