将服务从标准环境迁移到柔性环境

App Engine 柔性环境并不提供 App Engine SDK 中的 API 库。如果您决定将应用从 App Engine 标准环境迁移到柔性环境,则必须更新代码,以使用所有 Google Cloud Platform 环境通用的服务和 API。

如需了解如何将特定服务和 API 从标准环境迁移到柔性环境,请参阅下文。

标准环境与柔性环境的区别

此处概述的主要区别之外,具有 /_ah/ 的路径在柔性环境中不会被屏蔽。如果标准环境中运行的应用使用包含 /_ah/ 的路径访问特定服务,请参阅下文相应部分。

应用身份

在柔性环境中运行应用时,您可以结合使用环境变量Google Compute Engine 元数据服务来获取应用的相关信息:

应用信息 访问方式
应用/项目 ID 元数据服务器中的 GOOGLE_CLOUD_PROJECT 环境变量或 /project/project-id 资源
默认主机名 App Engine Admin API apps.get方法
服务帐号名称 元数据服务器中的 /instance/service-accounts 资源
OAuth 2.0 访问令牌 元数据服务器中的 /instances/service-accounts 资源。请参阅 Compute Engine 的使用服务帐号凭据进行身份验证文档

以下功能不能直接使用:

  • 项目未设置默认的 Cloud Storage 存储分区。如需在应用中使用存储分区,您可以创建 Cloud Storage 存储分区,并用项目 ID 作为存储分区名称。然后,在应用中便可使用 GOOGLE_CLOUD_PROJECT 环境变量作为存储分区名称。
  • 您不能使用默认服务帐号签署 blob。要解决此问题,您可以使用 Google Identity and Access Management (IAM) API 或者在部署应用时为其提供服务帐号私钥。
  • 同样,没有内置 API 供您获取验证签名所需的公共证书。不过,每个服务帐号的公共证书都可以在 https://www.googleapis.com/robot/v1/metadata/x509/{service account email} 上找到。
  • App Engine SystemProperty API 不适用于 App Engine 柔性环境。不过,您可以按照定义环境变量中的说明设置 app.yaml 中的环境变量,并使用 System.env 获取值。

后台线程

由于柔性环境没有沙盒限制,所以您可以随意创建在请求环境之外执行的线程或进程。为此,通常您只需要借助所使用语言的内置线程或多进程工具。

Blobstore

无论是在标准环境还是柔性环境中,Cloud Storage 都已经基本取代了 Blobstore 服务。您可以使用 Google Cloud 客户端库在 Cloud Storage 中存储和检索数据。

如需了解详情,请参阅以下指南:

Capabilities

在标准环境之外,不存在与 Capabilities 服务类似的功能。

Websocket

App Engine 柔性环境支持 websocket。有关详情,请参阅以下指南:

Datastore

您可以随时随地使用 Datastore API 访问 Datastore,也可以使用 Google Cloud 客户端库在 Datastore 中存储和检索数据。

不论您是使用 App Engine 库、Google Cloud 客户端库,还是直接调用 API,所访问的都是同样的 Datastore 数据。

如需了解详情,请参阅以下指南:

图片

图片服务在标准环境之外不可用。 不过,您可以直接从应用或 Cloud Storage 传送图片。

如果您需要处理图片,可以安装并使用任意图片处理库,例如 ImageJ2imgscalrthumbnailator

图片服务还可通过一个传送网址重新调整图片大小,以免应用需要处理此类动态请求。如果您想实现类似功能,可以提前重新调整图片大小,并将其上传到 Cloud Storage 以供传送。或者,您也可以使用具有调整图片大小功能的第三方内容分发网络 (CDN) 服务。

如需更多资源,请参阅以下指南:

日志记录

与标准环境一样,柔性环境也会自动进行日志记录。不过,日志会以不同的格式收集。日志不会被请求捆绑,并且来自 stdoutstderr 的日志是分开收集的。

如果您想要进一步控制应用日志记录,并希望能对日志进行分组以及记录其他元数据,可以直接将 Cloud Logging API 与 Google Cloud 客户端库搭配使用。

如需了解详情,请参阅以下指南:

Mail

App Engine 邮件服务在标准环境之外不可用。 您将需要使用第三方邮件提供程序(例如 SendGridMailgunMailjet)发送电子邮件。所有这些服务都提供可从在任意位置运行的应用发送电子邮件的 API。

以下指南介绍了如何在柔性环境中使用相关服务:

Memcache

Memcache 服务在 App Engine 柔性环境中不可用。如需缓存应用数据,请使用 Memorystore for Redis

模块

Modules API 在标准环境之外不可用。不过,您可以结合使用环境变量App Engine Admin API 来获取应用中正在运行的服务的相关信息并修改这些服务:

服务信息 访问方式
当前服务名称 GAE_SERVICE 环境变量
当前服务版本 GAE_VERSION 环境变量
当前实例 ID GAE_INSTANCE 环境变量
默认主机名 App Engine Admin API apps.get方法
服务列表 App Engine Admin API apps.services.list方法
服务版本的列表 App Engine Admin API apps.services.versions.list方法
默认的服务版本,包括流量拆分设置(如果有) App Engine Admin API apps.services.get方法
正在运行的某版本实例的列表 App Engine Admin API apps.services.versions.instances.list方法

您还可以使用 App Engine Admin API 部署管理应用中的服务和版本。

命名空间

在标准环境之外,只有 Datastore 直接支持多租户。对于其他服务,您需要手动处理多租户。如需实现完全隔离的服务实例,您可以使用 Cloud Resource Manager API 以编程方式创建新项目,并访问不同项目的资源。

OAuth

OAuth 服务在柔性环境中不可用。如果您需要验证 OAuth 2.0 令牌,可以使用 OAuth 2.0 APIoauth2.tokeninfo 方法进行验证。

Remote

Remote API 服务不适用于柔性环境。大多数支持性服务(如 Datastore),凡可从柔性环境访问,则也可从任何地方访问。

Search 服务目前在标准环境之外不可用。您可以托管任何全文搜索数据库(如 Google Compute Engine 上的 ElasticSearch),并在标准环境和柔性环境中对其进行访问。

套接字

柔性环境没有沙盒限制,您可以正常打开和使用出站套接字。

Task Queue

要在第一代标准环境之外使用推送 Task Queue 服务,您可以使用 Cloud Tasks

在可能使用拉取队列(如由单独工作器拉取和处理的队列任务或消息)的许多情况中,您可以使用 Cloud Pub/Sub 作为备用选择,此工具能提供类似功能,保证送达。

URL Fetch

URL Fetch 服务在柔性环境中不可用。不过,由于不存在沙盒限制,因此您的应用可以使用任何 HTTP 库来实现 URL Fetch 功能。我们建议使用 Java 版 Google HTTP 客户端库OkHttp

用户

用户服务在标准环境之外不可用。 在柔性环境中,您可以使用基于 HTTP 的任何身份验证机制,例如:

请注意,由于用户服务不可用,因此无法使用 appengine-web.xml。 来实现只有管理员可访问网址的设置。您需要在应用内处理此逻辑。

后续步骤

如需简要了解柔性环境与标准环境的主要区别以及针对使用这两种环境的应用的指南,请参阅适用于 App Engine 标准环境用户的 App Engine 柔性环境