传统版应用负载均衡器的流量管理概览

本页面简要介绍了适用于传统版应用负载均衡器的流量管理功能。本页面仅适用于传统版应用负载均衡器。如果您使用的是其他模式的负载均衡器且其支持一组扩展的流量管理功能,请参阅以下某个页面:

传统版应用负载均衡器支持流量管理功能,可让您使用以下功能:

您可以使用负载平衡器的网址映射配置这些功能。如需了解背景信息,请参阅以下主题:

流量管理组件

概括来讲,外部应用负载均衡器使用全局网址映射提供流量管理。

负载均衡器提供以下互相排斥的主要操作:

  • 将请求路由到后端服务
  • 执行重定向

设置负载均衡器时,您可以在负载均衡器向后端服务或后端存储桶发送请求之前配置网址重写操作。

可以在网址映射的三个级别应用重写或重定向:

  • 在 pathRule 级别,当路径匹配时操作将在此级别生效
  • 在 pathMatcher 级别,当此 pathMatcher 没有匹配的路径时操作将在此级别生效
  • 在 urlMap 级别,当任何主机规则中指定的主机均不匹配时操作将在此级别生效

在 pathMatcher 中使用 routeRules 是使用 pathRules 的替代方案。pathRules 和 routeRules 不能同时出现在同一 pathMatcher 中。与顺序无关紧要的 pathRules 不同,系统会按顺序检查 routeRules。routeRule 可以测试网址路径、HTTP 标头和网址查询参数。

使用场景示例

很多使用场景都需要流量管理。本部分提供了几个概要示例。

重写

通过网址重写,您可以向外部用户提供与您的服务所用网址不同的网址。

网址重写将网址与资源分开。您可以从适合用户使用的网址(用户更容易记住和使用)转换,将其转变成适合搜索引擎使用的网址(更便于搜索引擎查找)或内部实现专用网址。

网址重写功能会执行以下操作:

  1. 读取请求中的传入网址。
  2. 替换主机和/或路径,从而在将流量定向到后端服务或后端存储桶之前转换网址。

在下图中:

  1. 一位日本用户发送了对网址 www.mydomain.com/static/images/someimage.jpg 的请求。
  2. 当请求到达外部应用负载均衡器时,负载均衡器会使用网址映射中的信息将网址重写为 www.myorigin.com/august_snapshot/images/someimage.jpg。
  3. (可选)在此示例中,网址映射将请求发送到外部后端。
使用传统版应用负载均衡器重写网址。
图 1. 使用传统版应用负载均衡器重写网址。

如需查看配置示例,请参阅重写。

重定向

通过网址重定向,您可以将客户端请求从一个网址重定向到另一个网址。

这包括以下功能:

  • 将所有 HTTP 请求重定向到 HTTPS 请求。
  • 重定向至不同的网址,此网址可通过修改网址的主机和/或路径部分,以及去掉或保留任何查询参数来形成。
  • 选择要发出的重定向响应代码。

使用网址重定可实现以下功能:

  • 提供网址缩短功能。面向客户端的网址可能会短很多。此服务将发出重定向到含长网址的网页的请求。
  • 在网页移动或过期时防止出现损坏的链接。
  • 允许属于同一所有者的多个域名引用单个网站。
  • 避免在后端服务器上配置解决方法来支持必要的重定向,因为这种工作十分繁琐且低效。
  • 缩短延迟时间。与在后端端点创建的重定向相比,在边缘创建的重定向可以缩短延迟时间。

HTTP 到 HTTPS 重定向可进一步帮助您:

  • 满足加密流量的合规性要求(例如美国《健康保险流通与责任法案》(HIPAA))。
  • 使用 HTTPS 重定向请求,而不是拒绝使用 HTTP 协议发送的请求。
  • 通过在第 7 层负载均衡器本身重定向流量(而不是在后端服务器上实现重定向)来改进应用的安全配置文件。

在下图中:

  1. 一位日本用户发送了一个 GET http://example.com/img1 请求。
  2. 根据网址映射中定义的重定向,负载均衡器会发回 HTTP/1.1 302 Found Location: https://example.com/img1 重定向,将 HTTP 请求重定向到 HTTPS 请求。
  3. 用户的浏览器会发送一个 GET https://example.com/img1 请求。
使用传统版应用负载均衡器进行网址重定向。
图 2. 使用传统版应用负载均衡器进行网址重定向。

如需查看配置示例,请参阅重定向。

支持的响应代码

下表列出了支持的重定向响应代码。

响应代码 数字 备注
MOVED_PERMANENTLY_DEFAULT 301
FOUND 302
PERMANENT_REDIRECT 308 在这种情况下,系统将保留请求方法。
TEMPORARY_REDIRECT 307 在这种情况下,系统将保留请求方法。
SEE_OTHER 303

基于标头和基于参数的路由

基于标头和基于参数的路由允许负载均衡器根据 HTTP 标头和网址查询参数做出路由决策。

借助此功能,您可以简化云架构,而无需部署额外的代理层级(例如 NGINX)来进行路由。

