Java 8 运行时

Java 8 运行时不包括任何网络服务框架。 唯一的要求是,您的应用应在端口 8080 上侦听和响应。 此处的样本代码演示了如何将您自己的框架(例如 Spring Boot)添加到 Java 8 运行时。

前提条件

  • 开始开发之前,请下载最新版本的 Google Cloud SDK,或将您的 Cloud SDK 更新为最新版本:

    gcloud components update
    
  • 如要使用 Maven 进行部署,您需要将 App Engine Maven 插件添加到您的 pom.xml

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.2.0</version>
    </plugin>

    您还可以使用 gcloud app deploy 命令或 App Engine Gradle 插件等其他部署选项。

  • 按照针对应用框架的说明配置可执行 JAR 文件的构建。此可执行 JAR 必须通过 java -jar app.jar 运行。如要查看示例,请参阅 Spring Boot 文档。

整理文件

开发文件的层次结构应如下所示:

MyDir/
  pom.xml
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      Dockerfile
    java/
      com.example.mycode/
        MyCode.java

app.yaml

app.yaml 文件是必须的。定义如下所示的文件:

runtime: java
env: flex

通过指定 runtime: java,在部署 JAR (*.jar) 文件时会自动选择运行时映像 gcr.io/google-appenine/openjdk:8

要选择 JDK 版本,请使用 runtime_config.jdk 字段。

runtime: java
env: flex
runtime_config:
  jdk: openjdk8

您可以在使用 app.yaml 中找到其他 app.yaml 设置。

可选文件

以下配置文件为可选项:

将这些文件放置在 MyDir 的顶层。如果要使用其中的任何文件,您必须使用 gcloud app deploy 命令对其进行单独部署。

默认入口点

OpenJDK 8 映像的入口点是 docker-entrypoint.bash,它处理传递的命令行参数以查找默认命令(java)的可执行替代方案或参数。

如果映像的第一个参数不是可执行文件,则隐式添加 java 命令。例如:

$ docker run openjdk -jar /usr/share/someapplication.jar

如果映像的第一个参数是可执行文件(如 bash),则运行该命令。

例如,您可以使用以下命令运行 shell:

> docker run -it --rm openjdk bash
root@c7b35e88ff93:/#

环境变量

使用 app.yaml 文件中的 env_variables 键设置环境变量。例如:

env_variables:
   MY_VAR_COLOR: 'blue'

下表列出了可用于启用、停用或配置各种功能的环境变量。

环境变量 说明 类型 默认
DBG_ENABLE 云端调试器 布尔值 true
TMPDIR 临时目录 dirname
JAVA_TMP_OPTS JVM 临时目录参数 JVM 参数 -Djava.io.tmpdir=${TMPDIR}
GAE_MEMORY_MB 可用内存 大小 由 Google App Engine 或 /proc/meminfo-400M 设置
HEAP_SIZE_RATIO 堆内存 百分比 80
HEAP_SIZE_MB 可用堆 大小 ${GAE_MEMORY_MB}${HEAP_SIZE_RATIO}%
JAVA_HEAP_OPTS JVM 堆参数 JVM 参数 -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M
JAVA_GC_OPTS JVM GC 参数 JVM 参数 -XX:+UseG1GC plus 配置
JAVA_USER_OPTS JVM 其他参数 JVM 参数
JAVA_OPTS JVM 参数 JVM 参数 如下所示
SHUTDOWN_LOGGING_THREAD_DUMP 关闭线程转储 布尔值 false
SHUTDOWN_LOGGING_HEAP_INFO 关闭堆信息 布尔值 false
SHUTDOWN_LOGGING_SAMPLE_THRESHOLD 关闭采样 百分比 100

如果未明确设置,则 JAVA_OPTS 默认设为 JAVA_OPTS:=-showversion \ ${JAVA_TMP_OPTS} \ ${DBG_AGENT} \ ${JAVA_HEAP_OPTS} \ ${JAVA_GC_OPTS} \ ${JAVA_USER_OPTS}

命令行得到有效执行(其中 $@ 是传递到 docker 入口点的参数):

java $JAVA_OPTS "$@"

本地测试

要构建应用,您可以使用:

mvn package

然后使用 java 命令行运行该命令:

java -jar target/myjar.jar

或者,您可以按照针对应用框架的相关说明进行操作,以在本地运行应用。

当您在本地环境进行测试时,可能更倾向于使用模拟的 Google Cloud 服务,而非远程 Google Cloud 服务。 目前,您可以使用 DatastorePub/SubBigtable 模拟器。在运行应用之前,请使用 gcloud 命令启动它们:

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

部署应用

完成配置后,您可以使用 Google Cloud SDK 部署包含 app.yaml 文件和 JAR 的目录,方法如下:

gcloud app deploy app.yaml

如果您要使用任何可选配置文件(index.yamlcron.yamldispatch.yaml),请务必使用 gcloud 命令单独进行部署。例如:

gcloud app deploy cron.yaml

Maven

使用 Maven 部署应用:

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

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

Gradle

使用 Gradle 部署应用:

gradle appengineDeploy

自定义 Java 8 运行时

在向 Java 8 运行时中部署应用时,您不需要使用 Dockerfile。不过,如果您的应用需要额外配置,那么您可以明确提供 Dockerfile,以自定义 Java 运行时。

如果要将此映像用作自定义运行时的基础,则可以在 app.yaml 文件中指定 runtime: custom,然后按如下所示写入 Dockerfile:

FROM gcr.io/google-appengine/openjdk:8
COPY your-application.jar $APP_DESTINATION

这些命令行会在 Docker 容器的正确位置添加 JAR。

您可以将其他指令添加到 Dockerfile,以自定义 Java 运行时。请参阅构建自定义运行时