部署 Java 应用

部署应用,以便将应用上传到 App Engine 并在 App Engine 上运行应用。部署应用时,您可以在 App Engine 中创建这些应用的版本及其对应的服务。您可以部署整个应用(包括所有源代码和配置文件),也可以部署和更新单个版本或配置文件

要以编程方式部署应用,请使用 Admin API

准备工作

在部署应用之前,请做好以下准备:

要使用 Maven 构建工具部署应用,您必须将项目设置为使用 App Engine Maven 插件

安装 gcloud CLI

如需使用 gcloud CLI 部署应用,您必须下载、安装并初始化 gcloud CLI

下载 SDK

如果您已安装 gcloud CLI,并且想要将其配置为使用其他 Google Cloud 项目 ID 而不是初始化时设置的 Google Cloud 项目 ID,请参阅管理 gcloud CLI 配置

使用代理

如果您从使用 HTTP 或 HTTPS 代理的系统运行部署命令,则必须配置该工具,以使其可以通过代理通信。

运行以下命令以配置 gcloud CLI:

gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]

您还可以为代理设置 usernamepassword。如需了解详情,请参阅 gcloud config

部署应用

如需将应用部署到 App Engine,请在应用的根目录中使用 Maven 构建工具(推荐)或 gcloud app deploy 命令。

如需使用 Maven 构建工具部署您的应用,请从您项目的顶级目录(pom.xml 文件所在的位置)中运行以下命令:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

PROJECT_ID 替换为您的 Google Cloud 项目的 ID。 如果您的 pom.xml 文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId 属性。

使用 gcloud 命令行

  gcloud app deploy [CONFIGURATION_FILES]

[CONFIGURATION_FILES] 替换为一个或多个配置文件的路径。 使用单个空格来分隔路径名。

可选标志:

  • --version:指定自定义版本 ID。如果您未指定版本 ID,App Engine 会生成一个版本 ID。
  • --no-promote:部署您的应用,而不自动将所有流量路由到该版本。默认情况下,您部署的每个版本都会自动配置为接收 100% 的流量。
  • --project:为您在 gcloud CLI 中初始化为默认值的 Google Cloud 项目 ID 指定一个备用 Google Cloud 项目 ID。

如需了解有关详情,请参阅 gcloud app deploy 参考文档或从命令行运行 gcloud help

选择唯一的版本 ID

对于手动扩缩的实例,版本的 ID 应该以字母开头,以与数字实例 ID 区分开。这可以确保将请求路由到正确的目标,并避免网址格式(如 123-dot-my-service.[REGION_ID].r.appspot.com)造成的歧义,此类网址格式可通过两种方式解释:

  • 如果版本 123 已存在,则请求将路由到 my-service 服务的版本 123
  • 如果版本 123 不存在,则请求将路由到运行 my-service 服务的实例 ID 123

对于配置为自动扩缩或基本扩缩的实例,您可以根据需要命名您的版本,因为系统不支持定位此类实例

部署多个服务应用

当您的应用被分解为多项服务时,您可以单独部署和更新目标服务,也可以同时部署和更新所有服务。部署服务更新可能包括更新单个配置文件或更新相应版本中的源代码。

例如,您可以在 App Engine 中部署和创建两个版本,其中每个版本都在各自的服务中运行。第一个版本用作前端服务,另一个版本用作应用的后端。然后,您可以部署单独的配置文件以仅更新服务的设置。您还可以选择将新版本部署到服务,以便同时更新前端和/或后端的源代码。

多项服务的要求

您可以使用相同的部署命令来部署和更新应用的多项服务,但需要满足以下要求:

  • 您必须先将应用的某个版本部署到 default 服务,然后才能创建和部署后续服务。

  • 您必须在相应版本的 appengine-web.xml 配置文件中指定服务的 ID。如需指定服务 ID,请在每个配置文件中添加 module: [YOUR_SERVICE_ID] 元素定义。如果没有在配置文件中添加此元素定义,则该版本默认部署到 default 服务。

  • 您必须在部署命令中指定所有相应的 appengine-web.xml 配置文件,才能同时部署多项服务。必须首先列出 default 服务。