您可以使用外部应用负载均衡器执行以下操作:

  • A/B 测试
  • 将客户分配给在后端运行的不同服务集
  • 根据发出请求的不同设备类别提供不同的页面和体验

根据主机字符串选择 pathMatcher 之后,pathMatcher 中的 routeRules 会选择一个网址路径。如需了解详情,请参阅网址映射概览。

示例:使用基于查询参数的路由配置 A/B 测试

以下示例展示了如何通过与查询字符串匹配以指定实验和输入来进行 A/B 测试。

假设您希望确保按以下方式处理请求:

  • 含查询参数值 A 的所有请求都会转到名为 BackendServiceForProcessingOptionA 的后端服务。
  • 含查询参数值 B 的所有请求都会转到名为 BackendServiceForProcessingOptionB 的后端服务。

下表汇总了这些要求。

请求 后端服务
http://test.mydomain.com?ABTest=A BackendServiceForProcessingOptionA
http://test.mydomain.com?ABTest=B BackendServiceForProcessingOptionB

若要在全局网址映射中配置此项,您可以创建以下设置。

匹配 操作
pathMatchers[].routeRules[].matchRules[].queryParameterMatches[].name = ABTest

pathMatchers[].routeRules[].matchRules[].queryParameterMatches[].exactMatch = A
pathMatchers[].routeRules[].service = BackendServiceForProcessingOptionA
pathMatchers[].routeRules[].matchRules[].queryParameterMatches[].name = ABTest

pathMatchers[].routeRules[].matchRules[].queryParameterMatches[].exactMatch = B
pathMatchers[].routeRules[].service = BackendServiceForProcessingOptionB

如需查看配置示例,请参阅基于标头和基于参数的路由。

将请求路由到后端

流量后端通过两阶段方法确定:

  • 负载均衡器选择具有后端的后端服务。后端可以是:

    • 非代管实例组中的 Compute Engine 虚拟机实例
    • 托管式实例组 (MIG) 中的 Compute Engine 虚拟机
    • 可用区级网络端点组 (NEG) 中 Google Kubernetes Engine (GKE) 节点的容器
    • 在互联网 NEG 中 Google Cloud 之外的外部后端
    • 后端存储桶中的 Cloud Storage
    • 无服务器 NEG 中的 App Engine、Cloud Run functions 或 Cloud Run 服务

    负载均衡器根据全球网址映射中定义的规则选择后端服务。

  • 后端服务根据全球后端服务中定义的政策选择后端实例。

配置路由时,您可以选择以下模式之一:

  • 通过使用 pathRules 选择简单主机和路径测试
  • 通过使用 routeRules 选择高级请求测试

对于每个网址映射,您可以选择使用简单主机和路径规则或高级主机、路径和路由规则。这两种模式互相排斥。每个网址映射仅可包含其中一种模式。

简单主机和路径规则

在简单主机和路径规则模式下,网址映射按网址映射概览中所述的方式运行。

下图显示了简单主机和路径规则的逻辑流程。

使用简单主机和路径规则的网址映射流程。
图 3. 使用简单主机和路径规则的网址映射流程。

该流程最初会使用主机规则来评估请求。主机是由请求指定的网域。如果请求 host 与 hosts 字段中的某个条目匹配,则使用关联的路径匹配器。

接下来,该流程会评估路径匹配器。该流程按“最长路径优先匹配”顺序评估路径规则,但您可以按任意顺序指定路径规则。找到最确切的匹配后,请求将被路由到相应的后端服务。如果请求不匹配,则使用默认后端服务。

如下示例是一个典型的简单主机和路径规则,其中视频流量流向 video-backend-service,所有其他流量流向 web-backend-service。

$ gcloud compute url-maps describe ext-https-map
defaultService: global/backendServices/web-backend-service
hostRules:
- hosts:
  - '*'
  pathMatcher: pathmap
