Como as solicitações são roteadas

Esta página descreve como as solicitações HTTP dos usuários chegam à versão apropriada de um serviço. As solicitações podem ser encaminhadas de duas maneiras:

  • As regras de roteamento padrão do App Engine se aplicam às solicitações com um URL que termina no nível do domínio.

  • Também é possível usar um arquivo de expedição que encaminha padrões de URL específicos de acordo com as regras que você estabelece.

Se você testar o aplicativo no servidor de desenvolvimento local, os recursos disponíveis de roteamento e expedição serão ligeiramente diferentes. Para criar programaticamente URLs que funcionem com servidores de produção e desenvolvimento, use o método ModulesService.getVersionHostname.

Consulte Roteamento no servidor de desenvolvimento para saber mais.

Solicitações e domínios

No App Engine, o nome de domínio da solicitação de entrada é usado para determinar se ela é destinada ao aplicativo. Uma solicitação com o nome de domínio http://[YOUR_PROJECT_ID].appspot.com é encaminhada ao aplicativo que tem o ID [YOUR_PROJECT_ID]. Todos os aplicativos recebem um nome de domínio appspot.com gratuitamente.

Os domínios appspot.com também são compatíveis com subdomínios no formato [SUBDOMAIN]-dot-[YOUR_PROJECT_ID].appspot.com, em que [SUBDOMAIN] pode ser qualquer string permitida em uma parte de um nome de domínio, exceto o caractere ".". As solicitações enviadas a qualquer subdomínio dessa maneira são encaminhadas ao aplicativo.

Configure um domínio de nível superior personalizado usando o G Suite e atribua subdomínios a vários aplicativos como o Gmail ou o Google Sites. Também é possível associar um aplicativo do App Engine a um subdomínio. Para ver mais informações sobre como associar um domínio personalizado ao aplicativo, consulte Como proteger domínios personalizados com SSL.

As solicitações para esses URLs são todas encaminhadas para a versão do aplicativo configurada para receber o tráfego. Cada versão do aplicativo também tem um URL próprio para que você possa implantar e testar uma versão nova antes de configurá-la para receber o tráfego. O URL específico da versão usa o ID de uma determinada versão, além do nome de domínio appspot.com. Por exemplo: http://[VERSION_ID]-dot-[YOUR_PROJECT_ID].appspot.com. Você também pode usar subdomínios com o URL específico da versão: http://[SUBDOMAIN]-dot-[VERSION_ID]-dot-[YOUR_PROJECT_ID].appspot.com. Consulte Roteamento por URL para ver mais informações e exemplos.

O nome de domínio usado para a solicitação está incluído nos dados da solicitação que são transmitidos ao aplicativo. Portanto, é possível usar os dados da solicitação para controlar como o aplicativo responde, de acordo com o nome de domínio na solicitação. Por exemplo, para redirecionar para um domínio oficial, codifique o aplicativo para verificar o cabeçalho Host da solicitação e responder de acordo com o nome de domínio.

Roteamento por URL

É possível direcionar uma solicitação HTTP com vários graus de especificidade. Nos exemplos a seguir, appspot.com pode ser substituído pelo domínio personalizado do aplicativo, se você tiver um. As substrings de URL [VERSION_ID], [SERVICE_ID] e [MY_PROJECT_ID] representam individualmente os IDs de recursos do seu aplicativo.

Dica: use as ferramentas a seguir para recuperar os IDs dos recursos do aplicativo:

Console

No Console do GCP, é possível ver as páginas Instâncias, Serviços e Versões.

gcloud

Execute o comando gcloud app instances list para gerar uma lista dos IDs de recursos em um projeto específico do GCP.

API

Para recuperar programaticamente os IDs de recursos, consulte os métodos list na API Admin.

Roteamento padrão

