Deploying to Google Cloud Platform (GCP)

Prerequisites

如要完成本指南,您需要:

  • Roughly 15 minutes

  • An IDE

  • 安装了 JDK 17+,已正确配置 JAVA_HOME

  • Apache Maven ${proposed-maven-version}

  • 如果你想使用 Quarkus CLI, 则可以选择使用

  • 如果你想构建一个本机可执行文件(或如果你使用本机容器构建,则使用 Docker),则可以选择安装 Mandrel 或 GraalVM 以及 configured appropriately

本指南将以在 Getting Started guide中开发的应用程序作为输入。

确保您已准备好入门应用程序,或克隆 Git 存储库:git clone $${quickstarts-base-url}.git,或下载一个 $${quickstarts-base-url}/archive/main.zip[存档]。解决方案位于 `getting-started`目录中。

Login to Google Cloud

部署应用程序需要登录 Google Cloud。可以按以下方式进行操作:

gcloud auth login

Deploying to Google Cloud Functions

Quarkus 支持通过以下扩展将您的应用程序部署到 Google Cloud Functions:

每个扩展都支持特定类型的应用程序开发,请遵循特定指南以了解如何使用它们开发、打包和部署应用程序。

Deploying to Google App Engine Standard

首先,请确保为您的 Google Cloud 项目初始化一个 App Engine 环境,如果没有,请通过 `gcloud app create --project=[YOUR_PROJECT_ID]`初始化一个。

然后,您需要创建一个 `src/main/appengine/app.yaml`文件,让我们仅使用选定的引擎使其保持简洁:

runtime: java11

这将为您的 App Engine 应用程序创建一个默认服务。

您还可以通过定义 `runtime: java17`来使用新的 Java 17 运行时。

App Engine Standard 不支持 Quarkus 的默认特定打包布局,因此,您必须设置您的应用程序才能通过您的 `application.properties`文件打包成 uber-jar:

quarkus.package.jar.type=uber-jar

然后,您可以选择手动构建应用程序或将该职责委派给 `gcloud`或 Google Cloud Maven 插件。

Building the application manually

使用 `mvn clean package`使用 Maven 构建应用程序,它将生成一个包含您的应用程序的所有类及其依赖项的 JAR。

最后,使用 `gcloud`将您的应用程序部署为 App Engine 服务。

gcloud app deploy target/getting-started-1.0.0-SNAPSHOT-runner.jar

此命令将上传应用 jar 并随 App Engine 一同启动它。

完成后,输出将显示你应用的 URL(目标网址),你可以随 gcloud app browse 一同使用 curl 或直接在浏览器中打开。

Building the application via gcloud

你可以选择让 gcloud 为你生成你的应用,这是向 App Engine 部署的最简单方式。

接着,你只需在项目根目录启动 gcloud app deploy,它将上传你所有项目文件(可通过 .gcloudignore 文件减少清单),经由 Maven(或 Gradle)打包你的 JAR,然后随 App Engine 启动。

完成后,输出将显示你应用的 URL(目标网址),你可以随 gcloud app browse 一同使用 curl 或直接在浏览器中打开。

Building the application via the Google Cloud Maven plugin

你也可以让 Maven 使用 App Engine Maven 插件控制你的应用部署。

首先,将插件添加到你的 pom.xml

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>2.4.4</version>
    <configuration>
        <projectId>GCLOUD_CONFIG</projectId> 1
        <version>gettingstarted</version>
        <artifact>${project.build.directory}/${project.artifactId}-${project.version}-runner.jar</artifact> 2
    </configuration>
</plugin>
1 使用默认 gcloud 配置
2 将默认 JAR 名称替换为 Quarkus Maven 插件生成的那个

接着,你就可以通过 mvn clean package appengine:deploy 随 Maven 使用 Maven 来建立并部署你的应用至 App Engine。

完成后,输出将显示你应用的 URL(目标网址),你可以随 gcloud app browse 一同使用 curl 或直接在浏览器中打开。

Deploying to Google App Engine Flexible Custom Runtimes

最重要的是,确保你的 Google Cloud 项目的 App Engine 环境已初始化,如果没有,请通过 gcloud app create --project=[YOUR_PROJECT_ID] 初始化一个。

App Engine 可弹性伸缩的自定义运行时使用 Docker 映像运行你的应用。

首先,在项目根目录创建 app.yaml 文件,内容如下:

runtime: custom
env: flex

App Engine 可弹性伸缩的自定义运行时将应用部署为 Docker 容器,你可以选择部署应用内提供的其中一个 Dockerfile。

JVM 及原生可执行版本都行得通。

若要部署 JVM 应用:

  • 将 JVM Dockerfile 复制到项目的根目录: cp src/main/docker/Dockerfile.jvm Dockerfile

  • 使用 mvn clean package 建立应用。

若要部署原生应用:

  • 将本地 Dockerfile 复制到项目的根目录:cp src/main/docker/Dockerfile.native Dockerfile

  • 使用 `mvn clean package -Dnative`将应用程序构建成原生可执行文件。

最后在项目的根目录中启动 gcloud app deploy,它将上传项目的所有文件(可以通过 .gcloudignore 文件来减少列表),构建 Dockerfile,并在 App Engine Flexible 自有运行时中启动它。

