在 App Engine 中构建 Web 服务

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

本指南介绍了如何设计 App Engine 应用的服务和相关资源的结构。

目录结构

App Engine 服务的每个版本均在 app.yaml 配置文件中定义。对于简单应用,最低部署要求是定义一个 app.yaml 文件。app.yaml 文件充当部署描述符,并为特定版本的服务定义扩缩类型以及运行时环境、处理程序和其他资源设置。如果需要部署一项服务的多个版本,可以在同一目录中创建多个 YAML 文件,分别表示每个版本的配置。

在本地开发应用时,您可以在应用的根目录中为每项服务单独创建目录。如果您将应用托管在 GitHub 等版本控制系统 (VCS) 之外,还可以将应用的结构设计为在代码库中使用单独的目录,或者为每项服务使用单独的代码库。每个目录或代码库应代表单项服务,并包含该服务的 app.yaml 文件以及关联的源代码。

您可以选择为每个服务的 app.yaml 文件指定唯一的名称。例如,您可以使用服务的名称来命名配置文件,或使用唯一名称来表示该特定服务的每个版本,例如 service1.yamlapp.standard.yaml

其他可选配置文件应位于应用的 default 服务的根目录或代码库中。这些可选配置文件采用整个应用通用(而非针对特定服务)的设置,包括 dispatch.yamlindex.yamlcron.yaml 文件。

示例

简单的应用只需要将 app.yaml 添加到应用源文件所在的位置。单服务应用仅包含 default 服务,并且所有文件可位于该应用根目录下的同一目录中:

单个 YAML 服务的层次结构图

以下示例演示了如何在本地开发应用时设计包含三项服务的应用的结构。可选的 dispatch.yaml 文件已添加到该应用的根目录中。在根目录下还有三个目录,分别对应于应用的每项服务。service1 的子目录包含该服务的源文件和配置文件。同样,service2service3 均位于独立的目录中,这些目录分别包含对应服务的文件,而 service3 包含 YAML 配置文件的两个版本:

YAML 服务的层次结构图

在以下示例中,单个服务包含可选的 dispatch.yaml 文件和两个配置文件,这两个配置文件分别代表该服务的不同版本 service1.yamlservice2.yaml

小型 YAML 服务的层次结构图

为保证实例正常运行的设计注意事项

硬件或软件故障可能会毫无征兆地出现,导致实例提前终止或频繁重启,这些故障可能需要相当长的时间才能解决。 您的应用应该能够应对此类故障。

以下实用策略可帮助您避免因实例重启带来的停机时间:

  • 减少重启实例或启动新实例所需的时间。
  • 对于长时间运行的计算,应定期创建检查点,确保您可以从该状态继续。
  • 您的应用应该是“无状态”的,实例上不存储任何内容。
  • 使用队列来执行异步任务。
  • 将实例配置为手动扩缩时,需执行以下操作:
    • 在多个实例间使用负载均衡。
    • 除了处理正常流量所需的实例以外,再多配置一些实例。
    • 编写回退逻辑,以便在手动扩缩实例不可用时使用缓存结果。

如需详细了解实例,请参阅实例的管理方式

default 服务

每个 App Engine 应用都包含一项 default 服务。您必须先将应用的初始版本部署到 default 服务,然后才能为应用创建和部署其他服务。

您可以视需要在 app.yaml 中使用 service: default 设置定义默认服务。

如果您使用 Java 和旧版捆绑服务,则可以在包含 <service>default</service> 设置的 appengine-web.xml 中指定默认服务。

使用 Google Cloud 项目发送到您的应用的请求会发送到 default 服务,例如 https://PROJECT_ID.REGION_ID.r.appspot.com。如需详细了解如何定位到其他服务,请参阅在服务之间通信

可选配置文件

以下配置文件可以控制适用于个别应用中所有服务的可选功能。如需详细了解每个可选功能,请参阅以下主题:

  • cron.yaml 配置在规定的时间或按固定时间间隔运行的计划任务。
  • dispatch.yaml 可以凌越路由默认规则,方法是根据网址中的路径或主机名将传入的请求发送到特定服务。
  • index.yaml 指定使用 Datastore 查询时您的应用需要哪些索引。

文件名

App Engine 在容器中运行应用,并在最新的 Ubuntu Linux 发行版上运行。您在 App Engine 标准环境中使用的文件名必须与 UTF-8 兼容,要么使用 UTF-8 编码,要么使用可以安全自动转换为 UTF-8 的编码方式。如果您的文件名使用不同的编码,请从具有与 UTF-8 兼容的文件名语言设置的机器部署应用。

如果文件名与 UTF-8 不兼容,则部署将失败。请注意,您在文件中使用的字符编码没有限制。

数据和文件存储注意事项

您可以从 App Engine 轻松访问其他 Google Cloud服务,例如 DatastoreCloud SQLCloud Storage

您也可以选择使用外部数据库或第三方数据库,但前提是该数据库受您的语言支持,并且可从您的 App Engine 实例访问。

如需详细了解如何在 Google Cloud 中或在外部存储文件,请参阅了解数据和文件存储

您还可以选择如何传送静态内容。您可以直接从 App Engine 中的应用本身传送其静态内容、在 Google Cloud 产品(如 Cloud Storage)上托管您的静态内容,也可以使用第三方内容分发网络 (CDN)。如需详细了解如何传送静态内容,请参阅传送静态文件

后续步骤

如果您使用多项服务并希望将它们一起部署,请参阅部署多项服务的步骤。