Os padrões de URL a seguir têm um comportamento de roteamento padrão. Observe que o roteamento padrão será modificado se houver um padrão correspondente definido por você no arquivo de expedição:

  • Envia a solicitação para uma instância disponível do serviço default:
    https://[MY_PROJECT_ID].appspot.com
    http://[MY_CUSTOM_DOMAIN]

    As solicitações são recebidas por qualquer versão configurada para o recebimento do tráfego no serviço default.

  • Envia uma solicitação para uma instância disponível de um serviço específico:
    https://[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[SERVICE_ID].[MY_CUSTOM_DOMAIN]

    As solicitações são recebidas por qualquer versão configurada para o recebimento do tráfego no serviço de destino. Se o serviço de destino não existir, a solicitação será encaminhada probabilisticamente.

  • Envia uma solicitação para uma instância disponível de uma versão específica no
    serviço default:
    https://[VERSION_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[VERSION_ID].[MY_CUSTOM_DOMAIN]

    Quando não há um serviço de destino, as solicitações são enviadas para o default.

Roteamento probabilístico

Quando uma solicitação corresponde à parte [YOUR_PROJECT_ID].appspot.com do nome do host, mas inclui um nome de serviço, versão ou instância que não existe, ela é encaminhada para o serviço default. O roteamento probabilístico não se aplica a domínios personalizados. As solicitações feitas para esse tipo de domínio retornarão um código de status HTTP 404 se o nome do host for inválido.

Roteamento direcionado

Os padrões de URL a seguir têm a garantia de que chegarão ao destino, se ele existir. Essas solicitações nunca são interceptadas e reencaminhadas pelos padrões definidos no arquivo de expedição:

  • Envia a solicitação para uma instância disponível de um serviço e versão específicos:
    https://[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[VERSION_ID].[SERVICE_ID].[MY_PROJECT_ID].[MY_CUSTOM_DOMAIN]
  • Se você usa serviços escalonados manualmente, será possível direcionar e enviar uma solicitação a uma instância ao incluir o ID dela. O ID da instância é um número inteiro no intervalo de 0 até o número total de instâncias em execução e pode ser especificado da seguinte maneira:

    Envia uma solicitação para um serviço e versão específicos em uma instância determinada:

    https://[INSTANCE_ID]-dot-[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[INSTANCE_ID].[VERSION_ID].[SERVICE_ID].[MY_CUSTOM_DOMAIN]

Serviço padrão

O serviço default é criado durante a implantação da versão inicial do aplicativo no App Engine. As solicitações que especificam o serviço como inexistente ou inválido são encaminhadas para o serviço default. Essas solicitações são processadas pelas versões configuradas para receber o tráfego no serviço default. Você pode ver quais versões estão configuradas para tráfego na página Versões do Console do GCP.

Restringir o acesso a um serviço

Todos os serviços são públicos por padrão. Se você quiser restringir o acesso a um serviço, adicione o elemento <role-name>admin</role-name> à restrição de segurança dele

Exemplo

Para entender os padrões de URL, imagine um projeto do GCP com o ID requestsProject, que inclui um aplicativo que executa dois serviços e versões. O serviço default do aplicativo de exemplo inclui a versão vFrontend. Já o segundo serviço (service2) inclui a versão vBackend.

Para fazer com que serviços e versões específicos sejam o destino das solicitações, use os padrões de URL a seguir:

  1. Para definir como destino a versão no serviço default por meio de HTTPS, use:

    https://vFrontend-dot-default-dot-requestsProject.appspot.com
    https://vFrontend-dot-requestsProject.appspot.com
    
  2. Para definir como destino a versão vBackend por meio de um domínio personalizado sem HTTPS, é possível usar:

    http://vBackend.service2.example.net
    http://vBackend.example.net
    

    requestsProject.appspot.com é mapeado para o domínio example.net.

Roteamento com um arquivo de expedição

Para URLs que usam os padrões descritos anteriormente, crie um arquivo de expedição para modificar as regras de roteamento do App Engine e definir suas próprias regras personalizadas. Com um arquivo de expedição, você pode enviar solicitações de entrada para um serviço específico com base no caminho ou nome do host no URL da solicitação.

