网址映射概览

Google Cloud HTTP(S) 负载平衡器和 Traffic Director 使用名称为网址映射的 Google Cloud 配置资源将请求路由到后端服务或后端存储分区。

例如,对于外部 HTTP(S) 负载平衡器,您可以使用单个网址映射,根据网址映射中配置的规则将请求路由到不同的目的地:

  • 针对 https://example.com/video 的请求转到一个后端服务。
  • 针对 https://example.com/audio 的请求转到其他后端服务。
  • 针对 https://example.com/images 的请求转到 Cloud Storage 后端存储分区。
  • 针对任何其他主机和路径组合的请求转到默认后端服务。

网址映射与以下 Google Cloud 产品结合使用:

可用的网址映射资源类型有两种:全局和区域性。您使用的资源类型取决于产品的负载平衡方案。

产品 负载平衡方案 网址映射资源类型 支持的目的地
外部 HTTP(S) 负载平衡器 EXTERNAL 全球、外部 后端服务、后端存储分区
内部 HTTP(S) 负载平衡器 INTERNAL_MANAGED 区域、内部 后端服务
Traffic Director INTERNAL_SELF_MANAGED 全球、内部 后端服务

并非所有网址映射都能用于所有产品。与内部 HTTP(S) 负载平衡和 Traffic Director 搭配使用的网址映射还支持多种高级流量管理功能。如需详细了解这些差异,请参阅高级流量管理

网址映射的工作原理

当请求到达负载平衡器时,负载平衡器会根据网址映射中定义的规则将请求路由到特定的后端服务或后端存储分区。

后端服务表示后端的集合,而后端是应用或微服务的实例。后端存储分区是一个 Cloud Storage 存储分区,通常用于托管静态内容(如图片)。

对于外部 HTTP(S) 负载平衡器、内部 HTTP(S) 负载平衡器和 Traffic Director,可能的目标如下:

此外,外部 HTTP(S) 负载平衡器支持以下功能:

例如,假设您采用以下设置:

  • 一个 IP 地址:
    • 向您的组织发出的所有请求都会转到相同 IP 地址和相同负载平衡器。
    • 根据请求网址,流量会被定向至不同的后端服务。
  • 两个网域:
    • example.net 用于托管培训视频。
    • example.org 用于托管您组织的网站。
  • 四组服务器:
    • 一组服务器用于托管您组织的网站(后端服务:org-site)。
    • 一组服务器用于托管整个培训视频网站(后端服务:video-site)。
    • 一组服务器用于托管高清 (HD) 培训视频(后端服务:video-hd)。
    • 一组服务器用于托管标清 (SD) 培训视频(后端服务:video-sd)。

