Deploying to Google Cloud Platform (GCP)
本指南涵盖:
-
Login to Google Cloud
-
将函数部署到 Google Cloud Functions
-
将 JAR 部署到 Google App Engine Standard
-
将 Docker 镜像部署到 Google App Engine Flexible 定制运行时
-
将 Docker 镜像部署到 Google Cloud Run
-
Using Cloud SQL
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`目录中。
Deploying to Google Cloud Functions
Quarkus 支持通过以下扩展将您的应用程序部署到 Google Cloud Functions:
-
Google Cloud Functions:使用 Google Cloud Functions API 构建函数。
-
Google Cloud Functions HTTP binding:使用 Quarkus HTTP API 构建函数:Quarkus REST(以前称为 RESTEasy Reactive,我们的 Jakarta REST 实现)、Undertow(Servlet)、Vert.x Web 或 Funqy HTTP。
-
Funky Google Cloud Functions:使用 Funqy 构建函数。
每个扩展都支持特定类型的应用程序开发,请遵循特定指南以了解如何使用它们开发、打包和部署应用程序。
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 中定义的 |
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。
Going further
你可以在 Quarkiverse(一个由社区维护的 Quarukus 扩展名 GitHub 组织)中找到用于访问各种 Google Cloud 服务的一套扩展名,包括 PubSub、BigQuery、Storage、Spanner、Firestore、Secret Manager(访问代码库以获取受支持服务的确切列表)。
你可以在 Quarkiverse Google Cloud Services documentation 中找到关于它们的文档。