编辑此页面

具有 Quarkus REST、Undertow 或 Reactive Routes 的 Google Cloud Functions (Serverless)

quarkus-google-cloud-functions-http 扩展允许您使用 Quarkus REST (Jakarta REST)、Undertow (Servlet)、Reactive Routes 或 Funqy HTTP 编写微服务,并使这些微服务可部署到 Google Cloud Functions 运行时。

一个 Google Cloud Functions 部署可以表示任意数量的 Jakarta REST、Servlet、Reactive Routes 或 Funqy HTTP 端点。

此技术被认为是预览版。

预览中,不保证向后兼容性和在生态系统中的存在。 具体改进可能需要更改配置或 API,成为稳定版本的计划正在进行中。 欢迎在我们的 邮件列表或我们的 GitHub 问题跟踪器中提出反馈意见。

有关可能的完整状态列表,请查看我们的常见问题解答条目

先决条件

要完成本指南,您需要

解决方案

本指南将引导您生成一个示例项目,然后创建三个用 Jakarta REST API、Servlet API、Reactive Routes 或 Funqy HTTP API 编写的 HTTP 端点。 构建完成后,您就可以将项目部署到 Google Cloud。

如果您不想遵循所有这些步骤,可以直接转到完整的示例。

克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git,或下载 archive

解决方案位于 google-cloud-functions-http-quickstart 目录中。

创建 Maven 部署项目

使用 quarkus-google-cloud-functions-http 扩展创建一个应用程序。 您可以使用以下 Maven 命令来创建它

CLI
quarkus create app org.acme:google-cloud-functions-http \
    --extension='google-cloud-functions-http,rest-jackson,undertow,reactive-routes,funqy-http' \
    --no-code
cd google-cloud-functions-http

要创建 Gradle 项目,请添加 --gradle--gradle-kotlin-dsl 选项。

有关如何安装和使用 Quarkus CLI 的更多信息,请参阅 Quarkus CLI 指南。

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.24.4:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=google-cloud-functions-http \
    -Dextensions='google-cloud-functions-http,rest-jackson,undertow,reactive-routes,funqy-http' \
    -DnoCode
cd google-cloud-functions-http

要创建 Gradle 项目,请添加 -DbuildTool=gradle-DbuildTool=gradle-kotlin-dsl 选项。

对于 Windows 用户

  • 如果使用 cmd,(不要使用反斜杠 \ 并将所有内容放在同一行上)

  • 如果使用 Powershell,请将 -D 参数包含在双引号中,例如 "-DprojectArtifactId=google-cloud-functions-http"

登录 Google Cloud

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

gcloud auth login

创建端点

对于此示例项目,我们将创建四个端点,一个用于 Quarkus REST (Jakarta REST),一个用于 Undertow (Servlet),一个用于 Reactive routes,一个用于 Funqy HTTP

这些不同的端点仅用于演示目的。 对于实际应用程序,您应该选择其中一种技术并坚持使用。

如果您不需要每种类型的端点,您可以从您的 pom.xml 中删除相应的扩展。

Jakarta REST 端点

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from Quarkus REST";
    }
}

Servlet 端点

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet(name = "ServletGreeting", urlPatterns = "/servlet/hello")
public class GreetingServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");
        resp.getWriter().write("hello");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getReader().readLine();
        resp.setStatus(200);
        resp.addHeader("Content-Type", "text/plain");
        resp.getWriter().write("hello " + name);
    }
}

Reactive Routes 端点

import static io.quarkus.vertx.web.Route.HttpMethod.GET;

import io.quarkus.vertx.web.Route;
import io.vertx.ext.web.RoutingContext;

public class GreetingRoutes {
    @Route(path = "/vertx/hello", methods = GET)
    void hello(RoutingContext context) {
        context.response().headers().set("Content-Type", "text/plain");
        context.response().setStatusCode(200).end("hello");
    }
}

Funqy HTTP 端点

import io.quarkus.funqy.Funq;

public class GreetingFunqy {
    @Funq
    public String funqy() {
        return "Make it funqy";
    }
}

构建和部署到 Google Cloud

Quarkus 强制您的函数采用 uber-jar 类型的打包,因为 Google Cloud Function 部署需要单个 JAR。

使用标准 mvn clean package 命令打包您的应用程序。 前一个命令的结果是 target/deployment 目录中的单个 JAR 文件,其中包含项目的类和依赖项。

然后您将能够使用 gcloud 将您的函数部署到 Google Cloud。

我们将使用 Java 21 运行时,但您可以通过在部署命令中使用 --runtime=java17 而不是 --runtime=java21 来切换到 Java 17 运行时。
gcloud functions deploy quarkus-example-http \
  --entry-point=io.quarkus.gcp.functions.http.QuarkusHttpFunction \
  --runtime=java21 --trigger-http --allow-unauthenticated --source=target/deployment

入口点必须始终设置为 io.quarkus.gcp.functions.http.QuarkusHttpFunction,因为这是将 Cloud Functions 与 Quarkus 集成的类。

第一次启动此命令时,您可能会收到以下错误消息

ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Build Failed: Cloud Build has not been used in project <project_name> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview?project=<my-project> then retry.

这意味着 Cloud Build 尚未激活。 要克服此错误,请打开错误中显示的 URL,按照说明进行操作,然后等待几分钟再重试该命令。

此命令将为您提供一个 httpsTrigger.url 作为输出,该 URL 指向您的函数。

然后您可以通过以下方式调用您的端点

  • 对于 Jakarta REST:{httpsTrigger.url}/hello

  • 对于 servlet:{httpsTrigger.url}/servlet/hello

  • 对于 Reactive Routes:{httpsTrigger.url}/vertx/hello

  • 对于 Funqy:{httpsTrigger.url}/funqy

本地测试

本地测试您的函数的最简单方法是使用 Cloud Function 调用器 JAR。

您可以使用以下命令通过 Maven 下载它

mvn dependency:copy \
  -Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.4.1' \
  -DoutputDirectory=.

在使用调用器之前,您首先需要通过 mvn package 构建您的函数。

然后您可以使用它在本地启动您的函数。

java -jar java-function-invoker-1.4.1.jar \
  --classpath target/deployment/google-cloud-functions-http-1.0.0-SNAPSHOT-runner.jar \
  --target io.quarkus.gcp.functions.http.QuarkusHttpFunction
--classpath 参数需要设置为先前打包的 JAR,其中包含您的函数类和所有 Quarkus 相关类。

您的端点将在 https://:8080 上可用。

下一步是什么?

您可以使用我们的 Google Cloud Functions Funqy binding 来使用 Funqy,一个与提供商无关的函数即服务框架,它允许将 HTTP 函数或后台函数部署到 Google Cloud。

相关内容