Google Cloud Functions (Serverless) with RESTEasy Reactive, Undertow, or Reactive Routes
The quarkus-google-cloud-functions-http
extension allows you to write
microservices with RESTEasy Reactive (Jakarta REST), Undertow (Servlet),
Reactive Routes, or Funqy HTTP, and make these
microservices deployable to the Google Cloud Functions runtime.
One Google Cloud Functions deployment can represent any number of Jakarta REST, Servlet, Reactive Routes, or Funqy HTTP endpoints.
This technology is considered preview. For a full list of possible statuses, check our FAQ entry. |
准备
要完成本指南,您需要:
-
Roughly 15 minutes
-
An IDE
-
JDK 11+ installed with
JAVA_HOME
configured appropriately -
Apache Maven 3.9.6
-
Optionally the Quarkus CLI if you want to use it
-
A Google Cloud Account. Free accounts work.
完整源码
This guide walks you through generating a sample project followed by creating three HTTP endpoints written with Jakarta REST APIs, Servlet APIs, Reactive Routes, or Funqy HTTP APIs. Once built, you will be able to deploy the project to Google Cloud.
If you don’t want to follow all these steps, you can go right to the completed example.
Clone the Git repository: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, or download
an archive.
The solution is located in the google-cloud-functions-http-quickstart
directory.
Creating the Maven Deployment Project
Create an application with the quarkus-google-cloud-functions-http
extension. You can use the following Maven command to create it:
For Windows users:
-
If using cmd, (don’t use backward slash
\
and put everything on the same line) -
If using Powershell, wrap
-D
parameters in double quotes e.g."-DprojectArtifactId=google-cloud-functions-http"
Login to Google Cloud
Login to Google Cloud is necessary for deploying the application. It can be done as follows:
gcloud auth login
Creating the endpoints
For this example project, we will create four endpoints, one for RESTEasy Reactive (Jakarta REST), one for Undertow (Servlet), one for Reactive routes and one for Funqy HTTP.
These various endpoints are for demonstration purposes. For real life applications, you should choose one of this technology and stick to it. |
If you don’t need endpoints of each type, you can remove the corresponding
extensions from your pom.xml
.
Quarkus supports Cloud Functions gen 1 and gen 2. For an overview of Cloud
Functions gen 2 see
this page on the
Google Cloud Functions documentation. To use gen 2 you must and add the
--gen2 parameter.
|
The Jakarta REST endpoint
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 RESTEasy Reactive";
}
}
The Servlet endpoint
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);
}
}
The Reactive Routes endpoint
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");
}
}
Build and Deploy to Google Cloud
Quarkus forces a packaging of type uber-jar for your function as Google
Cloud Function deployment requires a single JAR.
|
Package your application using the standard mvn clean package
command.
The result of the previous command is a single JAR file inside the
target/deployment
directory that contains the classes and the dependencies
of the project.
Then you will be able to use gcloud
to deploy your function to Google
Cloud.
We will use the Java 17 runtime but you can switch to the Java 11 runtime by
using --runtime=java11 instead of --runtime=java17 on the deploy
commands.
|
gcloud functions deploy quarkus-example-http \
--entry-point=io.quarkus.gcp.functions.http.QuarkusHttpFunction \
--runtime=java17 --trigger-http --allow-unauthenticated --source=target/deployment
The entry point must always be set to
|
The first time you launch this command, you can have the following error message:
This means that Cloud Build is not activated yet. To overcome this error, open the URL shown in the error, follow the instructions and then wait a few minutes before retrying the command. |
This command will give you as output a httpsTrigger.url
that points to
your function.
You can then call your endpoints via:
-
For Jakarta REST: {httpsTrigger.url}/hello
-
For servlet: {httpsTrigger.url}/servlet/hello
-
For Reactive Routes: {httpsTrigger.url}/vertx/hello
-
For Funqy: {httpsTrigger.url}/funqy
Testing locally
The easiest way to locally test your function is using the Cloud Function invoker JAR.
You can download it via Maven using the following command:
mvn dependency:copy \
-Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.3.0' \
-DoutputDirectory=.
Before using the invoker, you first need to build your function via mvn
package
.
Then you can use it to launch your function locally.
java -jar java-function-invoker-1.3.0.jar \
--classpath target/deployment/google-cloud-functions-http-1.0.0-SNAPSHOT-runner.jar \
--target io.quarkus.gcp.functions.http.QuarkusHttpFunction
The --classpath parameter needs to be set to the previously packaged JAR
that contains your function class and all Quarkus related classes.
|
Your endpoints will be available on http://localhost:8080.
What’s next?
You can use our Google Cloud Functions Funqy binding to use Funqy, a provider-agnostic function as a service framework, that allow to deploy HTTP function or Background function to Google Cloud.