配置文件

服务的每个版本都在 .yaml 文件中定义,此文件提供相应服务和版本的名称。YAML 文件通常与其定义的服务同名,但这不是必需的。如果您要部署一项服务的多个版本,则可以在同一目录中创建多个 yaml 文件,每个文件对应一个版本。

通常,您可以为每项服务创建一个目录,以包含相应服务的 YAML 文件和关联的源代码。可选的应用级配置文件(dispatch.yamlcron.yamlindex.yamlqueue.yaml)包含在顶级应用目录中。以下示例展示了三项服务。在 service1service2 中,源文件与 YAML 文件处于同一级别。在 service3 中,有两个版本的 YAML 文件。

YAML 服务的层次结构图

对于小型简单项目,应用的所有文件都可以位于一个目录中:

小型 YAML 服务的层次结构图

每个 YAML 文件都必须包含版本参数。如需定义默认服务,您可以在文件中明确声明参数 service: default 或者不作声明。

每项服务的配置文件都定义了特定服务/版本的扩缩类型和实例类别。使用的扩缩参数取决于您指定的扩缩类型。如果未指定扩缩类型,则默认为自动扩缩。appengine-web.xml 参考文档部分介绍了扩缩和实例类别设置。

对于每项服务,您还可以指定相应设置,以将网址请求映射到特定脚本以及识别静态文件,进而提高服务器效率。这些设置也包含在 yaml 文件中,并在 appengine-web.xml 参考文档部分进行了说明。

默认服务

每个应用都有一项默认服务。您可以在 appengine-web.xml 中使用 service: default 设置定义默认服务,但并不强制要求这样做。与服务相关的所有配置参数都可以应用于默认服务。

可选配置文件

以下配置文件可以对应用于应用中所有服务的可选功能进行控制:

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

要将这些配置文件的更新部署到 App Engine,请从这些文件所在的目录中运行以下命令:

    gcloud app deploy [CONFIG_FILE]

示例

以下示例演示了如何为拥有两项服务的应用配置各种 WAR 目录结构的文件:一项服务为处理 Web 请求的默认服务,另一项为用于后端处理的服务(名为 my-service)。

假设顶级 EAR 目录是“my-application”,请定义文件 my-application/META-INF/appengine-application.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-application xmlns="http://appengine.google.com/ns/1.0">
  <application>my-application</application>
</appengine-application>

my-application/defaultmy-application/my-service 这两个服务创建 WAR 目录。

现在,在每个指定服务参数的 WAR 文件中创建一个 appengine-web.xml 文件。该文件必须包含该服务的版本名称。如需定义默认服务,您可以在文件中明确声明参数 <service>default</service> 或者不作声明。以下是定义默认服务的文件 my-application/default/WEB-INF/appengine-web.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>my-application</application>
  <module>default</module>
  <version>uno</version>
  <threadsafe>true</threadsafe>
</appengine-web-app>

文件 my-application/my-service/WEB-INF/appengine-web.xml 定义将处理后台请求的服务:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>my-application</application>
  <module>my-service</module>
  <version>uno</version>
  <threadsafe>true</threadsafe>
  <manual-scaling>
    <instances>5</instances>
  </manual-scaling>
</appengine-web-app>

最后,定义用于枚举服务的文件 my-application/META-INF/application.xml。请注意,默认服务应该是列出的首项服务。

<?xml version="1.0"
encoding="UTF-8"?>

<application
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/application_5.xsd"
  version="5">

  <description>GAE Java SuperFun app</description>
  <display-name>SuperFun</display-name>

  <!-- Services -->
  <!-- The default service should be listed first -->
  <module>
    <web>
      <web-uri>default</web-uri>
      <context-root>default</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>my-service</web-uri>
      <context-root>my-service</context-root>
    </web>
  </module>

</application>

App Engine 将忽略 <context-root> 元素,因此 HTTP 客户端在为服务指定网址时无需将此类元素添加到网址路径之前。