部署多项服务

从配置文件所在的应用根目录中,运行部署命令并为每项服务的 appengine-web.xml 文件指定相对路径和文件名。

使用 Maven 构建工具

如果项目的根目录仅包含您的服务,您可以使用单个 Maven 命令来部署所有这些服务。

Maven 部署命令会遍历项目的所有服务以查找其配置文件,然后部署各项服务。

如需使用 Maven 插件部署多项服务,请执行以下操作:

  1. 确保已将 appengine-maven-plugin 添加到父级 pom.xml 文件中。
  2. 运行以下命令:

    mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

    PROJECT_ID 替换为您的 Google Cloud 项目的 ID。 如果您的 pom.xml 文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId 属性。

使用 gcloud

    gcloud app deploy [CONFIGURATION_FILES]

[CONFIGURATION_FILES] 替换为一个或多个配置文件的路径。 使用单个空格来分隔路径名。

每项服务成功部署后,您将通过命令行收到验证。

查看构建日志

Cloud Build 会流式传输构建日志和部署日志,您可以在 Google Cloud 控制台的 Cloud Build 历史记录部分查看这些日志。要查看应用所在区域中的构建,请使用页面顶部的区域下拉菜单选择要作为过滤条件的区域。

更新索引

如需创建或更新应用使用的索引,请将 datastore-indexes.xml 配置文件上传到 Datastore。上传该配置文件之后,系统将创建尚不存在的索引。

Datastore 可能需要一段时间才能创建所有索引,因此 App Engine 无法立即使用这些索引。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。

为避免异常,您必须留出时间来构建所有索引,例如:

如需详细了解索引,请参阅配置数据存储区索引

问题排查

下面是您可能会遇到的常见错误消息:

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
如果 Google Cloud 项目不包含所需的 App Engine 应用,则 gcloud app deploy 命令在尝试运行 gcloud app create 命令时可能会失败。只有拥有 Owner 角色的账号才具备创建 App Engine 应用所需的权限。
Command not found
如需了解如何设置本地开发服务器工具,请参阅使用本地开发服务器
Import Error
如果您同时安装了 gcloud CLI 以及初始版本 App Engine SDK,则 PATH 的条目可能会相互冲突并造成导入错误。如果您在运行 gcloud CLI 命令时收到错误,请按照运行本地开发服务器的说明进行操作。
[400] The first service (module) you upload to a new application must be the 'default' service (module)
您必须先部署并创建 default 服务,然后才能部署并创建应用的多项服务。如需详细了解如何将版本部署到 default 服务,请参阅部署多个服务应用
Too Many Versions (403)
App Engine 对应用的已部署版本数量设定了限制。针对免费应用和已部署应用的限制有所不同。您可以使用 Google Cloud 控制台删除旧版本,然后上传最新代码。 You do not have permission to modify this app (403)
经过身份验证的账号没有权限部署到您的命令或 appengine-web.xml 中指定的应用 ID 时,就会发生这种情况。请检查您的应用 ID 是否准确,以及该 ID 是否与您的 Google Cloud 控制台项目 ID 的值相匹配。接下来,请检查控制台中的项目权限,并验证您的账号是否拥有足以部署应用的权限级别
[13] An internal error occurred while creating a Cloud Storage bucket.

App Engine 将代表您在应用创建的同一区域中创建默认的 Cloud Storage 多区域存储桶。此存储桶是存储应用内容所必需的。无法创建此存储桶时,在以下情况下会返回此错误:

[13] An internal error occurred

如果 App Engine 的 app.yaml 配置文件在 vpc_access_connector 键下包含无效资源 name,则可能会发生此错误。确定 name 字段包含在其中创建了无服务器 VPC 访问通道连接器的正确项目和区域。

如果在确保 app.yaml 配置有效后此问题仍然存在,请使用 Google Cloud SDK 重新部署您的服务,添加 --verbosity=debug 标志,然后联系 Cloud 支持团队并提供该命令的输出。

其他部署错误

如果部署失败,请确保 Cloud Build API 已在项目中启用。App Engine 会在您首次部署应用时自动启用此 API,但如果有人停用了 API,则部署将失败。

后续步骤