请求的路由方式

本页面介绍了来自用户的 HTTP 请求如何被送达正确的服务版本。请求可以通过以下两种方式路由:

  • App Engine 的默认路由规则,适用于网址结束于网域级别的请求。

  • 或者,您也可以使用调度文件,根据您自己的规则路由特定的网址格式。

上述方式仅适用于已部署的应用。当您在本地进行测试时,路由行为取决于您正在使用的特定运行时和开发环境。

请求和网域

App Engine 会根据传入请求的域名确定该请求的目标是否为您的应用。域名为 http://[YOUR_PROJECT_ID].appspot.com 的请求会路由到 ID 为 [YOUR_PROJECT_ID] 的应用。每个应用都会免费获得一个 appspot.com 域名。

appspot.com 网域还支持 [SUBDOMAIN]-dot-[YOUR_PROJECT_ID].appspot.com 格式的子网域,其中 [SUBDOMAIN] 可以是允许在域名的某个部分中使用的任意字符串(不包括 . 字符)。以这种方式发送到任何子网域的请求都会路由到您的应用。

您可以使用 G Suite 设置自定义顶级网域,然后将子网域分配给各种应用,例如 Google Mail 或 Google 协作平台。您也可以将 App Engine 应用与子网域相关联。如需详细了解如何将自定义网域映射到您的应用,请参阅使用 SSL 保护自定义网域

针对这些网址的请求全都会转到您配置为接收流量的应用版本。应用的每个版本也都有自己的网址,因此您可以部署并测试一个新的版本,然后再将该版本配置为接收流量。除了 appspot.com 域名之外,特定版本的网址还使用特定版本的 ID,例如:http://[VERSION_ID]-dot-[YOUR_PROJECT_ID].appspot.com。您还可以将子网域与特定版本的网址一起使用:http://[SUBDOMAIN]-dot-[VERSION_ID]-dot-[YOUR_PROJECT_ID].appspot.com。如需了解详细信息和示例,请参阅通过网址路由

用于请求的域名包含在传递给应用的请求数据中。因此,您可以使用请求数据来控制您的应用如何根据请求中的域名进行响应。例如,如果您想要重定向到一个官方网域,可以将应用编码为先检查 Host 请求标头,然后根据域名作出相应响应。

通过网址路由

您可以定位特异性程度不同的 HTTP 请求。在以下示例中,appspot.com 可以替换为您的应用的自定义网域(如果有)。网址子字符串 [VERSION_ID][SERVICE_ID][MY_PROJECT_ID] 分别代表应用的相应资源 ID。

提示:您可以使用以下工具检索应用的资源 ID:

控制台

在 GCP Console 中,您可以查看相应的实例服务版本页面。

gcloud

运行 gcloud app instances list 命令可以列出特定 GCP 项目中的资源 ID。

API

如需以编程方式检索资源 ID,请参阅 Admin API 中的 list 方法

默认路由

以下网址格式具有默认路由行为。请注意,如果您在调度文件中定义了匹配格式,则默认路由将被替换:

  • default 服务的可用实例发送请求:
    https://[MY_PROJECT_ID].appspot.com
    http://[MY_CUSTOM_DOMAIN]

    default 服务中的流量配置的任何版本都会收到请求。

  • 向特定服务的可用实例发送请求:
    https://[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[SERVICE_ID].[MY_CUSTOM_DOMAIN]

    为所定位服务中的流量配置的任何版本都会收到请求。如果您定位的服务不存在,则系统会对请求进行软路由

  • default 服务中特定版本的可用实例发送请求:
    https://[VERSION_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[VERSION_ID].[MY_CUSTOM_DOMAIN]

    如果未定位服务,请求会发送到 default 服务。

软路由

如果一个请求与主机名的 [YOUR_PROJECT_ID].appspot.com 部分匹配,但包含不存在的服务、版本或实例名称,则该请求会被路由到 default 服务。软路由不适用于自定义网域;如果主机名无效,对于发送到自定义网域的请求,将返回 HTTP 404 状态代码。

定位路由

如果以下网址格式存在,那么这些网址格式必定可以被路由到其目标。您在调度文件中定义的格式永远不会拦截和重新路由这些请求:

  • 向特定服务和版本的可用实例发送请求:
    https://[VERSION_ID]-dot-[SERVICE_ID]-dot-[MY_PROJECT_ID].appspot.com
    http://[VERSION_ID].[SERVICE_ID].[MY_PROJECT_ID].[MY_CUSTOM_DOMAIN]

默认服务

在向 App Engine 部署应用的初始版本时,系统会创建 default 服务。未指定服务或指定了无效服务的请求将路由到 default 服务。然后,这些请求将由您已配置为接收 default 服务中的流量的版本进行处理。您可以在 GCP Console 的“版本”页面查看哪些版本被配置为接收流量。

示例

为了便于演示网址格式,假设存在一个 ID 为 requestsProject 的示例 GCP 项目,并且该项目包含一个正在运行两个服务和版本的应用。示例应用的 default 服务包含版本 vFrontend,第二个服务 service2 包含版本 vBackend

要定位特定服务和版本,您可以使用以下网址格式:

  1. 要使用 HTTPS 定位 default 服务中的版本,您可以使用以下网址格式:

    https://vFrontend-dot-default-dot-requestsProject.appspot.com
    https://vFrontend-dot-requestsProject.appspot.com
    
  2. 要使用不带 HTTPS 的自定义网域来定位 vBackend 版本,您可以使用以下网址格式:

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

    其中 requestsProject.appspot.com 会映射到 example.net 网域。

使用调度文件进行路由

对于使用前文所述格式的网址,您可以创建一个调度文件来替换 App Engine 的路由规则,并自行定义路由规则。使用调度文件,您可以根据传入请求网址中的路径或主机名将请求发送到特定服务。

如需详细了解如何创建调度文件,请参阅 dispatch.yaml 参考文档。

创建调度文件

调度文件应与其他配置文件(例如 app.yaml)位于同一目录中。您最多可以在调度文件中定义 20 条路由规则,每条规则均包含 serviceurl 元素。

例如,您可以创建一个调度文件,将诸如 http://simple-sample.appspot.com/mobile/ 的移动请求路由到移动前端,并将诸如 http://simple-sample.appspot.com/work/ 的工作器请求路由到静态后端:

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

如需详细了解如何定义 dispatch.yaml,请参阅 dispatch.yaml 参考文档

部署调度文件

dispatch.yaml 文件可位于源代码目录中的任何位置。

要在不改变当前所用版本的情况下部署调度配置文件,请在包含调度文件的目录中使用下列某个命令(具体取决于您的环境):

gcloud

gcloud app deploy dispatch.yaml

Maven

mvn appengine:deployDispatch dispatch.yaml

Gradle

gradle appengineDeployDispatch dispatch.yaml

IDE

如果您使用 IntelliJEclipse,则可以使用部署表单来选择要部署的各个配置文件。