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.0.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 Stackdriver Debugger 布尔值 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 服务。目前,您可以使用 Cloud DatastoreCloud PubSubCloud Bigtable 模拟器。在运行应用之前,请先使用 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 appengine:deploy

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 运行时。请参阅构建自定义运行时