Para ver detalhes sobre a criação de um arquivo de expedição, consulte a referência dispatch.yaml.

Criar um arquivo de expedição

O arquivo de expedição deve ser colocado no mesmo diretório usado para os outros arquivos de configuração, como app.yaml. É possível definir até 20 regras de roteamento no arquivo de expedição. Cada regra é composta dos elementos service e url.

Por exemplo, você pode criar um arquivo de expedição para encaminhar solicitações de dispositivos móveis como http://simple-sample.appspot.com/mobile/ para um front-end móvel e encaminhar solicitações de workers como http://simple-sample.appspot.com/work/ para um back-end estático:

dispatch:
  # Send all mobile traffic to the mobile frontend.
  - url: "*/mobile/*"
    service: mobile-frontend

  # Send all work to the one static backend.
  - url: "*/work/*"
    service: static-backend

Para ver detalhes sobre como definir o dispatch.yaml, consulte a documentação de referência do dispatch.yaml.

Como implantar o arquivo de expedição

O arquivo dispatch.yaml pode residir em qualquer lugar no diretório do código-fonte.

Para implantar o arquivo de configuração de expedição sem alterar a versão disponibilizada atualmente, use um dos seguintes comandos no diretório que contém o arquivo de expedição, dependendo do ambiente:

gcloud

gcloud app deploy dispatch.yaml

Maven

mvn appengine:deployDispatch dispatch.yaml

Gradle

gradle appengineDeployDispatch dispatch.yaml

Ambiente de desenvolvimento integrado

Se você usa IntelliJ ou Eclipse, selecione os arquivos de configuração individuais a serem implantados por meio do formulário de implantação.

Roteamento no servidor de desenvolvimento

Descobrir endereços de instâncias

O servidor de desenvolvimento local cria todas as instâncias na inicialização. Observe que, neste momento, as instâncias básicas de escalonamento não são compatíveis com o servidor de desenvolvimento local. Uma porta é atribuída a cada instância criada. As atribuições de portas aparecem no stream de mensagens de registro do servidor. Os clientes Web podem se comunicar com uma instância específica ao apontar a porta da instância. Apenas uma instância (e porta) é criada para serviços com escalonamento automático. É assim que aparece no registro do servidor. Observe que os serviços eram previamente chamados de módulos:

INFO: Module instance service-auto is running at http://localhost:37251/

Uma porta única é atribuída a cada instância de um serviço escalonado manualmente:

INFO: Module instance service-manual instance 0 is running at http://localhost:43190/
INFO: Module instance service-manual instance 1 is running at http://localhost:52642/

Além disso, cada serviço escalonado manualmente recebe uma porta adicional para que os clientes possam acessar o serviço sem especificar uma instância específica. As solicitações para essa porta são encaminhadas automaticamente para uma das instâncias configuradas:

INFO: Module instance service-manual is running at http://localhost:12361/

A tabela a seguir mostra como esses serviços podem ser chamados no servidor de desenvolvimento e no ambiente do App Engine:

Serviço Instância Endereço do servidor de desenvolvimento Endereço do App Engine
serviço automático (não utilizado) http://localhost:37251/ http://v1.service-auto.[PROJECT_ID].appspot.com/
serviço manual 0 http://localhost:43190/ http://0.v1.service-manual.[PROJECT_ID].appspot.com/
serviço manual 1 http://localhost:52642/ http://1.v1.service-manual.[PROJECT_ID].appspot.com/
serviço manual (não utilizado) http://localhost:12361/ http://v1.service-manual.[PROJECT_ID].appspot.com/

Se você estiver usando os plug-ins Maven ou Gradle, poderá atribuir o número de porta usado pelo servidor de desenvolvimento local. Para saber detalhes, consulte Apache Maven, Apache Maven (baseado no SDK do Cloud) ou Gradle.

Arquivos de expedição

Todos os arquivos de expedição são ignorados durante a execução do servidor de desenvolvimento local. A única maneira de apontar as instâncias é por meio das respectivas portas.
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Java 8