编辑此页面

部署到 Google Cloud Platform (GCP)

本指南涵盖

  • 登录 Google Cloud

  • 将函数部署到 Google Cloud Functions

  • 将 JAR 部署到 Google App Engine Standard

  • 将 Docker 镜像部署到 Google App Engine Flexible Custom Runtimes

  • 将 Docker 镜像部署到 Google Cloud Run

  • 使用 Cloud SQL

先决条件

要完成本指南,您需要

本指南将以入门指南中开发的应用程序作为输入。

请确保您手头有入门应用程序,或者克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git,或者下载一个存档。解决方案位于 getting-started 目录中。

登录 Google Cloud

登录 Google Cloud 对于部署应用程序是必要的。 可以按如下方式完成

gcloud auth login

部署到 Google Cloud Functions

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

每个扩展都支持特定类型的应用程序开发,请关注特定指南,了解有关如何使用它们开发、打包和部署应用程序的更多信息。

部署到 Google App Engine Standard

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

然后,您需要创建一个 src/main/appengine/app.yaml 文件,让我们保持最小化,仅包含所选引擎

runtime: java21

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

您还可以使用 App Engine 支持的另一个 Java 运行时,例如,对于 Java 17,请改用 runtime: java17

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

quarkus.package.jar.type=uber-jar

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

手动构建应用程序

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

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

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

此命令将上传您的应用程序 jar 并在 App Engine 上启动它。

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

通过 gcloud 构建应用程序

您可以选择让 gcloud 为您构建应用程序,这是部署到 App Engine 的最简单方法。

然后,您只需在项目的根目录中启动 gcloud app deploy,它将上传您的所有项目文件(可以通过 .gcloudignore 文件减少列表),通过 Maven(或 Gradle)打包您的 JAR 并在 App Engine 上启动它。

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

通过 Google Cloud Maven 插件构建应用程序

您还可以让 Maven 控制应用程序的部署,使用 App Engine Maven 插件。

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

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>2.7.0</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 插件生成的名称

然后,您就可以使用 Maven 通过 mvn clean package appengine:deploy 构建应用程序并将其部署到 App Engine。

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

部署到 Google App Engine Flexible Custom Runtimes

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

App Engine Flexible Custom Runtimes 使用 Docker 镜像来运行您的应用程序。

首先,在项目的根目录中创建一个 app.yaml 文件,内容如下

runtime: custom
env: flex

App Engine Flexible Custom Runtimes 将您的应用程序部署为 Docker 容器,您可以选择部署应用程序内提供的 Dockerfile 之一。

JVM 和 native 可执行版本都可以工作。

要部署 JVM 应用程序

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

  • 使用 mvn clean package 构建您的应用程序。

要部署 native 应用程序

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

  • 使用 mvn clean package -Dnative 将您的应用程序构建为 native 可执行文件。

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

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

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

App Engine Flexible custom runtimes 支持 健康检查,强烈建议通过 Quarkus SmallRye Health 支持来提供它们。

部署到 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 和 native 可执行版本都可以工作。

要部署 JVM 应用程序

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

  • 使用 mvn clean package 构建您的应用程序。

要部署 native 应用程序

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

  • 使用 mvn clean package -Dnative 将您的应用程序构建为 native 可执行文件。

然后,创建一个 .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 支持 健康检查,强烈建议通过 Quarkus SmallRye Health 支持来提供它们。

使用 Cloud SQL

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

使用 JDBC 驱动程序使用 Cloud SQL

要使您的应用程序与 Cloud SQL 配合使用,您首先需要使用相应的 JDBC 扩展,例如,对于 PostgreSQL,添加 quarkus-jdbc-postgresql 扩展。

然后,您需要将 Cloud SQL JDBC 库添加到您的 pom.xml 中,该库提供与 Cloud 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 属性来配置用于连接到 Cloud SQL 的套接字工厂,该属性来自 postgres-socket-factory 依赖项。
由于问题 #15782,目前无法在开发模式下使用 PostgreSQL 套接字工厂。

使用 reactive SQL 客户端使用 Cloud SQL

您也可以使用我们的 reactive SQL 客户端之一,而不是 JDBC 客户端。 要使用 Cloud SQL 执行此操作,请添加以下依赖项(根据您的平台调整分类器)

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

然后,配置您的 reactive 数据源,使其没有主机名,并使用 Netty native 传输

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)中运行时才有效。

使用 native 可执行文件使用 Cloud SQL

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

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

此外,从 com.google.cloud.sql:postgres-socket-factory:1.17.0 开始,您还必须将 com.kenai.jffi.internal.Cleaner 标记为运行时初始化。

quarkus.native.additional-build-args=--initialize-at-run-time=jnr.ffi.provider.jffi.NativeFinalizer$SingletonHolder\\,com.kenai.jffi.internal.Cleaner

更进一步

您可以在 Quarkiverse(由社区维护的 Quarkus 扩展的 GitHub 组织)中找到一组用于访问各种 Google Cloud Services 的扩展,包括 PubSub、BigQuery、Storage、Spanner、Firestore、Secret Manager(请访问存储库以获取受支持服务的准确列表)。

您可以在 Quarkiverse Google Cloud Services 文档中找到有关它们的文档。

相关内容