mn create-app example.micronaut.micronautguide --build=maven --lang=java
Deploy GraalVM Native Executable to Google Cloud Run
Deploy a GraalVM Native Executable of a Micronaut application to Google Cloud Run - a fully managed serverless platform for containerized applications.
Authors: Sergio del Amo
Micronaut Version: 4.6.3
1. Getting Started
In this guide, we will create a Micronaut application written in Java.
We will deploy the application to Google Cloud Run.
Develop and deploy highly scalable containerized applications on a fully managed serverless platform.
Push the Docker image of your application to Google Cloud Container Registry or to Google Cloud Artifact Registry.
The docker image runs a GraalVM Native Executable of the Micronaut application.
2. What you will need
To complete this guide, you will need the following:
-
Some time on your hands
-
A decent text editor or IDE (e.g. IntelliJ IDEA)
-
JDK 17 or greater installed with
JAVA_HOME
configured appropriately -
You need a Google Cloud Platform (GCP) account and a GCP project.
3. Solution
We recommend that you follow the instructions in the next sections and create the application step by step. However, you can go right to the completed example.
-
Download and unzip the source
4. Writing the Application
Create an application using the Micronaut Command Line Interface or with Micronaut Launch.
If you don’t specify the --build argument, Gradle with the Kotlin DSL is used as the build tool. If you don’t specify the --lang argument, Java is used as the language.If you don’t specify the --test argument, JUnit is used for Java and Kotlin, and Spock is used for Groovy.
|
The previous command creates a Micronaut application with the default package example.micronaut
in a directory named micronautguide
.
4.1. Controller
In order to create a microservice that responds with "Hello World" you first need a controller.
Create a Controller:
package example.micronaut;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
@Controller("/hello") (1)
public class HelloController {
@Get (2)
@Produces(MediaType.TEXT_PLAIN) (3)
public String index() {
return "Hello World"; (4)
}
}
1 | The class is defined as a controller with the @Controller annotation mapped to the path /hello . |
2 | The @Get annotation maps the index method to an HTTP GET request on /hello . |
3 | By default, a Micronaut response uses application/json as Content-Type . We are returning a String, not a JSON object, so we set it to text/plain with the @Produces annotation. |
4 | A String "Hello World" is returned as the result |
4.2. Test
Create a test to verify that when you make a GET request to /hello
you get Hello World
as a response:
package example.micronaut;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.MediaType;
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import org.junit.jupiter.api.Test;
import jakarta.inject.Inject;
@MicronautTest (1)
public class HelloControllerTest {
@Inject
@Client("/") (2)
HttpClient client;
@Test
public void testHello() {
HttpRequest<?> request = HttpRequest.GET("/hello").accept(MediaType.TEXT_PLAIN); (3)
String body = client.toBlocking().retrieve(request);
assertNotNull(body);
assertEquals("Hello World", body);
}
}
1 | Annotate the class with @MicronautTest so the Micronaut framework will initialize the application context and the embedded server. More info. |
2 | Inject the HttpClient bean and point it to the embedded server. |
3 | Creating HTTP Requests is easy thanks to the Micronaut framework fluid API. |
5. Google Cloud Platform
Signup for the Google Cloud Platform
5.1. Cloud SDK
Install the Cloud SDK CLI for your operating system.
Cloud SDK includes the gcloud
command-line tool. Run the init
command in your terminal:
gcloud init
Log in to your Google Cloud Platform:
gcloud auth login
5.2. Google Cloud Platform Project
Create a new project with a unique name (replace xxxxxx
with alphanumeric characters of your choice):
gcloud projects create micronaut-guides-xxxxxx
In GCP, project ids are globally unique, so the id you used above is the one you should use in the rest of this guide. |
Change your project:
gcloud config set project micronaut-guides-xxxxxx
If you forget the project id, you can list all projects:
gcloud projects list
5.3. Enable billing
Ensure you have a billing account created, and if not create one via the Google Cloud Platform Console.
To get a list of your billing accounts, run:
❯ gcloud beta billing accounts list
ACCOUNT_ID NAME OPEN MASTER_ACCOUNT_ID
XXXXXX-XXXXXX-XXXXXX My Billing Account True
You can then attach a billing account to your project:
> gcloud beta billing projects link micronaut-guides-xxxxxxx --billing-account=XXXXXX-XXXXXX-XXXXXX
billingAccountName: billingAccounts/XXXXXX-XXXXXX-XXXXXX
billingEnabled: true
name: projects/micronaut-guides-xxxxxxx/billingInfo
projectId: micronaut-guides-xxxxxxx
5.4. Enable the Google Cloud Container Registry API
We need somewhere to store our docker images, so we need to enable the Google Cloud Container Registry API for your project via the Google Cloud CLI:
gcloud services enable containerregistry.googleapis.com
6. Docker Push Native
Push the Docker image of your application to Google Cloud Container Registry.
./mvnw deploy \
-Dpackaging=docker-native \
-Djib.to.image=gcr.io/micronaut-guides-xxxxxx/micronautguide:latest
The previous URL uses the pattern: gcr.io/micronaut-guides-xxxxxx/micronautguide:latest
. Change it to use your Project ID.
You get an output such as:
....
..
.
Pushing image 'gcr.io/micronaut-guides-xxxxxx/micronautguide:latest'.
7. Google Cloud Run Deploy
You can deploy to Google Cloud Run via the CLI. Use the value you configured in your build as the image argument’s value.
gcloud run deploy \
--image=gcr.io/micronaut-guides-xxxxxx/micronautguide:latest \
--platform managed \
--allow-unauthenticated
You will see an output such as:
Service name (micronautguide):
Please specify a region:
...
[22] us-central1
[23] us-east1
[24] us-east4
...
[29] cancel
Please enter your numeric choice: 23
To make this the default region, run `gcloud config set run/region us-east1`.
Deploying container to Cloud Run service [micronautguide] in project [micronaut-guides-xxxxxx] region [us-east1]
✓ Deploying... Done.
✓ Creating Revision...
✓ Routing traffic...
✓ Setting IAM Policy...
Done.
Service [micronautguide] revision [micronautguide-00002-fat] has been deployed and is serving 100 percent of traffic.
Service URL: https://micronautguide-63kwrzytgq-ue.a.run.app
8. Running the Application
curl -i https://micronautguide-li3tercjmq-ue.a.run.app/hello
HTTP/2 200
content-type: text/plain
x-cloud-trace-context: 139f91d74bfe5d24a2770fca9abef1d7
date: Sat, 02 Oct 2021 07:18:52 GMT
server: Google Frontend
content-length: 11
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Hello World
9. Cleanup
9.1. Deleting the Cloud Run Service
Use the command gcloud run service delete to delete the service.
gcloud run services delete micronautguide
9.2. Deleting the project
The easiest way to eliminate billing is to delete the project you created for the tutorial.
Deleting a project has the following consequences:
|
9.2.1. Via the CLI
To delete the project using the Cloud SDK, run the following command, replacing YOUR_PROJECT_ID
with the project ID:
gcloud projects delete YOUR_PROJECT_ID
9.2.2. Via the Cloud Platform Console
In the Cloud Platform Console, go to the Projects page.
In the project list, select the project you want to delete and click Delete project. After selecting the checkbox next to the project name, click Delete project
In the dialog, type the project ID, and then click Shut down to delete the project.
Deleting or turning off specific resources
You can individually delete or turn off some of the resources that you created during the tutorial.
10. Next steps
You will probably want to deploy to Google Cloud Run from your CI server. Micronaut Launch contains feature github-workflow-google-cloud-run-graalvm, which adds a GitHub Actions Workflow that deploys a GraalVM Native executable of a Micronaut application to Google Cloud Run from Google Container Registry.
11. License
All guides are released with an Apache license 2.0 license for the code and a Creative Commons Attribution 4.0 license for the writing and media (images…). |