具有 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 问题跟踪器中提出反馈意见。 有关可能的完整状态列表,请查看我们的常见问题解答条目。 |
先决条件
要完成本指南,您需要
-
大约 15 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
Google Cloud 帐户。 免费帐户也可以。
解决方案
本指南将引导您生成一个示例项目,然后创建三个用 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 命令来创建它
对于 Windows 用户
-
如果使用 cmd,(不要使用反斜杠
\
并将所有内容放在同一行上) -
如果使用 Powershell,请将
-D
参数包含在双引号中,例如"-DprojectArtifactId=google-cloud-functions-http"
创建端点
对于此示例项目,我们将创建四个端点,一个用于 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");
}
}
构建和部署到 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
入口点必须始终设置为 |
第一次启动此命令时,您可能会收到以下错误消息
这意味着 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。