Java 8 运行时不包括任何 Web 服务框架。唯一的要求是,您的应用应在端口 8080 上侦听和响应。此处的示例代码演示了如何将您自己的框架(例如 Spring Boot)添加到 Java 8 运行时。
前提条件
开始开发之前,请下载最新版本的 Google Cloud CLI,或将您的 gcloud CLI 更新至最新版本:
gcloud components update
如需使用 Maven 进行部署,您需要将 App Engine Maven 插件添加到
pom.xml
中,如下所示:<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>appengine-maven-plugin</artifactId> <version>2.7.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-appengine/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'
下表列出了可用于启用、停用或配置各种功能的环境变量。
环境变量 | 说明 | 类型 | 默认 |
---|---|---|---|
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 服务。目前,您可以使用 Datastore、Pub/Sub 和 Bigtable 模拟器。在运行应用之前,请使用 gcloud
命令启动它们:
gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start
部署应用
完成配置后,您可以使用 Google Cloud CLI 部署包含 app.yaml
文件和 JAR 的目录,相应的命令如下:
gcloud app deploy app.yaml
如果您要使用任何可选配置文件(index.yaml
、cron.yaml
和 dispatch.yaml
),请务必使用 gcloud
命令单独进行部署。例如:
gcloud app deploy cron.yaml
Maven
使用 Maven 部署应用:
mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID
将 PROJECT_ID 替换为您的 Google 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 运行时。请参阅构建自定义运行时。