Google Cloud Functions (2nd Gen) Java Sample
Cloud Functions (2nd Gen) is Google’s Serverless Functions as a Service Platform. 2nd Generation is now built on top of the excellent Google Cloud Run as a base. Think of Google Cloud Run as a Serverless environment for running containers which respond to events(http being the most basic, all sorts of other events via eventarc).
The blue area above shows the flow of code, the Google Cloud cli for Cloud Function, orchestrates the flow where the source code is placed in Google Cloud Storage bucket, a Cloud Build is triggered to build this code, package it into a container and finally this container is run using Cloud Run which the user can access via Cloud Functions console. Cloud Functions essentially becomes a pass through to Cloud Run.
The rest of this post will go into the details of how such a function can be written using Java.tl;dr — sample code is available here —https://github.com/bijukunjummen/http-cloudfunction-java-gradle, and has all the relevant pieces hooked up.
Method Signature
To expose a function to respond to http events is fairly straightforward, it just needs to conform to the functions framework interface, for java it is available here — https://github.com/GoogleCloudPlatform/functions-framework-java
To pull in this dependency using gradle as the build tool looks like this:
compileOnly("com.google.cloud.functions:functions-framework-api:1.0.4")
The dependency is required purely for compilation, at runtime the dependency is provided through a base image that Functions build time uses.
The function signature looks like this:
import com.google.cloud.functions.HttpFunction; import com.google.cloud.functions.HttpRequest; import com.google.cloud.functions.HttpResponse; public class HelloHttp implements HttpFunction { @Override public void service(HttpRequest request, HttpResponse response) throws IOException { final BufferedWriter writer = response.getWriter(); response.setContentType("application/html"); writer.write("Hello World"); } }
Testing the Function
This function can be tested locally using an Invoker that is provided by the functions-framework-api, my code https://github.com/bijukunjummen/http-cloudfunction-java-gradle shows how it can be hooked up with gradle, suffice to say that invoker allows an endpoint to brought up and tested with utilities like curl.
Deploying the Function
Now comes the easy part about deploying the function. Since a lot of Google Cloud Services need to be orchestrated to get a function deployed — GCS, Cloud Build, Cloud Run and Cloud Function, the command line to deploy the function does a great job of indicating which services need to be activated, the command to run looks like this:
gcloud beta functions deploy java-http-function \ --gen2 \ --runtime java17 \ --trigger-http \ --entry-point functions.HelloHttp \ --source ./build/libs/ \ --allow-unauthenticated
Note that atleast for Java, it is sufficient to build the code locally and provide the built uber jar(jar with all dependencies packaged in) as the source.
Once deployed, the endpoint can be found using the following command:
gcloud beta functions describe java-http-function --gen2
and the resulting endpoint accessed via a curl command!
curl https://java-http-function-abc-uw.a.run.app Hello World
What is Deployed
This is a bit of an exploration of what gets deployed into a GCP project, let’s start with the Cloud Function itself.
See how for a Gen2 function, a “Powered by Cloud Run” shows up which links to the actual cloud run deployment that powers this cloud function, clicking through leads to:
Conclusion
This concludes the steps to deploy a simple Java based Gen2 Cloud Function that responds to http calls. The post shows how the Gen 2 Cloud Function is more or less a pass through to Cloud Run. The sample is available in my github repository — https://github.com/bijukunjummen/http-cloudfunction-java-gradle
Published on Java Code Geeks with permission by Biju Kunjummen, partner at our JCG program. See the original article here: Google Cloud Functions (2nd Gen) Java Sample Opinions expressed by Java Code Geeks contributors are their own. |