Micronaut e GraalVM su Google Cloud Run

Micronaut & GraalVM

Nell'articolo Micronaut e GraalVM: alleati per il Cloud Native abbiamo visto come è stato semplice creare un servizio web in Micronaut e compilarlo in un immagine nativa e containerizzata con Docker. Il vantaggio di questa soluzione è avere un container ideale per i microservizi Cloud e Serverless, non essendo più necessaria l'esecuzione della JVM ed eliminando i ritardi nel Cold Start.

In questo articolo vi mostro il passo successivo, ovvero il deploy vero e proprio in Cloud usando Google Cloud Run, il servizio di Google per l'esecuzione di container in ambiente Serverless.

1 - Il container Docker

Partiamo dal container. Se avete seguito tutti i passi del tutorial precedente avrete sicuramente in locale un'immagine docker chiamata mngraal.

# Per verificare 
docker image ls mngraal

2 - Progetto Google Cloud

Prima di deploiare vi occorrerà avere un progetto GCP. Il livello free di Google vi consentirà di deploiare il servizio in maniera gratuita. Potrebbe essere necessario tuttavia fornire una carta di credito per abilitare il servizio.

3 - Deploy e Test

Il deploy e la creazione del servizio sono molto semplici. Occorre però avere installata e inizializzata la Cloud SDK di Google. Da qui in poi assumo che abbiate un ambiente con il comando gcloud funzionante ed autenticato con il vostro account Google.

Per prima cosa aggiungiamo le nostre credenziali Google a Docker. Serviranno per abilitare il push dell'immagine sui registri Google.

gcloud auth configure-docker

Ora taggiamo l'immagine usando il registry di Google e procediamo al push. Uso il tag latest per semplicità ma è buona norma gestire in modo corretto le versioni delle proprie immagini (soprattutto se usate in ambienti di produzione).

docker image tag mngraal:latest eu.gcr.io/your_project_id/mngraal:latest
docker image push eu.gcr.io/your_project_id/mngraal:latest

Per creare il servizio Cloud Run si può usare la console grafica di google oppure l'SDK da riga di comando. Io preferisco usare il comando, ad esempio per avere un servizio ad accesso pubblico deploiato in Belgio (europe-west1):

gcloud run deploy mngraal --project your_project_id --allow-unauthenticated \
--image eu.gcr.io/your_project_id/mngraal:latest \
--platform managed --region europe-west1

Deploying container to Cloud Run service [mngraal] in project [***] region [europe-west1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [mngraal] revision [mngraal-00004-mux] has been deployed and is serving 100 percent of traffic.
Service URL: https://mngraal-****-ew.a.run.app

Ok veniamo ora al test del servizio. Utilizzo curl, dove in particolare mi stampo anche time_starttransfer in modo da capire quanto ci impiega Google ad iniziare la risposta.

curl -s  -w  '\n\n%{time_starttransfer}-%{time_total}\n' https://mngraal-****-ew.a.run.app/

Hello World!

1,568000-1,568076

Questo parametro da un'indicazione sui tempi di rete necessari alla comunicazione ma soprattutto vi da un'idea sui tempi di Cold Start, ovvero quanto ci impiega Google a tirar su il container.

Noterete che dopo un periodo di inattività del servizio i tempi di risposta possono anche essere di uno o due secondi, mentre se il servizio è attivo i tempi di risposta scendono moltissimo.

curl -s  -w  '\n\n%{time_starttransfer}-%{time_total}\n' https://mngraal-****-ew.a.run.app/

Hello World!

0,119670-0,119727

Conclusioni

Avere un servizio in Java, compilabile con GraalVM vi da di fatto la possibilità di lavorare, debuggare e testare sulla JVM. Poi potete scegliere il deploy a seconda delle vostre esigenze. Potete ad esempio usare kuberenetes (su JVM o container nativo) se volete avere un servizio sempre attivo. Potete scegliere una soluzione Serverless e OnDemand se magari volete tutta l'infrastruttura gestita dal provider o se magari le chiamate non sono così frequenti da giustificare un servizio standalone.