您希望按如下方式路由请求:

  • 将向 example.org(或 example.net 以外的任何网域)发出的请求转到 org-site 后端服务。
  • 将向 example.net 发出且没有更具体匹配路径的请求转到 video-site 后端服务。
  • 将向 example.net/video/hd/* 发出的请求转到 video-hd 后端服务。
  • 将向 example.net/video/sd/* 发出的请求转到 video-sd 后端服务。

/video/*--path-rule/video/test1/video/test2 等 URI 匹配。但是,此路径规则与路径 /video 不匹配。

如果负载平衡器收到网址中包含 /../ 的请求,则负载平衡器会返回 302 重定向。例如,在针对 http://example.net/video/../abc 发送请求时,负载平衡器会将此请求转换为 http://example.net/abc,并根据网址映射配置对其进行处理。此 302 重定向不会记录在 Cloud Logging 中。

通过网址映射,您可以设置此类主机和基于路径的路由。

后端服务设置示例(点击放大)
后端服务设置示例(点击放大)

命名

每个网址映射都有一个名称。当您使用 Google Cloud Console 创建基于 HTTP(S) 的负载平衡器时,系统会为网址映射分配一个名称。此名称与负载平衡器的名称相同。如果您使用 gcloud 命令行工具或 API,则可以为网址映射定义自定义名称。

网址映射组件

网址映射是一组Google Cloud 配置资源,可将对网址的请求定向到后端服务或后端存储分区。网址映射使用其处理的每个网址的主机名和路径部分来实现这一点:

  • 主机名是网址的域名部分;例如,网址 http://example.net/video/hd 的主机名部分为 example.net
  • 路径是网址中位于主机名和可选端口号后面的部分;例如,对于网址 http://example.net/video/hd,其路径部分为 /video/hd
带有基本网址映射的负载平衡器配置(点击可放大)。
带有基本网址映射的负载平衡器配置(点击可放大)

此图展示了彼此相关的负载平衡配置对象的结构。

您可以使用以下网址映射配置参数来控制接收传入请求的后端服务或后端存储分区:

  • 默认后端服务默认后端存储分区。创建网址映射时,您必须指定默认后端服务或默认后端存储分区,但不能同时指定两者。在没有适用的主机规则的情况下,Google Cloud 会将对包含任何主机名的网址的请求定向到这个默认后端服务或后端存储分区

  • 主机规则 (hostRules)。主机规则会将发送到一个或多个关联主机名的请求定向到单个路径匹配器 (pathMatchers)。网址的主机名部分应与主机规则中配置的一组主机名完全匹配。在网址映射主机和路径规则中,如果省略主机,则该规则将匹配所请求的任何主机。如需将对 http://example.net/video/hd 的请求定向到路径匹配器,您需要一个至少包含主机名 example.net 的主机规则。该主机规则还可以处理对其他主机名的请求,但它会将这些请求定向到同一路径匹配器。

    如果您需要将请求定向到其他路径匹配器,必须使用不同的主机规则。网址映射中的两个主机规则不能包含相同主机名。

    您可以对所有主机名进行匹配,只需在主机规则中指定通配符 * 即可。例如,对于网址 http://example.orghttp://example.net/video/hdhttp://example.com/audio,在主机规则中指定 * 即可对所有三个主机名(即 example.orgexample.netexample.com)进行匹配。此外,也可以通过指定通配符 * 对部分主机名进行匹配。例如,主机规则 *.example.net 与主机名 foo.example.netbar.example.net 都匹配。

    • 端口号。您还可以使用主机规则参数指定端口号。例如,要定向对端口 8080 的 example.net 请求,请将主机规则设置为 example.net:8080
  • 路径匹配器 (pathMatchers)。路径匹配器是供主机规则引用的配置参数。它定义了网址的路径部分与应处理请求的后端服务或后端存储分区之间的关系。路径匹配器由以下两个元素组成:

    • 路径匹配器默认后端服务路径匹配器默认后端存储分区。对于每个路径匹配器,您必须至少指定一个默认后端服务或默认后端存储分区,但不能同时指定这两者。如果网址的主机名与路径匹配器的关联主机规则相匹配,且网址路径与路径匹配器中的任何路径规则都不匹配,那么 Google Cloud 会将对此类网址的请求定向到这个默认后端服务或后端存储分区。

    • 路径规则。路径规则采用键值对形式,用于将网址路径映射到单个后端服务或后端存储分区,您可以为每个路径匹配器指定一个或多个路径规则。下一部分详细介绍了路径规则原理。

操作顺序

根据请求网址中的指定主机名和路径,Google Cloud 会使用以下过程将请求定向到网址映射中配置的相应后端服务或后端存储分区:

  • 如果网址映射不包含与该网址的主机名对应的主机规则,则 Google Cloud 会将请求定向到网址映射的默认后端服务或默认后端存储分区,具体取决于您之前定义的设置。

  • 如果网址映射包含与该网址的主机名对应的主机规则,那么系统会查询该主机规则引用的路径匹配器:

    • 如果路径匹配器包含与该网址的路径完全匹配的路径规则,则 Google Cloud 会将请求定向到该路径规则对应的后端服务或后端存储分区。

    • 如果路径匹配器不包含与该网址的路径完全匹配的路径规则,但确实包含以 /* 结尾且其前缀与该网址的路径的最长部分匹配的路径规则,则 Google Cloud 会将请求定向到该路径规则对应的后端服务或后端存储分区。例如,对于包含 /video/hd/movie1/video/hd/* 两个路径匹配器规则的网址映射,如果网址包含 /video/hd/movie1 这一确切路径,那么它与该路径规则匹配。

    • 如果以上两个条件都不满足,则 Google Cloud 会将请求定向到路径匹配器的默认后端服务或默认后端存储分区,具体取决于您之前定义的设置。

路径匹配器限制条件

路径匹配器和路径规则具有以下限制:

  • 在路径规则中,只能在正斜杠字符 (/) 后面添加通配符 (*)。例如,/videos/*/videos/hd/* 是有效的路径规则,但 /videos*/videos/hd* 不是有效的路径规则。

  • 路径规则不使用正则表达式或子字符串匹配。例如,/videos/hd/videos/hd/* 路径规则不适用于路径为 /video/hd-abcd 的网址。不过,/video/* 路径规则适用于该路径。

  • 路径匹配器(以及一般网址映射)不会提供类似于 Apache LocationMatch 指令的功能。如果您的应用生成具有通用前缀的动态网址路径(例如 /videos/hd-abcd/videos/hd-pqrs),并且您需要将向这些路径发出的请求发送到不同的后端服务,您可能无法通过网址映射来实现此目的。对于仅包含几个可能动态网址的简单使用场景,您可能可以使用一组有限的路径规则来创建路径匹配器。对于较为复杂的使用场景,您将需要在后端上执行基于路径的正则表达式匹配。

主机名只能引用单个主机规则,主机规则也只能引用单个路径匹配器。但是,单个主机规则可以处理多个主机名,多个主机规则可引用单个路径匹配器。因此,每个唯一网址都将仅定向到一个后端服务或一个后端存储分区:

  • Google Cloud 使用网址的主机名部分来选择单个主机规则及其引用的路径匹配器。

  • 在路径匹配器中,您不能为同一路径创建多个路径规则。例如,对 /videos/hd 的请求不能定向到多个后端服务或后端存储分区。后端服务的后端实例组或后端网络端点组 (NEG) 可以分布在不同的区域和地区,您可以创建使用 Multi-Regional 存储类别的后端存储分区。

网址映射和协议

您可以使用相同的网址映射、主机规则和路径匹配器来处理客户端提交的 HTTP 和 HTTPS 请求,前提是目标 HTTP 代理和目标 HTTPS 代理都引用了该网址映射。

您可以使用网址映射来配置重定向,如以下指南所示:

最简单的网址映射

最简单的网址映射只有一项默认后端服务或一个默认后端存储分区。该网址映射不包含主机规则,也不包含路径匹配器。默认后端服务或默认后端存储分区(无论您定义的设置为何)可处理所有请求的网址。

如果您定义了默认后端服务,则 Google Cloud 会根据该后端服务的配置将请求定向到其后端实例组或后端 NEG。

只有默认服务、不含任何规则的网址映射(点击放大)
只有默认服务、不含任何规则的网址映射(点击放大)

具有外部 HTTP(S) 负载平衡器的网址映射工作流示例

以下示例演示了网址映射的操作顺序。本示例为外部 HTTP(S) 负载平衡器配置网址映射。为便于理解概念,该示例仅使用了后端服务;不过,您可以改用后端存储分区。 如需了解如何创建外部 HTTP(S) 负载平衡器的其他组件,请参阅创建外部 HTTP(S) 负载平衡器

如需查看如何创建内部 HTTP(S) 负载平衡器的网址映射和其他组件的示例,请参阅准备内部 HTTP(S) 负载平衡设置

以下示例中讨论的每个后端服务都采用外部方案,并使用 HTTP、HTTPS 或 HTTP/2 协议。

  1. 为负载平衡器创建网址映射,并指定默认后端服务。 本示例创建了网址映射 video-org-url-map,它引用现有后端服务 org-site

    gcloud compute url-maps create video-org-url-map \
        --default-service=org-site
    
  2. 创建名为 video-matcher 且具有以下特征的路径匹配器:

    • 默认后端服务为 video-site(现有的一项后端服务)。
    • 添加相关路径规则,将对确切网址路径 /video/hd 或网址路径前缀 /video/hd/* 的请求定向至现有后端服务 video-hd
    • 添加相关路径规则,将对确切网址路径 /video/sd 或网址路径前缀 /video/sd/* 的请求定向至现有后端服务 video-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
    
  3. 为引用 video-matcher 路径匹配器的 example.net 主机名创建主机规则。

    gcloud compute url-maps add-host-rule video-org-url-map \
        --hosts=example.net \
        --path-matcher-name=video-matcher
    

video-org-url-map 网址应如下所示:

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

video-org-url-map 网址映射按以下方式将请求的网址定向到后端。

包含路径规则、路径匹配器和主机规则的网址映射(点击放大)
包含路径规则、路径匹配器和主机规则的网址映射(点击放大)

下表说明了上图中显示的请求处理。

主机名 网址路径 选定后端服务 选择原因
主机名:
example.org 以及除
example.net 以外的所有其他主机名
所有路径 org-site 该主机名不包含在网址映射的任何主机规则中,因此请求会被定向到网址映射的默认后端服务。
主机名:
example.net
/video
/video/examples
video-site 由于没有针对 /video//video/* 的路径规则,因此请求会转到默认后端服务。针对 example.net 的主机规则引用了一个路径匹配器,但该路径匹配器没有适用于这些路径的任何路径规则。
主机名:
example.net
/video/hd
/video/hd/movie1
/video/hd/movies/movie2
/video/hd/* 开头的其他网址
video-hd 针对 example.net 的主机规则引用了一个路径匹配器,该路径匹配器的路径规则会将针对与 /video/hd 完全匹配或以 /video/hd/* 开头的网址路径的请求定向到 video-hd 后端服务。
主机名:
example.net
/video/sd
/video/sd/show1
/video/sd/shows/show2
/video/sd/* 开头的其他网址
video-sd 针对 example.net 的主机规则引用了一个路径匹配器,该路径匹配器的路径规则会将针对与 /video/sd 完全匹配或以 /video/sd/* 开头的网址路径的请求定向到 video-sd 后端服务。

网址重定向

网址重定向会将域名的访问者从一个网址重定向到另一个网址。

默认网址重定向不会匹配传入请求中的任何特定格式。例如,您可能需要使用默认网址重定向,将所有主机名重定向到您选择的主机名。

您可以通过多种方式创建网址重定向,如下表所述。

方法 配置
网址映射的默认网址重定向 顶级 defaultUrlRedirect
路径匹配器的默认网址重定向 pathMatchers[].defaultUrlRedirect[]
路径匹配器的路径规则的网址重定向 pathMatchers[].pathRules[].urlRedirect
路径匹配器的路由规则的网址重定向 pathMatchers[].routeRules[].urlRedirect

defaultUrlRedirecturlRedirect 内部,pathRedirect 工作方式始终如下所示:

  • 系统会将整个请求路径替换为您指定的路径。

defaultUrlRedirecturlRedirect 中,prefixRedirect 的工作方式取决于它的使用方式:

  • 如果您使用 defaultUrlRedirect,则 prefixRedirect 实际上是前缀前置,因为匹配的路径始终为 /
  • 如果您在路径匹配器的路径规则或路径规则中使用 urlRedirect,则 prefixRedirect 是前缀更换品,具体取决于路径规则或路由规则中定义的请求路径匹配方式。

重定向示例:

下表提供了一些重定向配置的示例。右侧列显示默认网址重定向的 API 配置。

您想 使用默认网址重定向来实现
HTTP 到 HTTPS 的重定向

重定向
http://host.name/path

https://host.name/path

            kind: compute#urlMap
            name: web-map-http
            defaultUrlRedirect:
              httpsRedirect: True
           
HTTP 到 HTTPS + 主机重定向

重定向
http://any-host-name/path

https://www.example.com/path

            kind: compute#urlMap
            name: web-map-http
            defaultUrlRedirect:
              httpsRedirect: True
              hostRedirect: "www.example.com"
          
HTTP 到 HTTPS + 主机重定向 + 完整路径重定向

重定向
http://any-host-name/path

https://www.example.com/newPath

            kind: compute#urlMap
            name: web-map-http
            defaultUrlRedirect:
              httpsRedirect: True
              hostRedirect: "www.example.com"
              pathRedirect: "/newPath"
           
HTTP 到 HTTPS + 主机重定向 + 前缀重定向

重定向
http://any-host-name/originalPath

https://www.example.com/newPrefix/originalPath

            kind: compute#urlMap
            name: web-map-http
            defaultUrlRedirect:
              httpsRedirect: True
              hostRedirect: "www.example.com"
              prefixRedirect: "/newPrefix"
            

以下示例注释了每个 API 资源。

kind: compute#urlMap
name: web-map-http
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 ?
  },
  "defaultUrlRedirect": {
    "redirectResponseCode": enum,
  }

如需查看完整的端到端示例,请参阅以下页面:

高级流量管理

并非所有网址映射都能用于所有产品。网址映射与内部 HTTP(S) 负载平衡和 Traffic Director 搭配使用以支持多个高级流量管理功能,但外部 HTTP(S) 负载平衡仅支持部分功能。

请参见下表,了解每种产品可以使用哪些网址映射功能。每个产品都有专门的主题来说明流量管理的工作原理,并为每个用例提供示例网址映射。

产品 网址映射功能和流量管理指南
外部 HTTP(S) 负载平衡 负载平衡器功能:路由和流量管理

外部 HTTP(S) 负载平衡器的流量管理概览

为外部 HTTP(S) 负载平衡器设置流量管理

内部 HTTP(S) 负载平衡 负载平衡器功能:路由和流量管理

内部 HTTP(S) 负载平衡器的流量管理概览

为内部 HTTP(S) 负载平衡器设置流量管理

Traffic Director Traffic Director 功能:路由和流量管理

高级流量管理概览

配置高级流量管理

API 和 Cloud SDK 参考文档

除了 Cloud Console 之外,您还可以使用 API 和 Cloud SDK 创建网址映射。

API

如需了解通过 REST API 使用 URL 映射时可用的属性和方法的说明,请参阅以下内容:

产品 API 文档
外部 HTTP(S) 负载平衡 urlMaps
内部 HTTP(S) 负载平衡 regionUrlMaps
Traffic Director urlMaps

Cloud SDK

如需了解 Cloud SDK 中的 gcloud 命令行工具,请参阅以下内容:

如需高级流量管理,请使用 YAML 文件并使用 gcloud compute url-maps import 命令导入这些文件。

后续步骤