name: ext-https-map
pathMatchers:
- defaultService: global/backendServices/web-backend-service
  name: pathmap
  pathRules:
  - paths:
    - /video
    - /video/*
    service: global/backendServices/video-backend-service

如需查看配置示例,请参阅主机和路径。

高级主机、路径和路由规则

与简单主机和路径规则相比,高级主机、路径和路由规则提供了额外的配置选项。这些选项支持更高级的流量管理模式,还可修改某些语义。例如,路由规则按顺序执行(而不是使用“最长路径优先匹配”语义)。

如前面的简单主机和路径规则示例所示,您可以使用全局网址映射来配置高级流量管理,但您可使用 pathMatchers[].routeRules[] 而不使用 pathMatchers[].pathRules[]。

下面几个部分介绍了高级主机、路径和路由规则组件。

主机规则

当请求到达您的负载均衡器时,系统将根据网址映射中定义的 hostRules 对请求中的 host 字段进行评估。每个主机规则由一个或多个主机和单个路径匹配器 (pathMatcher) 组成。如果您未定义 hostRules,则该请求将路由到 defaultService。

如需了解详情,请参阅全局网址映射 API 文档中的 hostRules[] 和 defaultService。

路径匹配器

请求与主机规则匹配后,负载均衡器会评估主机所对应的路径匹配器。

路径匹配器由以下几个部分组成:

  • 一个或多个路径规则 (pathRules) 或路由规则 (routeRules)。
  • 没有其他后端服务匹配时执行的默认规则。该规则具有以下相互排斥的选项:

    • 默认服务会指定在没有其他后端服务匹配时要路由到的默认后端服务。
    • 默认重定向会指定在没有其他后端服务匹配时要重定向到的网址。

如果为默认服务配置了负载均衡器,则还可以将负载均衡器配置为在将请求发送到默认服务之前重写网址。

如需了解详情,请参阅全局网址映射 API 文档中的 pathMatchers[]、pathMatchers[].pathRules[]、pathMatchers[].routeRules[]。

路径规则

路径规则 (pathRules) 指定一个或多个网址路径,例如 / 或 /video。路径规则通常适用于之前所述的基于简单主机和路径的路由类型。

如需了解详情,请参阅全局网址映射 API 文档中的 pathRules[]。

路由规则

路由规则 (routeRules) 会与传入请求中的信息进行匹配,并根据匹配情况作出路由决策。

路由规则可以包含各种不同的匹配规则 (matchRules) 和各种不同的路由操作 (routeAction)。

匹配规则根据 HTTP(S) 请求的路径、标头和查询参数来评估传入的请求。匹配规则支持各种匹配类型(例如前缀匹配)和修饰符(例如不区分大小写)。这样,您可以实现多种操作,例如根据存在的自定义 HTTP 标头向一组后端发送 HTTP(S) 请求。

如需查看 matchRules 支持的选项的详细列表,请参阅全局网址映射 API 文档中的 matchRules[]。

如果您有多条路由规则,则负载均衡器会按顺序执行这些规则,以便您指定匹配、路由和其他操作的自定义逻辑。

在给定的路由规则中,当完成首个匹配时,负载均衡器会停止评估匹配规则,并且忽略所有剩余的匹配规则。

Google Cloud 执行以下操作:

  1. 查找与请求匹配的首个匹配规则。
  2. 停止查看任何其他匹配规则。
  3. 应用相应路由操作中的操作。

路由规则包含多个组件,如下表中所述。

路由规则组件 (API field name) 说明
优先级 (priority) 分配给指定路径匹配器中的路由规则来确定路由规则评估顺序的数字,其范围为 0-2147483647(即 (2^31)-1)。

最高优先级为 0。最低优先级为 2147483647。例如,评估时优先级为 4 的规则优先于优先级为 25 的规则。系统会应用与请求相匹配的首个规则。

优先级数字可能会存在间断;它们不需要是连续的。您不能创建具有相同优先级的多条规则。
说明 (description) 最多包含 1024 个字符的可选说明。
服务 (service) 规则相匹配时流量所指向的后端服务资源的完整或部分网址。
匹配规则 (matchRules) 根据请求进行评估的一个或多个规则。这些 matchRules 可以匹配请求的所有或部分 HTTP 特性,例如路径、HTTP 标头和查询 (GET) 参数。

在 matchRule 中,必须满足所有匹配条件才能使 routeRule 的 routeActions 生效。如果 routeRule 有多个 matchRules,则 routeRule 的 routeActions 在请求与 routeRule 的任意 matchRules 匹配时生效。
路由操作 (routeAction) 让您可指定在满足匹配规则条件时要执行的网址重写操作。
重定向操作 (urlRedirect) 您可以配置操作,以便在满足匹配规则条件时通过 HTTP 重定向进行响应。此字段不能与路由操作结合使用。

如需了解详情,请参阅全局网址映射 API 文档中的以下字段:

  • routeRules[]
  • routeRules[].priority
  • routeRules[].description
  • routeRules[].service
  • routeRules[].matchRules[]
  • routeRules[].routeAction
  • routeRules[].urlRedirect

匹配规则

匹配规则 (matchRules) 匹配请求的一个或多个特性,并执行路由规则中指定的操作。以下列表提供了一些可使用匹配规则匹配的请求特性示例:

  • 主机名:主机名是网址的域名部分;例如,网址 http://example.net/video/hd 的主机名部分为 example.net。在该请求中,主机名包含在 Host 标头中,如以下示例 curl 命令所示,其中 10.1.2.9 是经过负载均衡的 IP 地址:

    curl -v http://10.1.2.9/video/hd --header 'Host: example.com'
    
  • 路径在主机名后,例如 /images。匹配规则可以指定是需要匹配整个路径,还是只需匹配该路径的前导部分。

  • 其他 HTTP 请求参数,例如允许 Cookie 匹配的 HTTP 标头,以及基于查询参数(GET 变量)的匹配。请注意,不支持对标头值进行正则表达式匹配。

如需查看受支持匹配规则的完整列表,请参阅全局网址映射 API 文档中的 pathMatchers[].routeRules[].matchRules[]。

配置流量管理

您可以使用 Google Cloud 控制台、gcloud 或 Cloud Load Balancing API 配置流量管理。在所选的配置环境中,您可以使用 YAML 配置来设置流量管理。

如果在编写这些 YAML 文件时需要帮助,您可使用以下资源: