为 API Gateway 创建多区域部署

本教程介绍如何配置 HTTP(S) 负载均衡器,以便为 API Gateway 启用多区域部署。

创建 HTTP(S) 负载均衡器以支持 API Gateway 的多区域部署可以通过从多个区域提供服务来提高可用性并缩短服务的延迟时间。通过跨区域路由,您可以进一步缩短延迟时间并最大限度地增加正常运行时间,该路由响应离用户最近的可用区域发出的请求。

在本教程中,您将配置一个可在全球任何位置使用的非区域性网址方案,但会从最近的 API Gateway 部署响应用户请求。使用这种配置时,请求最好能够将请求路由到能够为用户提供最低延迟的区域。如果最近的区域不可用或超出容量,则请求会被路由到其他区域以确保可用性。

准备工作

在配置多区域部署之前,请按照 API Gateway 快速入门部署 Cloud Run 服务,并创建指向该服务的网关。

在本教程中,将您的服务部署到两个不同的区域。例如,您可以部署两个 API Gateway 实例:

  • my-gateway-eu 部署到欧洲的一个区域
  • my-gateway-us 部署到美国的一个区域

配置权限

在本教程中,您将在 Cloud 项目中创建一个无服务器网络端点组 (NEG) 和一个外部 HTTP(S) 负载均衡器。这需要项目 Owner 或 Editor 角色,或者以下 Compute Engine IAM 角色

任务 所需角色
创建负载均衡器和网络组件 Network Admin
创建和修改 NEG Compute Instance Admin
创建和修改 SSL 证书 Security Admin

创建 SSL 证书资源

如需创建 HTTPS 负载均衡器,必须将 SSL 证书资源添加到负载均衡器的前端。使用 Google 管理的 SSL 证书自行管理的 SSL 证书创建 SSL 证书资源。

  • Google 管理的证书。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。如需创建 Google 管理的证书,您必须拥有该网域的网域和 DNS 记录,才能预配证书。如果您还没有域名,则可以从 Google Domains 获取一个。此外,您还需要更新网域的 DNS A 记录,以指向后续步骤中创建的负载均衡器的 IP 地址。如需了解详细说明,请参阅使用 Google 管理的证书

  • 自签发证书。如果您暂时不想设置网域,则可以使用自签名 SSL 证书进行测试。

本教程假定您已创建 SSL 证书资源。

如果您想在不创建 SSL 证书资源(或 Google 管理的证书所需的网域)的情况下测试此过程,则仍然可以改用此页面中的说明来设置 HTTP 负载均衡器。

创建 HTTP(S) 负载均衡器

  1. 为每个 API Gateway 实例创建无服务器 NEG。

    网络端点组 (NEG) 为负载均衡器指定了一组后端端点。无服务器 NEG 是指向 API Gateway 等服务的后端,如下图所示:

    无服务器 NEG 作为多区域网关的后端示意图

    如需为每个网关实例创建无服务器 NEG,请运行以下命令,其中:

    • SERVERLESS_NEG_NAME 是要创建的无服务器 NEG 的名称。
    • GATEWAY_ID 指定网关的名称。
    • REGION_ID 是无服务器 NEG 的部署区域(这应与网关区域一致)。
    gcloud beta compute network-endpoint-groups create SERVERLESS_NEG_NAME \
      --region=REGION_ID \
      --network-endpoint-type=serverless \
      --serverless-deployment-platform=apigateway.googleapis.com \
      --serverless-deployment-resource=GATEWAY_ID

    例如:

    gcloud beta compute network-endpoint-groups create api-gateway-serverless-neg-eu \
      --region=europe-west1 \
      --network-endpoint-type=serverless \
      --serverless-deployment-platform=apigateway.googleapis.com \
      --serverless-deployment-resource=my-gateway-eu

    重复此命令,对第二个网关实例使用相应值,例如对 us-central1 区域中的 my-gateway-us 使用 api-gateway-serverless-neg-us,为下一个网关实例创建无服务器 NEG。

  2. 创建后端服务以定义 Cloud Load Balancing 如何分配流量。

    后端服务配置包含一组值,例如用于连接到后端的协议、各种分发和会话设置、健康检查和超时,如下图所示:

    图中显示无服务器 NEG 作为具有多个部署的后端服务的后端

    如需创建后端服务并将无服务器 NEG 作为后端添加到后端服务,请运行以下命令,其中:

    • BACKEND_SERVICE_NAME 是后端服务的名称。
    • SERVERLESS_NEG_NAME 是上一步中创建的无服务器 NEG 的名称。
    • REGION_ID 是无服务器 NEG 的部署区域(这应与网关区域一致)。
    gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --global \ 
    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --global \
      --network-endpoint-group=SERVERLESS_NEG_NAME \
      --network-endpoint-group-region=REGION_ID

    例如:

    gcloud compute backend-services add-backend api-gateway-backend-service \
      --global \
      --network-endpoint-group=api-gateway-serverless-neg-eu \
      --network-endpoint-group-region=europe-west1

    重复此命令,对第二个无服务器 NEG 使用相应值,例如对 us-central1 区域中 my-gateway-us 使用 api-gateway-serverless-neg-us,将第二个无服务器 NEG 添加到后端服务。

  3. 创建网址映射以将传入的请求路由到此后端服务,如下图所示:

    图中显示从网址映射到具有多个部署的后端服务

    要创建网址映射,请运行以下命令,其中:

    • URL_MAP_NAME 是要创建的网址映射的名称。
    • BACKEND_SERVICE_NAME 是后端服务的名称。
    gcloud compute url-maps create URL_MAP_NAME \
      --default-service BACKEND_SERVICE_NAME

    例如:

    gcloud compute url-maps create api-gateway-url-map \
      --default-service api-gateway-backend-service

    此示例网址映射仅定位到一项代表单个网关的后端服务,因此不需要主机规则或路径匹配器。如果您有多项后端服务,则可以使用主机规则根据主机名将请求定向到不同的服务。使用路径匹配器根据请求路径将请求定向到不同的服务。

    例如:

    gcloud compute url-maps add-path-matcher api-gateway-url-map \
      --path-matcher-name=my-pm2  \
      --default-service=my-host-default-backend \
      --path-rules="/video=video-service,/video/*=video-service" \
      --new-hosts my-hosts.com
    gcloud compute url-maps add-host-rule api-gateway-url-map \
      --hosts=my-app-domain \
      --path-matcher-name=my-app-path-matcher

    如需详细了解主机规则和路径匹配器,请参阅网址映射文档。

  4. 为目标代理创建 SSL 证书,如下图所示:

    图中显示具有多个部署的目标代理的 ssl 证书

    要创建 HTTPS 负载均衡器,HTTPS 目标代理需要 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。建议使用 Google 管理的证书。

    如需创建 Google 管理的证书,您必须拥有一个网域。如果您没有网域,则可以使用自签名 SSL 证书进行测试。

    如需创建 Google 管理的 SSL 证书资源,请运行以下命令:

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME
      --domains DOMAIN

    如需创建自行管理的 SSL 证书资源,请运行以下命令:

    gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
      --certificate CRT_FILE_PATH \
      --private-key KEY_FILE_PATH
  5. 创建目标 HTTP(S) 代理以将请求路由到您的网址映射,如下图所示:

    图中显示从 HTTP 代理到网址映射

    如需创建目标代理,请使用以下命令,其中:

    • TARGET_HTTP_PROXY_NAME 是要创建的目标代理的名称。
    • URL_MAP_NAME 是上一步中创建的网址映射的名称。
    • 可选:SSL_CERT_NAME 是创建的 SSL 证书的名称。
    gcloud compute target-http-proxies create TARGET_HTTP_PROXY_NAME \
      --ssl-certificates=SSL_CERT_NAME
      --url-map=URL_MAP_NAME

    例如:

    gcloud compute target-http-proxies create api-gateway-https-proxy \
      --ssl-certificates=hello-cert
      --url-map=api-gateway-url-map
  6. 创建转发规则以将传入的请求路由到相应代理,如下图所示:

    图中显示从转发规则到 HTTP 代理

    使用以下命令创建转发规则,其中:

    • HTTPS_FORWARDING_RULE_NAME 是要创建的规则的名称。
    • TARGET_HTTP_PROXY_NAME 是要创建的目标代理的名称。
    gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
      --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
      --global \
      --ports=443

    例如:

    gcloud compute forwarding-rules create my-fw \
      --target-https-proxy=api-gateway-https-proxy \
      --global \
      --ports=443

使用负载均衡器 IP 地址更新 DNS 记录

如果您有自定义网域,则需要执行此步骤来设置网域的 DNS 设置,以指向服务的新 IP 地址。如果您使用 Google 管理的证书(需要网域)创建 HTTP(S) 负载均衡器,也必须执行此步骤。与 DNS 搭配使用时,建议分配和使用静态 IP 地址。此步骤的具体说明取决于您的 DNS 提供商。

  1. 为了将流量发送到负载均衡器,您的网域的 DNS 记录(在本教程中为 my-app-domain)必须指向负载均衡器的 IP 地址。

    如需查找全局转发规则的 IP 地址,请使用以下命令:

    gcloud compute forwarding-rules list
  2. 更新网域的 DNS A 或 AAAA 记录以指向负载均衡器的 IP 地址,以便改为通过负载均衡器路由发送到现有自定义网域网址的流量。DNS 可能需要短则几秒钟,长则几小时的时间才能将此项更改传播到 DNS 服务器。

  3. 测试以确认您的网关是否使用 curl 或访问浏览器中的网址接收流量。例如:https://my-app-domain

    测试后,您应该会看到 Cloud Run 服务生成的响应。例如,这可能是“Hello World”HTML 页面,或者是由后端服务直接生成的其他预期响应。这意味着您的请求正在经过负载均衡器,并且后端服务正在指示负载均衡器将其发送到网关。

注意事项

在实现 API Gateway 的多区域部署之前,请考虑以下事项:

  1. API Gateway 目前不支持健康检查。使用上述跨区域路由配置,如果您的网关或其后端服务返回一个区域中的错误,但该区域的整体 API Gateway 基础架构可用且有容量,则您的 HTTP(S) 负载均衡器不会将流量定向到其他区域。

  2. 在一条转发规则中组合不同的区域需要高级层级价格。如需详细了解如何计算价格和用量,请参阅 Network Service Tiers 价格

最佳实践

使用多区域服务时,我们建议使用全局复制的托管式数据存储解决方案(如 Cloud Spanner)确保在全球范围内管理所有数据。