Google Cloud Os balanceadores de carga de aplicações e a malha de serviços na nuvem usam um Google Cloud recurso de configuração denominado mapa de URLs para encaminhar pedidos HTTP(S) para serviços de back-end ou contentores de back-end.
Por exemplo, com um balanceador de carga da aplicação externo, pode usar um único mapa de URLs para encaminhar pedidos para diferentes destinos com base nas regras configuradas no mapa de URLs:
- Os pedidos de
https://example.com/videovão para um serviço de back-end. - Os pedidos de
https://example.com/audiosão encaminhados para um serviço de back-end diferente.
- Os pedidos para
https://example.com/imagessão encaminhados para um contentor de back-end do Cloud Storage.
- Os pedidos de qualquer outra combinação de anfitrião e caminho são encaminhados para um serviço de back-end predefinido.
Os mapas de URLs são usados com os seguintes Google Cloud produtos:
- Balanceador de carga de aplicações externo (modos global, regional e clássico)
- Balanceador de carga de aplicações interno (modos regional e entre regiões)
- Cloud Service Mesh, quando o Cloud Service Mesh é implementado com as APIs de balanceamento de carga
Existem dois tipos de recursos de mapa de URLs disponíveis: global e regional.
Os
urlMapsglobais são usados por balanceadores de carga de aplicações externos globais, balanceadores de carga de aplicações clássicos, balanceadores de carga de aplicações internos entre regiões e a malha de serviços do Google Cloud.Os
regionUrlMapssão usados por balanceadores de carga de aplicações externos regionais, balanceadores de carga de aplicações internos regionais e o Cloud Service Mesh.
O tipo de recurso que usa depende do esquema de balanceamento de carga do produto.
| Produto | Esquema de balanceamento de carga | Tipo de recurso do mapa de URL | Destinos suportados |
|---|---|---|---|
| Balanceador de carga de aplicações externo global | EXTERNAL_MANAGED |
Global | Serviços de back-end, contentores de back-end |
| Balanceador de carga de aplicações clássico | EXTERNAL |
Global | Serviços de back-end, contentores de back-end |
| Balanceador de carga de aplicações externo regional | EXTERNAL_MANAGED |
Regional | Serviços de back-end |
| Balanceador de carga de aplicações interno entre regiões | INTERNAL_MANAGED |
Global | Serviços de back-end |
| Balanceador de carga de aplicações interno regional | INTERNAL_MANAGED |
Regional | Serviços de back-end |
| Cloud Service Mesh | INTERNAL_SELF_MANAGED |
Global | Serviços de back-end |
| Cloud Service Mesh | INTERNAL_SELF_MANAGED |
Regional | Serviços de back-end |
Nem todas as funcionalidades do mapa de URLs estão disponíveis para todos os produtos. Os mapas de URLs usados com balanceadores de carga de aplicações externos globais, balanceadores de carga de aplicações externos regionais, balanceadores de carga de aplicações internos e a malha de serviços da nuvem também suportam várias funcionalidades avançadas de gestão de tráfego. Para mais informações acerca destas diferenças, consulte o artigo Comparação de funcionalidades do equilibrador de carga: encaminhamento e gestão de tráfego. Além disso, os mapas de URLs regionais podem ser um recurso designado como um serviço nas aplicações do App Hub.
Como funcionam os mapas de URLs
Quando um pedido chega ao balanceador de carga, este encaminha o pedido para um serviço de back-end ou um contentor de back-end específico com base nas regras definidas no mapa de URLs.
Um serviço de back-end representa uma coleção de back-ends, que são instâncias de uma aplicação ou um microsserviço. Um contentor de back-end é um contentor do Cloud Storage, que é usado frequentemente para alojar conteúdo estático, como imagens.
Para balanceadores de carga de aplicações externos regionais, balanceadores de carga de aplicações internos e Cloud Service Mesh, os destinos possíveis são os seguintes:
- Serviço de back-end predefinido
- Serviço de back-end não predefinido
Além disso, os balanceadores de carga de aplicações externos globais suportam o seguinte:
- Segmento de back-end predefinido
- Contentor de back-end não predefinido
Por exemplo, suponha que tem a seguinte configuração:
- Um endereço IP:
- Todos os pedidos à sua organização são enviados para o mesmo endereço IP e o mesmo equilibrador de carga.
- O tráfego é direcionado para diferentes serviços de back-end com base no URL do pedido.
- Dois domínios:
example.nettem vídeos de formação.example.orgaloja o Website da sua organização.
- Quatro conjuntos de servidores:
- Um aloja o Website da sua organização (serviço de back-end:
org-site). - Um aloja o Website de vídeos de formação geral (serviço de back-end:
video-site). - Um aloja vídeos de formação em alta definição (HD) (serviço de back-end:
video-hd). - Um aloja vídeos de formação em definição padrão (SD) (serviço de back-end:
video-sd).
- Um aloja o Website da sua organização (serviço de back-end:
Quer que aconteça o seguinte:
- Pedidos para
example.org(ou qualquer domínio que não sejaexample.net) para aceder ao serviço de back-endorg-site. - Pedidos para
example.netque não correspondem a caminhos mais específicos para aceder ao serviço de back-endvideo-site. - Pedidos para
example.net/video/hd/*para aceder ao serviço de back-endvideo-hd. - Pedidos para
example.net/video/sd/*para aceder ao serviço de back-endvideo-sd.
Um --path-rule para /video/* corresponde a URIs como /video/test1 e /video/test2. No entanto, esta regra de caminho não corresponde ao caminho
/video.
Se o equilibrador de carga receber um pedido com /../ no URL, o equilibrador de carga transforma o URL removendo o segmento do caminho antes de .. e responde com o URL transformado. Por exemplo, quando é enviado um pedido para
http://example.net/video/../abc, o balanceador de carga responde com um redirecionamento 302
para http://example.net/abc. A maioria dos clientes reage, em seguida, emitindo um pedido para o URL devolvido pelo balanceador de carga (neste caso, http://example.net/abc). Este redirecionamento 302 não é registado no Cloud Logging.
O mapa de URLs permite-lhe configurar este tipo de encaminhamento com base no anfitrião e no caminho.
Nomenclatura do balanceador de carga
Para balanceadores de carga de aplicações, o nome do balanceador de carga é sempre igual ao nome do mapa de URLs. O comportamento de cada Google Cloud interface é o seguinte:
- Google Cloud consola. Se criar um Application Load Balancer através da Google Cloud consola, o mapa de URLs é automaticamente atribuído ao mesmo nome que introduziu para o nome do balanceador de carga.
- CLI do Google Cloud ou API. Se criar um balanceador de carga de aplicações através da CLI gcloud ou da API, introduz um nome à sua escolha ao criar o mapa de URLs. Em seguida, este nome do mapa de URLs é refletido na Google Cloud consola como o nome do balanceador de carga.
Para saber como funciona a nomenclatura dos balanceadores de carga de rede de proxy e dos balanceadores de carga de rede de passagem, consulte o artigo Vista geral dos serviços de back-end: nomenclatura do balanceador de carga.
Componentes do mapa de URLs
Um mapa de URLs é um conjunto de Google Cloud recursos de configuração que direcionam pedidos de URLs para serviços de back-end ou contentores de back-end. O mapa de URLs faz isso através das partes hostname e path para cada URL que processa:
- Um nome do anfitrião é a parte do nome do domínio de um URL; por exemplo, a parte do nome do anfitrião do URL
http://example.net/video/hdéexample.net. - Um caminho é a parte de um URL que segue o nome do anfitrião e o número da porta opcional; por exemplo, a parte do caminho do URL
http://example.net/video/hdé/video/hd.
Este diagrama mostra a estrutura dos objetos de configuração do equilíbrio de carga em relação uns aos outros.
Controla que serviços de back-end ou contentores de back-end recebem pedidos recebidos através dos seguintes parâmetros de configuração do mapa de URLs:
Serviço de back-end predefinido ou segmento de back-end predefinido. Quando cria um mapa de URLs, tem de especificar um serviço de back-end predefinido ou um contentor de back-end predefinido, mas não ambos. Esta predefinição representa o serviço de back-end ou o contentor de back-end para o qual Google Cloud direciona pedidos de URLs com qualquer nome de anfitrião, a menos que exista uma regra de anfitrião aplicável.
Regra de anfitrião (
hostRules). Uma regra de anfitrião direciona os pedidos enviados para um ou mais nomes de anfitrião associados para um único localizador de caminhos (pathMatchers). A parte do nome de anfitrião de um URL é correspondida exatamente ou correspondida através de expressões regulares com o conjunto de nomes de anfitrião configurados da regra de anfitrião. Numa regra de anfitrião e caminho do mapa de URLs, se omitir o anfitrião, a regra corresponde a qualquer anfitrião pedido. Para direcionar pedidos parahttp://example.net/video/hdpara um correspondente de caminho, precisa de uma única regra de anfitrião que inclua, pelo menos, o nome do anfitriãoexample.net. Essa mesma regra de anfitrião também pode processar pedidos de outros nomes de anfitriões, mas direcioná-los para o mesmo matcher de caminho.Se precisar de direcionar pedidos para diferentes correspondências de caminhos, tem de usar regras de anfitriões diferentes. Duas regras de anfitrião num mapa de URLs não podem incluir o mesmo nome de anfitrião.
É possível fazer corresponder todos os nomes de anfitrião especificando o caráter universal
*na regra de anfitrião. Por exemplo, para os URLshttp://example.org,http://example.net/video/hdehttp://example.com/audio, todos os três nomes de anfitriãoexample.org,example.neteexample.compodem ser correspondidos especificando*na regra de anfitrião. Também é possível fazer corresponder um nome de anfitrião parcial especificando o caráter universal*. Por exemplo, uma regra de anfitrião*.example.neté correspondida com os nomes de anfitriãonews.example.netefinance.example.net.Número da porta. Os diferentes equilibradores de carga de aplicações processam os números de porta de forma diferente. No caso do Application Load Balancer interno, pode usar o parâmetro Host rule para especificar um número de porta. Por exemplo, para direcionar pedidos para a porta 8080, defina a regra de anfitrião como
example.net:8080.example.netNo caso do Application Load Balancer clássico, apenas o nome do anfitrião no URL é considerado quando corresponde a uma regra de anfitrião. Por exemplo, os pedidos para a porta 8080 e a porta 80 correspondem à regra de anfitriãoexample.net.example.netCorrespondência de caminhos (
pathMatchers). Uma correspondência de caminhos é o parâmetro de configuração referenciado por uma regra de anfitrião. Define a relação entre a parte do caminho de um URL e o serviço de back-end ou o contentor de back-end que deve publicar o pedido. Um correspondente de caminho é composto por dois elementos:Serviço de back-end predefinido do Path Matcher ou contentor de back-end predefinido do Path Matcher. Para cada correspondência de caminho, tem de especificar, pelo menos, um serviço de back-end predefinido ou um contentor de back-end predefinido, mas não ambos. Esta predefinição representa o serviço de back-end ou o contentor de back-end para o qual Google Cloud direciona pedidos de URLs cujos nomes de anfitrião correspondem a uma regra de anfitrião associada ao correspondente de caminhos e cujos caminhos de URL não correspondem a nenhuma regra de caminho no correspondente de caminhos.
Regras do caminho. Para cada correspondência de caminho, pode especificar uma ou mais regras de caminho, que são pares de chave/valor que mapeiam um caminho de URL para um único serviço de back-end ou contentor de back-end.
Os operadores de correspondência de padrões flexíveis permitem-lhe fazer corresponder várias partes de um caminho de URL, incluindo URLs parciais e sufixos (extensões de ficheiros), através da sintaxe de carateres universais. Estes operadores podem ser úteis quando precisa de encaminhar o tráfego e executar reescritas com base em caminhos de URL complexos. Também pode associar um ou mais componentes do caminho a variáveis com nomes e, em seguida, fazer referência a essas variáveis ao reescrever o URL. Com as variáveis com nome, pode reordenar e remover componentes do URL antes de o pedido ser enviado para a sua origem. Para ver detalhes, consulte o artigo Carateres universais, expressões regulares e URLs dinâmicos nas regras de caminho.
Se precisar de capacidades de encaminhamento mais avançadas, por exemplo, se quiser direcionar o tráfego de um URL exclusivo para vários serviços, pode usar regras de encaminhamento em vez de regras de caminho.
Regras de trajeto. As regras de encaminhamento podem ser usadas como alternativa às regras de caminho quando precisar de capacidades de encaminhamento de tráfego avançadas, como o encaminhamento de tráfego com base no caminho do URL, nos cabeçalhos HTTP e nos parâmetros de consulta.
Pode configurar regras de encaminhamento com operadores de correspondência de padrões flexíveis e variáveis denominadas. Estes operadores podem ser úteis quando precisa de encaminhar o tráfego e executar reescritas com base em caminhos de URL complexos. Para ver detalhes, consulte o artigo Carateres universais e operadores de correspondência de padrões em modelos de caminhos para regras de rotas.
Também pode configurar regras de encaminhamento para serem comparadas com expressões regulares que correspondem ao caminho, aos parâmetros de consulta ou aos cabeçalhos no pedido recebido. Para obter detalhes, consulte o artigo Expressões regulares nas regras de encaminhamento.
Relação entre o nome do anfitrião e a regra do anfitrião
Um nome de anfitrião só pode referenciar uma regra de anfitrião.
Uma única regra de anfitrião pode processar vários nomes de anfitriões.
Relação entre a regra de anfitrião e o correspondente de caminhos
Várias regras de anfitrião podem fazer referência a um único localizador de caminhos.
Uma regra de anfitrião só pode referenciar um único correspondente de caminho.
Relação entre o URL e o back-end
Cada URL exclusivo é direcionado para apenas um serviço de back-end ou um contentor de back-end. Consequentemente:
Google Cloud usa a parte do nome do anfitrião de um URL para selecionar uma única regra de anfitrião e o respetivo matcher de caminho referenciado.
Quando usa regras de caminho num correspondente de caminho, não pode criar mais do que uma regra de caminho para o mesmo caminho. Por exemplo, os pedidos de
/videos/hdnão podem ser direcionados para mais do que um serviço de back-end ou um contentor de back-end. Os serviços de back-end podem ter grupos de instâncias de back-end ou grupos de pontos finais de rede de back-end (NEGs) em diferentes zonas e regiões, e pode criar contentores de back-end que usam classes de armazenamento multirregionais.Para direcionar o tráfego de um URL exclusivo para vários serviços, pode usar regras de encaminhamento em vez de regras de caminho. Se configurar o matcher de caminhos com regras de encaminhamento para correspondências de cabeçalhos ou parâmetros, um URL exclusivo pode ser direcionado para mais do que um serviço ou contentor de back-end, com base no conteúdo dos cabeçalhos ou dos parâmetros de consulta no URL.
Da mesma forma, para os equilibradores de carga de aplicações externos regionais e o Cloud Service Mesh, os serviços de back-end ponderados nas ações de encaminhamento podem direcionar o mesmo URL para vários serviços de back-end ou contentores, consoante as ponderações definidas no serviço de back-end ponderado.
Mapas de URLs e protocolos
Pode usar o mesmo mapa de URLs, regras de anfitriões e correspondências de caminhos para processar pedidos HTTP e HTTPS enviados pelos clientes, desde que um proxy HTTP de destino e um proxy HTTPS de destino referenciem o mapa de URLs.
Mapa de URL mais simples
O mapa de URLs mais simples tem apenas um serviço de back-end predefinido ou um contentor de back-end predefinido. Não contém regras de anfitrião nem correspondências de caminhos. O serviço de back-end predefinido ou o contentor de back-end predefinido (conforme o que definiu) processa todos os URLs pedidos.
Se definir um serviço de back-end predefinido, Google Cloud direciona os pedidos para os respetivos grupos de instâncias de back-end ou NEGs de back-end de acordo com a configuração do serviço de back-end.
Ordem das operações
Para um determinado nome de anfitrião e caminho num URL pedido, Google Cloud usa o seguinte procedimento para direcionar o pedido para o serviço de back-end correto ou o contentor de back-end, conforme configurado no seu mapa de URLs:
Se o mapa de URLs não contiver uma regra de anfitrião para o nome de anfitrião do URL, Google Cloud direciona os pedidos para o serviço de back-end predefinido do mapa de URLs ou para o contentor de back-end predefinido, consoante o que tiver definido.
Se o mapa de URLs contiver uma regra de anfitrião que inclua o nome do anfitrião do URL, é consultado o matcher de caminhos referenciado por essa regra de anfitrião:
Se o matcher de caminhos contiver uma regra de caminho que corresponda exatamente ao caminho do URL, Google Cloud direciona os pedidos para o serviço de back-end ou o contentor de back-end para essa regra de caminho.
Se o matcher de caminhos não contiver uma regra de caminho que corresponda exatamente ao caminho do URL, mas contiver uma regra de caminho que termine em
/*cujo prefixo corresponda à secção mais longa do caminho do URL, então, o Google Clouddireciona os pedidos para o serviço de back-end ou o contentor de back-end dessa regra de caminho. Por exemplo, para o mapa de URLs que contém duas regras de correspondência de caminhos/video/hd/movie1e/video/hd/*, se o URL contiver o caminho exato/video/hd/movie1, é comparado com essa regra de caminho.Se nenhuma das condições anteriores for verdadeira, Google Cloud direciona os pedidos para o serviço de back-end predefinido do matcher de caminhos ou para o contentor de back-end predefinido, consoante o que tiver definido.
Restrições de configuração do mapa de URLs
As secções seguintes descrevem determinadas restrições de configuração para os componentes do mapa de URLs.
Correspondências de expressões regulares nas regras de anfitrião e de encaminhamento
As regras de anfitrião permitem-lhe fazer corresponder a parte do URL referente ao nome do anfitrião ao conjunto de nomes de anfitriões configurados da regra de anfitrião. Pode optar por usar um nome de anfitrião específico ou um caráter universal * no campo hostRules[].hosts[] para corresponder ao nome de anfitrião no pedido recebido.
As regras de encaminhamento permitem-lhe definir regras de correspondência que podem corresponder a uma expressão regular no caminho, na string de consulta ou num cabeçalho no pedido recebido. As regras de encaminhamento suportam a utilização de expressões regulares para os seguintes campos do mapa de URLs:
pathMatchers[].routeRules[].matchRules[].regexMatch: uma expressão regular usada para fazer corresponder o caminho do pedido recebido.pathMatchers[].routeRules[].matchRules[].headerMatches[].regexMatch: Uma expressão regular que contém um predicado que corresponde a um cabeçalho do pedido recebido.pathMatchers[].routeRules[].matchRules[].queryParameterMatches[].regexMatch: Uma expressão regular que contém um predicado que corresponde a um parâmetro de consulta do pedido recebido.
Considera-se que um pedido correspondeu a uma routeRule quando qualquer uma das matchRules
for satisfeita. No entanto, os predicados numa determinada matchRule têm uma semântica AND.
Ou seja, todos os predicados numa matchRule têm de corresponder para que o pedido corresponda à regra.
Notas de utilização adicionais:
As expressões regulares só são suportadas para os seguintes produtos:
- Balanceadores de carga de aplicações internos regionais
- Balanceadores de carga de aplicações internos entre regiões
- Balanceadores de carga de aplicações externos regionais
Os equilibradores de carga de aplicações globais e clássicos não suportam expressões regulares.
Tem de usar a sintaxe RE2 para criar as suas expressões regulares. Para ver a lista completa de limitações e operadores permitidos em mapas de URLs, consulte as especificações RE2 para mapas de URLs.
A correspondência de expressões regulares é dispendiosa em termos de consumo de memória e latências de processamento de pedidos. Se optar por usar a correspondência de expressões regulares, tem de ter em conta a degradação do desempenho quando planear a implementação. Por exemplo, se tiver um mapa de URLs com uma única expressão regular, pode esperar que a latência do balanceador de carga aumente 100 microssegundos por pedido. Se o mapa de URLs tiver 5 expressões regulares a serem correspondidas, pode esperar que a latência aumente 200 microssegundos por pedido.
Exemplo n.º 1: use uma expressão regular para fazer corresponder o caminho
O caminho é considerado uma correspondência se corresponder à expressão regular especificada por
regexMatch após a remoção de quaisquer parâmetros de consulta e âncoras fornecidos com o
URL original. Por exemplo, nos seguintes mapeamentos de URLs de exemplo, a expressão regular da regra de encaminhamento, /videos/hd.*, aplicar-se-ia a um URL com o caminho /videos/hd-abcd?key=245.
defaultService: projects/example-project/global/backendServices/org-site
name: rule-match-url-map
hostRules:
- hosts:
- '*' # Match any host
pathMatcher: video-matcher
- hosts:
- example.net
pathMatcher: video-matcher
pathMatchers:
- name: video-matcher
# Optional: default service for this path matcher if no routeRules match
defaultService: projects/example-project/global/backendServices/video-site
routeRules:
- priority: 100000
matchRules:
- regexMatch: /videos/hd.*
routeAction:
weightedBackendServices:
- backendService: projects/example-project/global/backendServices/video-hd
weight: 100
Segue-se uma explicação de cada campo do mapa de URLs de exemplo:
defaultService: Especifica o serviço de back-end predefinido a usar se nenhuma outra regra no mapa de URLs corresponder ao pedido recebido.name: atribui o nome rule-match-url-map a esta configuração do mapa de URLs.hostRules: define uma lista de regras para fazer corresponder o cabeçalho do anfitrião dos pedidos recebidos. A primeira regra corresponde a qualquer anfitrião (*) e direciona o tráfego para opathMatcherdenominado video-matcher. A segunda regra corresponde especificamente ao anfitriãoexample.nete também direciona o tráfego para o localizador de caminhos denominado video-matcher.pathMatchers: define uma lista de correspondências de caminhos com nomes.name: define um correspondente de caminhos denominado video-matcher.defaultService: define o serviço predefinido para este caminho. matcher. Este serviço é usado se um pedido corresponder às regras do anfitrião que apontam para video-matcher, mas não corresponder a nenhum dosrouteRulesno mesmo.routeRules: contém uma lista de regras para fazer corresponder o caminho do URL.priority: define a prioridade desta regra como 100 000. As regras são avaliadas por ordem do número de prioridade mais baixo para o mais elevado.matchRules: contém as condições para que esta regra de encaminhamento seja correspondida.regexMatch: esta condição verifica se o caminho do URL corresponde à expressão regular/videos/hd.*(por exemplo, "/videos/hd" e "/videos/hd-caching").routeAction: especifica a ação a realizar se todas as condições emmatchRulesforem cumpridas.weightedBackendServices: distribui o tráfego por uma lista de serviços de back-end com base em ponderações.backendService: especifica o serviço de back-end para o qual encaminhar o tráfego.weight: atribui um peso de 100 a este serviço de back-end. Uma vez que é o único serviço na lista, recebe 100% do tráfego que corresponde a esta routeRule.
O mapa de URLs seguinte mostra um exemplo semelhante sem usar um routeAction.
defaultService: projects/example-project/global/backendServices/video-site
name: path-matcher-videos
routeRules:
matchRules:
- regexMatch: /videos/hd.*
priority: 100000
service: projects/example-project/global/backendServices/video-hd
Exemplo n.º 2: use uma expressão regular para corresponder a cabeçalhos
O cabeçalho é considerado uma correspondência se o valor do cabeçalho corresponder à expressão regular especificada por regexMatch. Por exemplo, no mapa de URLs de exemplo seguinte, a expressão regular do nome do cabeçalho, .*Android.*-hd, aplicar-se-ia a um pedido com o cabeçalho User-Agent:123Androidabc-hd.
defaultService: projects/example-project/regions/us-central1/backendServices/default-backend-service
name: header-match-url-map
hostRules:
- hosts:
- '*' # Match any host
pathMatcher: header-matcher
pathMatchers:
- name: header-matcher
# Optional: default service for this path matcher if no routeRules match
defaultService: projects/example-project/regions/us-central1/backendServices/default-backend-service
routeRules:
- priority: 1
matchRules:
- headerMatches:
- headerName: User-Agent
regexMatch: .*Android.*-hd
# This prefix match applies to the path part of the URL
- prefixMatch: /video/
# service: can be used instead of routeAction if no other actions are needed
service: projects/example-project/regions/us-central1/backendServices/video-backend-service
# Alternatively, use routeAction to specify the service:
# routeAction:
# weightedBackendServices:
# - backendService: projects/example-project/regions/us-central1/backendServices/video-backend-service
# weight: 100
Segue-se uma explicação de cada campo do mapa de URLs de exemplo:
defaultService: Especifica o serviço de back-end predefinido a usar se nenhuma outra regra no mapa de URLs corresponder ao pedido recebido.- : atribui o nome header-match-url-map a esta configuração do mapa de URLs.
name hostRules: Define uma lista de regras para fazer corresponder o cabeçalho do anfitrião dos pedidos recebidos. A regra corresponde a qualquer anfitrião ("*") e direciona o tráfego para o header-matcher denominadopathMatcher.pathMatchers: define uma lista de correspondências de caminhos com nomes.name: define um correspondente de caminho denominado header-matcher.defaultService: define o serviço predefinido para este correspondente de caminhos. Este serviço é usado se um pedido corresponder à regra de anfitrião, mas não corresponder a nenhum dosrouteRulesneste correspondente de caminho.routeRules: contém uma lista de regras para corresponder a pedidos recebidos com base em cabeçalhos e caminhos.priority: Define a prioridade desta regra como 1. As regras são avaliadas por ordem, do número de prioridade mais baixo para o mais alto.matchRules: contém uma lista de condições que têm de ser todas verdadeiras para que a regra corresponda.headerMatches: especifica condições com base nos cabeçalhos dos pedidos.headerName: procura o cabeçalho do agente do utilizador.regexMatch: verifica se o valor do cabeçalho User-Agent corresponde à expressão regular.*Android.*-hd. Isto corresponderia a agentes do utilizador que indicam um dispositivo Android, com uma string que contém "-hd".prefixMatch: definido como/video/, esta condição verifica se o caminho do URL começa com "/video/".service: se todas as condiçõesmatchRulesforem cumpridas, o tráfego é direcionado para este serviço de back-end.- A secção
routeActioncom comentários mostra uma forma alternativa de especificar o serviço de back-end, que seria necessária se precisasse de configurar outras ações de encaminhamento, como reescritas de URLs, transformações de cabeçalhos ou serviços de back-end ponderados.
Exemplo n.º 3: use uma expressão regular para corresponder a parâmetros de consulta
O parâmetro de consulta é considerado uma correspondência se o valor do caminho com os parâmetros de consulta corresponder à expressão regular especificada por regexMatch. Por exemplo, no seguinte mapa de URLs de exemplo, a expressão regular do parâmetro de consulta, /im.*/.*.html, aplicar-se-ia a um URL com parâmetros de consulta, como /images/random_page.html?param1=param_value_123abc-hd.
defaultService: projects/example-project/regions/us-central1/backendServices/sample-bs
name: query-match-url-map
hostRules:
- hosts:
- '*' # Match any host
pathMatcher: query-matcher
pathMatchers:
- name: query-matcher
# Optional: default service for this path matcher if no routeRules match
defaultService: projects/example-project/regions/us-central1/backendServices/sample-bs
routeRules:
- priority: 1
matchRules:
- queryParameterMatches:
- name: param1 #parameter name in query
regexMatch: param_value_.*-hd
# This regexMatch applies to the path part of the URL
- regexMatch: /im.*/.*.html
# Directs traffic to this service if all conditions in matchRules are met
service: projects/example-project/regions/us-central1/backendServices/sample-images-bs
Segue-se uma explicação de cada campo do mapa de URLs de exemplo:
hostRules: adiciona uma regra para corresponder a todos os anfitriões (*) e direciona o tráfego para opathMatcherdenominado query-matcher.pathMatchers: define um elemento de correspondência de caminho denominado query-matcher.routeRules: coloca o blocorouteRulesfornecido em query-matcher.priority: Define a prioridade desta regra como 1. As regras são avaliadas por ordem, do número de prioridade mais baixo para o mais alto.matchRules: contém as condições para o elementorouteRules.queryParameterMatches: verifica se o parâmetro de consulta denominado "param1" corresponde à expressão regularparam_value_.*-hd.regexMatch: A expressão regular/im.*/.*.htmlaplica-se ao caminho do URL (por exemplo, /images/random_page.html), antes da string de consulta.service: especifica o serviço de back-end a usar se todas as condições no elementomatchRulesforem verdadeiras.
Carateres universais, expressões regulares e URLs dinâmicos em regras de caminho e correspondência de prefixo
Uma regra de caminho (
pathMatchers[].pathRules[]) só pode incluir um caráter universal (*) após um caráter de barra (/). Por exemplo,/videos/*e/videos/hd/*são válidos para regras de caminho, mas/videos*e/videos/hd*não são.As regras de caminho não usam expressões regulares nem correspondência de substrings. PathTemplateMatch pode usar operadores de correspondência de caminhos simplificados. Por exemplo, as regras de caminho para
/videos/hdou/videos/hd/*não se aplicam a um URL com o caminho/video/hd-abcd. No entanto, uma regra do caminho para/video/*aplica-se a esse caminho.Uma correspondência de prefixo (
pathMatchers[].routeRules[].matchRules[].prefixMatch) não trata*como um caráter universal, mas como um caráter literal.Os correspondentes de caminhos (e os mapas de URLs em geral) não oferecem funcionalidades que funcionam como a diretiva
<LocationMatch>do Apache. Se tiver uma aplicação que gere caminhos de URL dinâmicos com um prefixo comum, como/videos/hd-abcde/videos/hd-pqrs, e precisar de enviar pedidos feitos a esses caminhos para diferentes serviços de back-end, pode não conseguir fazê-lo com um mapa de URLs. Para casos que contenham apenas alguns URLs dinâmicos possíveis, pode criar um correspondente de caminho com um conjunto limitado de regras de caminho. Para casos mais complexos, tem de fazer a correspondência de expressões regulares baseada no caminho nos seus back-ends.
Carateres universais e operadores de correspondência de padrões em modelos de caminhos para regras de encaminhamento
Os operadores de correspondência de padrões flexíveis permitem-lhe fazer corresponder várias partes de um caminho de URL, incluindo URLs parciais e sufixos (extensões de ficheiros), através da sintaxe de carateres universais. Estes operadores podem ser úteis quando precisa de encaminhar tráfego e executar reescritas com base em caminhos de URL complexos. Também pode associar um ou mais componentes do caminho a variáveis com nomes e, em seguida, referir-se a essas variáveis ao reescrever o URL. Com as variáveis com nome, pode reordenar e remover componentes do URL antes de o pedido ser enviado para a sua origem.
A correspondência de padrões com carateres universais só é suportada para os seguintes produtos:
- Balanceador de carga de aplicações externo global
- Balanceador de carga de aplicações externo regional
- Balanceador de carga de aplicações interno regional
- Balanceador de carga de aplicações interno entre regiões
- Cloud Service Mesh
O exemplo seguinte encaminha o tráfego para uma aplicação de comércio eletrónico que tem serviços separados para informações do carrinho e informações do utilizador.
Pode configurar routeRules com operadores de correspondência de padrões flexíveis e variáveis
com nomes para enviar o ID exclusivo do utilizador para uma página de detalhes da conta de utilizador
e as informações do carrinho do utilizador para um serviço de processamento de carrinhos após
reescrever o URL.
pathMatchers:
- name: cart-matcher
routeRules:
- description: CartService
matchRules:
- pathTemplateMatch: '/xyzwebservices/v2/xyz/users/{username=*}/carts/{cartid=**}'
service: cart-backend
priority: 1
routeAction:
urlRewrite:
pathTemplateRewrite: '/{username}-{cartid}/'
- name: user-matcher
routeRules:
- description: UserService
matchRules:
- pathTemplateMatch: '/xyzwebservices/v2/xyz/users/*/accountinfo/*'
service: user-backend
priority: 1
Veja o que acontece quando um cliente pede
/xyzwebservices/v2/xyz/users/abc@xyz.com/carts/FL0001090004/entries/SJFI38u3401nms?fields=FULL&client_type=WEB,
que tem informações do utilizador e informações do carrinho:
- O caminho do pedido corresponde ao
pathTemplateMatchnocart-matcherpathMatcher. A variável{username=*}corresponde aabc@xyz.come a variável{cartid=**}corresponde aFL0001090004/entries/SJFI38u3401nms. - Os parâmetros de consulta são separados do caminho, o caminho é reescrito
com base em
pathTemplateRewritee os parâmetros de consulta são anexados ao caminho reescrito. Só podemos usar as mesmas variáveis que usámos para definir opathTemplateMatchno nossopathTemplateRewrite. - O pedido reescrito é enviado para
cart-backendcom o caminho do URL reescrito:/abc@xyz.com-FL0001090004/entries/SJFI38u3401nms?fields=FULL&client_type=WEB.
Quando um cliente pede /xyzwebservices/v2/xyz/users/abc%40xyz.com/accountinfo/abc-1234, que tem apenas informações do utilizador e da conta, acontece o seguinte:
- O caminho do pedido corresponde ao
pathTemplateMatchnouser-matcherpathMatcher. O primeiro*corresponde aabc%40xyz.come o segundo*corresponde aabc-1234. - O pedido é enviado para
user-backend.
A tabela seguinte descreve a sintaxe dos padrões de modelos de caminhos.
| Operador | Correspondências |
|---|---|
* |
Um único segmento de caminho, não incluindo os carateres
separadores de caminho / circundantes. |
** |
Corresponde a zero ou mais carateres, incluindo quaisquer carateres separadores de caminho
/ entre vários segmentos de caminho. Se forem incluídos outros operadores, o operador ** tem de ser o último. |
{name} ou {name=*} |
Uma variável com nome que corresponda a um segmento do caminho. Corresponde a um único segmento de caminho, não incluindo os carateres separadores de caminho / circundantes. |
{name=news/*} |
Uma variável com nome que corresponde explicitamente a dois segmentos do caminho:
news e um segmento com carateres universais *. |
{name=*/news/*} |
Uma variável com nome que corresponde a três segmentos do caminho. |
{name=**} |
Uma variável com nome que corresponde a zero ou mais carateres. Se estiver presente, tem de ser o último operador. |
Quando usa estes operadores para a correspondência de padrões flexível, tenha em atenção as seguintes considerações:
- É possível combinar vários operadores num único padrão.
- Os parâmetros de consulta são separados do caminho, o caminho é reescrito
com base em
pathTemplateRewritee os parâmetros de consulta são anexados ao caminho reescrito. - Os pedidos não são normalizados com codificação em percentagem. Por exemplo, um URL com um caráter de barra codificado em percentagem (%2F) não é descodificado para o formato não codificado.
- Cada nome de variável, como
{segment}ou{region}, só pode aparecer uma vez no mesmo padrão. As variáveis múltiplas com o mesmo nome são inválidas e são rejeitadas. - Os nomes das variáveis são sensíveis a maiúsculas e minúsculas e têm de ser identificadores válidos. Para verificar se um nome de variável é válido, certifique-se de que corresponde à expressão regular
^[a-zA-Z][a-zA-Z0-9_]*$.{API},{api}e{api_v1}são todos identificadores válidos. Identificam três variáveis distintas.{1},{_api}e{10alpha}não são identificadores válidos.
- Existe um limite de cinco operadores por padrão de modelo.
Para executar uma reescrita de URL opcional antes de o pedido ser enviado para a origem,
pode usar as mesmas variáveis que definiu para capturar um caminho.
Por exemplo, pode fazer referência, reordenar ou omitir variáveis no campo pathTemplateRewrite ao definir urlRewrite.
Quando usa variáveis e operadores para a correspondência de padrões flexível para reescritas de URLs, tenha em atenção estas considerações:
- Ao reescrever um URL, pode omitir variáveis se não forem necessárias como parte do URL reescrito.
- Antes de quaisquer reescritas, pode identificar o URL enviado pelo cliente na sua origem inspecionando os cabeçalhos de resposta. O URL do cliente original é preenchido com o cabeçalho
x-client-request-urle o cabeçalhox-envoy-original-path.
Exemplo de fluxo de trabalho de mapa de URLs com um balanceador de carga de aplicações externo
O exemplo seguinte ilustra a ordem das operações para um mapa de URLs. Este exemplo configura apenas o mapa de URLs para um balanceador de carga da aplicação clássico existente. Para simplificar o conceito, usa apenas serviços de back-end. No entanto, pode substituir os serviços de back-end por contentores de back-end. Para saber como criar os outros componentes do balanceador de carga, consulte o artigo Crie um balanceador de carga de aplicações clássico.
Para mais informações sobre como criar e configurar mapas de URLs com correspondências de caminhos
e regras de anfitriões, consulte a gcloud compute url-maps create
documentação.
Crie um mapa de URLs para o balanceador de carga e especifique um serviço de back-end predefinido. Este exemplo cria um mapa de URLs denominado
video-org-url-mapque faz referência a um serviço de back-end existente denominadoorg-site.gcloud compute url-maps create video-org-url-map \ --default-service=org-siteCrie um correspondente de caminho com o nome
video-matchercom as seguintes características:- O serviço de back-end predefinido é
video-site, um serviço de back-end existente. - Adicione regras de caminho que direcionam pedidos para o caminho de URL exato
/video/hdou o prefixo do caminho de URL/video/hd/*para um serviço de back-end existente denominadovideo-hd. - Adicione regras de caminho que direcionam pedidos para o caminho de URL exato
/video/sdou o prefixo do caminho de URL/video/sd/*para um serviço de back-end existente denominadovideo-sd.
gcloud compute url-maps add-path-matcher video-org-url-map \ --path-matcher-name=video-matcher \ --default-service=video-site \ --path-rules=/video/hd=video-hd,/video/hd/*=video-hd,/video/sd=video-sd,/video/sd/*=video-sd- O serviço de back-end predefinido é
Crie uma regra de anfitrião para o nome do anfitrião
example.netque faça referência ao matcher de caminhovideo-matcher.gcloud compute url-maps add-host-rule video-org-url-map \ --hosts=example.net \ --path-matcher-name=video-matcher
O video-org-url-mapURL do mapa deve ter o seguinte formato:
gcloud compute url-maps describe video-org-url-map
creationTimestamp: '2021-03-05T13:34:15.833-08:00'
defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
fingerprint: mfyJIT7Zurs=
hostRules:
- hosts:
- '*'
pathMatcher: video-matcher
- hosts:
- example.net
pathMatcher: video-matcher
id: '8886405179645041976'
kind: compute#urlMap
name: video-org-url-map
pathMatchers:
- defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
name: video-matcher
pathRules:
- paths:
- /video/hd
- /video/hd/*
service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
- paths:
- /video/sd
- /video/sd/*
service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
O mapa de URLs video-org-url-map direciona os URLs solicitados para back-ends da seguinte forma.
A tabela seguinte explica o processamento de pedidos apresentado no diagrama anterior.
| Nome do anfitrião | Caminhos de URLs | Serviço de back-end selecionado | Motivo da seleção |
|---|---|---|---|
Nome do anfitrião:example.org e todos os outros nomes de anfitriões
diferentes deexample.net |
todos os caminhos | org-site |
O nome do anfitrião não está em nenhuma regra de anfitrião do mapa de URLs, pelo que o pedido é direcionado para o serviço de back-end predefinido do mapa de URLs. |
Nome do anfitrião:example.net |
/video/video/examples |
video-site |
O pedido é enviado para o serviço de back-end predefinido porque não existe nenhuma regra de caminho para /video/ ou /video/*. A regra de anfitrião
para example.net faz referência a um correspondente de caminhos,
mas esse correspondente de caminhos não tem regras de caminhos que se aplicariam a
estes caminhos.
|
Nome do anfitrião:example.net |
/video/hd/video/hd/movie1/video/hd/movies/movie2Outros URLs que começam por /video/hd/* |
video-hd |
Uma regra de anfitrião para example.net faz referência a um matcher de caminho
cujas regras de caminho direcionam pedidos de caminhos de URL que correspondem exatamente
/video/hd ou que começam com /video/hd/* para
o serviço de back-end video-hd. |
Nome do anfitrião:example.net |
/video/sd/video/sd/show1/video/sd/shows/show2Outros URLs que começam por /video/sd/* |
video-sd |
Uma regra de anfitrião para example.net faz referência a um matcher de caminho
cujas regras de caminho direcionam pedidos de caminhos de URL que correspondem exatamente
/video/sd ou que começam com /video/sd/* para
o serviço de back-end video-sd. |
Redirecionamentos de URL
Um redirecionamento de URL redireciona os visitantes do seu domínio de um URL para outro.
Um redirecionamento de URL predefinido não está condicionado à correspondência de nenhum padrão específico no pedido recebido. Por exemplo, é recomendável usar um redirecionamento de URL predefinido para redirecionar qualquer nome do anfitrião para um nome do anfitrião à sua escolha.
Existem várias formas de criar um redirecionamento de URL, conforme descrito na tabela seguinte.
| Método | Configuração |
|---|---|
| Redirecionamento de URL predefinido do mapa de URLs | Nível superior defaultUrlRedirect |
| Um redirecionamento de URL predefinido de um correspondente de caminho | pathMatchers[].defaultUrlRedirect[] |
| O redirecionamento de URL da regra de caminho de um correspondente de caminho | pathMatchers[].pathRules[].urlRedirect |
| O redirecionamento de URL da regra de encaminhamento de um matcher de caminho | pathMatchers[].routeRules[].urlRedirect |
Dentro de um defaultUrlRedirect ou urlRedirect, o pathRedirect funciona sempre
da seguinte forma:
- Todo o caminho do pedido é substituído pelo caminho que especificar.
Dentro de um defaultUrlRedirect ou urlRedirect, o funcionamento do prefixRedirect depende da forma como o usa:
- Se usar um
defaultUrlRedirect,prefixRedirecté efetivamente um prefixo adicionado porque o caminho correspondente é sempre/. - Se usar um
urlRedirectnuma regra de trajeto ou numa regra de caminho de um matcher de caminhos,prefixRedirecté uma substituição de prefixo com base na forma como o caminho pedido foi correspondido conforme definido na regra de caminho ou na regra de trajeto.
Exemplos de redirecionamentos
A tabela seguinte apresenta alguns exemplos de configurações de redirecionamento. A coluna do lado direito mostra a configuração da API para um redirecionamento de URL predefinido.
| Quer | Realizado através de um redirecionamento de URL predefinido |
|---|---|
| Redirecionamento de HTTP para HTTPS Redirecionar http://host.name/path para https://host.name/path |
kind: compute#urlMap
name: web-map-http
defaultUrlRedirect:
httpsRedirect: True
|
| Redirecionamento de HTTP para HTTPS + anfitrião Redirecionamento http://any-host-name/path para https://www.example.com/path |
kind: compute#urlMap
name: web-map-http
defaultUrlRedirect:
httpsRedirect: True
hostRedirect: "www.example.com"
|
| HTTP para HTTPS + redirecionamento de anfitrião + redirecionamento de caminho completo Redirecionar http://any-host-name/path para https://www.example.com/newPath |
kind: compute#urlMap
name: web-map-http
defaultUrlRedirect:
httpsRedirect: True
hostRedirect: "www.example.com"
pathRedirect: "/newPath"
|
| HTTP para HTTPS + redirecionamento de anfitrião + redirecionamento de prefixo Redirecionamento http://any-host-name/originalPath para https://www.example.com/newPrefix/originalPath |
kind: compute#urlMap
name: web-map-http
defaultUrlRedirect:
httpsRedirect: True
hostRedirect: "www.example.com"
prefixRedirect: "/newPrefix"
|
O fragmento parcial seguinte anota cada recurso da API:
defaultUrlRedirect: redirectResponseCode: MOVED_PERMANENTLY_DEFAULT httpsRedirect: True # True if you want https://, false if you want http:// hostRedirect: "new-host-name.com" # Omit to keep the requested host pathRedirect: "/new-path" # Omit to keep the requested path; mutually exclusive to prefixRedirect prefixRedirect: "/newPrefix" # Omit to keep the requested path; mutually exclusive to pathRedirect stripQuery: False # True to omit everything in the URL after ? ...
O que se segue?
Para adicionar, validar, testar, listar ou eliminar um mapa de URLs, consulte o artigo Use mapas de URLs.
Para obter informações sobre mapas de regras de encaminhamento com a Cloud Service Mesh, consulte a vista geral dos mapas de regras de encaminhamento da Cloud Service Mesh.