它使用 Cloud Build 来构建 Docker 镜像,并将其部署到 Google Container Registry (GCR)。

完成后,输出将显示应用程序的 URL(目标 URL),可以使用 curl 使用它或使用 gcloud app browse 直接在浏览器中打开它。

App Engine Flexible 自有运行时支持 health checks,强烈建议使用 Quarkus 提供的 Smallrye Health 支持。

Deploying to Google Cloud Run

Google Cloud Run 允许以托管方式在 Google Cloud Platform 中运行 Docker 容器。

默认情况下,Quarkus 在端口 8080 上监听,这也是 Cloud Run 的默认端口。不需要使用 Cloud Run 中定义的 PORT 环境变量来自定义 Quarkus HTTP 端口。

Cloud Run 将使用 Cloud Build 来构建 Docker 镜像,并将其部署到 Google Container Registry (GCR)。

JVM 及原生可执行版本都行得通。

若要部署 JVM 应用:

  • 将 JVM Dockerfile 复制到项目的根目录: cp src/main/docker/Dockerfile.jvm Dockerfile

  • 使用 mvn clean package 建立应用。

若要部署原生应用:

  • 将本地 Dockerfile 复制到项目的根目录:cp src/main/docker/Dockerfile.native Dockerfile

  • 使用 `mvn clean package -Dnative`将应用程序构建成原生可执行文件。

然后,创建一个 .gcloudignore 文件来告诉 gcloud 哪些文件不应该为 Cloud Build 上传,如果没有该文件,它将默认为 .gitignore,通常会将打包了应用程序创建的目标目录排除在外。

在此示例中,仅排除 src 目录:

src/

然后,使用 Cloud Build 构建镜像,它将把应用程序的所有文件(除了 .gcloudignore 文件忽略的文件)上传到 Google Cloud Storage 存储分区,构建 Docker 镜像并将其推送到 Google Container Registry (GCR)。

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld

你还可以本地构建镜像并将其推送到可公开访问的 Docker 注册表中,然后在下步中使用此镜像。

最后,使用 Cloud Run 启动应用程序。

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld

Cloud Run 会询问有关服务名称、区域以及是否允许未经身份验证的呼叫的问题。回答完这些问题后,它将部署应用程序。

完成部署后,输出将显示访问应用程序的 URL。

Cloud Run 支持 health checks,强烈建议使用 Quarkus Smallrye Health 支持来提供它们。

Using Cloud SQL

Google Cloud SQL 提供了针对 MySQL、PostgreSQL 和 Microsoft SQL Server 的托管实例。Quarkus 支持所有这三个数据库。

Using Cloud SQL with a JDBC driver

要让应用程序与 Cloud SQL 协同工作,你首先需要使用相应的 JDBC 扩展,例如对于 PostgreSQL,添加 quarkus-jdbc-postgresql 扩展。

然后,你需在 pom.xml 中添加云 SQL JDBC 库,该库可提供与云 SQL 的附加连接。对于 PostgreSQL,你需包含下列依赖关系:

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>postgres-socket-factory</artifactId>
    <version>${postgres-socket-factory.version}</version>
</dependency>

最后,你需专门配置数据源,才能使用套接字工厂:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.url=jdbc:postgresql:///mydatabase 1
quarkus.datasource.username=quarkus
quarkus.datasource.password=quarkus
quarkus.datasource.jdbc.additional-jdbc-properties.cloudSqlInstance=project-id:gcp-region:instance 2
quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.sql.postgres.SocketFactory 3
1 JDBC URL 不应包含数据库的主机名/IP。
2 我们添加 cloudSqlInstance 附加 JDBC 属性以配置实例 ID。
3 我们添加 socketFactory 附加 JDBC 属性以配置用于连接到云 SQL 的套接字工厂,该属性源自 postgres-socket-factory 依赖关系。

目前在开发模式中,由于问题 #15782,无法使用 PostgreSQL 套接字工厂。

Using Cloud SQL with a reactive SQL client

你还可以使用我们的响应式 SQL 客户端(而非 JDBC 客户端)。若要使用云 SQL,请添加下列依赖关系(根据你的平台调整分类器):

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <classifier>linux-x86_64</classifier>
</dependency>

然后配置你的响应式数据源,不使用主机名,而使用 Netty 本机传输:

quarkus.datasource.reactive.url=postgresql://:5432/db-name?host=/cloudsql/project-id:zone:db-name
quarkus.vertx.prefer-native-transport=true

这仅在应用程序在由 Google Cloud 管理的运行时中运行时才起作用,例如 App Engine。

Using Cloud SQL with native executables

生成本机可执行文件时,你还必须将 jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder 标记为运行时初始化。

quarkus.native.additional-build-args=--initialize-at-run-time=jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder

Going further

你可以在 Quarkiverse(一个由社区维护的 Quarukus 扩展名 GitHub 组织)中找到用于访问各种 Google Cloud 服务的一套扩展名,包括 PubSub、BigQuery、Storage、Spanner、Firestore、Secret Manager(访问代码库以获取受支持服务的确切列表)。

你可以在 Quarkiverse Google Cloud Services documentation 中找到关于它们的文档。