Memorizzare dati nella cache di un'app Spring Boot con Memorystore

Memorizzare dati nella cache di un'app Spring Boot con Memorystore

Informazioni su questo codelab

subjectUltimo aggiornamento: feb 11, 2020
account_circleScritto da un Googler

1. Panoramica

Memorystore for Redis è un servizio Redis completamente gestito per Google Cloud. Le app in esecuzione su Google Cloud possono ottenere prestazioni estreme sfruttando il servizio Redis estremamente scalabile, disponibile e sicuro, senza la necessità di gestire complessi deployment di Redis. Può essere utilizzato come backend per la memorizzazione nella cache dei dati per migliorare le prestazioni delle app Spring Boot. Il codelab spiega come configurarlo.

Cosa imparerai a fare:

  • Come utilizzare Memorystore come backend di cache per un'app Spring Boot.

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, come Google Chrome
  • Familiarità con gli editor di testo standard di Linux, ad esempio Vim, Emacs e GNU Nano

Come utilizzerai il codelab?

Come giudichi la tua esperienza con i servizi Google Cloud?

2. Configurazione e requisiti

Configurazione automatica dell'ambiente

Se non hai ancora un Account Google (Gmail o Google Apps), devi crearne uno. Accedi alla console di Google Cloud Platform (console.cloud.google.com) e crea un nuovo progetto.

Screenshot dal 10/02/2016 alle 00:45:26.png

Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome sopra riportato è già stato utilizzato e non funzionerà per te). Vi verrà fatto riferimento più avanti in questo codelab come PROJECT_ID.

Il prossimo passaggio consiste nell'attivare la fatturazione in Cloud Console per utilizzare le risorse di Google Cloud.

L'esecuzione di questo codelab non dovrebbe costare più di qualche euro, ma potrebbe essere di più se decidi di utilizzare più risorse o se le lasci in esecuzione (vedi la sezione "pulizia" alla fine di questo documento).

I nuovi utenti di Google Cloud Platform sono idonei per una prova senza costi di 300$.

Attiva Google Cloud Shell

Nella console di GCP, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

Quindi fai clic su "Start Cloud Shell":

Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente:

Questa macchina virtuale è dotata di tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro in questo lab, se non tutto, può essere svolto semplicemente con un browser o con Google Chromebook.

Una volta connesso a Cloud Shell, dovresti vedere che sei già autenticato e che il progetto è già impostato sul tuo PROJECT_ID.

Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:

gcloud auth list

Output comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Configurare un&#39;istanza di Memorystore for Redis

Avvia Cloud Shell.

Dopo il lancio di Cloud Shell, puoi utilizzare la riga di comando per creare una nuova istanza Memorystore.

$ gcloud redis instances create myinstance --size=1 --region=us-central1

Se l'API Memorystore non è stata abilitata, ti verrà chiesto se vuoi attivarla. Rispondi y.

API [redis.googleapis.com] not enabled on project [204466653457].
Would you like to enable and retry (this will take a few minutes)?
(y/N)?  y
Enabling service redis.googleapis.com on project 204166153457...
Waiting for async operation operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416 to complete...
Operation finished successfully. The following command can describe the Operation details:
 gcloud services operations describe operations/tmo-acf.c8909997-1b4e-1a62-b6f5-7da75cce1416
Create request issued for: [myinstance]
Waiting for operation [operation-1538645026454-57763b937ad39-2564ab37-3fea7701] to complete...done.
Created instance [myinstance].

Al termine dell'operazione, l'istanza sarà pronta per essere utilizzata.

Recupera l'indirizzo IP host host dell'istanza eseguendo questo comando. La utilizzerai nuovamente in seguito durante la configurazione dell'app Spring Boot.

$ gcloud redis instances describe myinstance --region=us-central1 \
  | grep host
host: 10.0.0.4

Se vai a Storage > Memorystore in Google Cloud Console, dovresti essere in grado di vedere l'istanza in "stato" "pronto":

4. Configurare un&#39;istanza di Compute Engine

Crea un'istanza di Compute Engine nella stessa area geografica.

$ gcloud compute instances create instance-1 --zone us-central1-c

Al termine dell'operazione, l'istanza sarà pronta per essere utilizzata.

Connettiti all'istanza tramite SSH andando a Compute > Compute Engine > istanze VM e fai clic su SSH nella colonna Connetti:

Nella shell dell'istanza di macchina virtuale (VM) (non Cloud Shell), installa OpenJDK, Maven, telnet:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

Attendi il completamento dell'installazione e vai al passaggio successivo.

5. Configurare un&#39;app Spring Boot

Crea un nuovo progetto di avvio in primavera con le dipendenze web, redis e cache:

$ curl https://start.spring.io/starter.tgz \
  -d dependencies=web,redis,cache -d language=java -d baseDir=cache-app \
  | tar -xzvf - && cd cache-app

Modifica il file application.properties per configurare l'app in modo che utilizzi l'indirizzo IP dell'istanza Memorystore per l'host Redis.

$ nano src/main/resources/application.properties

Aggiungi la seguente riga con il tuo indirizzo IP Memorystore for Redis (di un paio di passaggi fa):

spring.redis.host=<memorystore-host-ip-address> 

Aggiungi una nuova riga dopo quella riga e crea una classe Java del controller REST:

$ nano src/main/java/com/example/demo/HelloWorldController.java

Inserisci nel file i seguenti contenuti:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
@Autowired
private StringRedisTemplate template;

@RequestMapping("/hello/{name}")
@Cacheable("hello")
public String hello(@PathVariable String name) throws InterruptedException {
  Thread.sleep(5000);
  return "Hello " + name;
 }
}

L'annotazione @RequestMapping espone il metodo come endpoint HTTP e mappa parte del percorso a un parametro metodo (come indicato dall'annotazione @PathVariable).

L'annotazione @Cacheable("hello") indica che l'esecuzione del metodo deve essere memorizzata nella cache e il nome della cache è "hello"." Viene utilizzato in combinazione con il valore parametro come chiave cache. Vedrai un esempio in seguito nel lab del codice.

Devi inoltre attivare la memorizzazione nella cache nella classe dell'app Spring Boot.

Modifica DemoApplication.java:

$ nano src/main/java/com/example/demo/DemoApplication.java

Importa org.springframework.cache.annotation.EnableCaching e annota la classe con questa annotazione. Il risultato dovrebbe essere simile al seguente:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class DemoApplication {

public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }
}

6. Esegui l&#39;app e accedi all&#39;endpoint

Ora puoi eseguire l'app.

$ mvn spring-boot:run

Apri un'altra connessione SSH all'istanza come hai fatto in precedenza. Nella nuova finestra SSH, accedi più volte all'endpoint /hello/, passando "bob" come nome.

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m5.408s
user        0m0.036s
sys        0m0.009s

$ time curl http://localhost:8080/hello/bob 
Hello bob!

real        0m0.092s
user        0m0.021s
sys        0m0.027s

Come puoi notare, la prima richiesta è durata cinque secondi, ma la successiva è stata molto più veloce, nonostante il metodo Thread.sleep(5000) sia stato richiamato. Questo perché il metodo effettivo viene eseguito una sola volta e il risultato viene memorizzato nella cache. Ogni chiamata successiva restituisce il risultato direttamente dalla cache.

7. Esamina oggetti memorizzati nella cache

Puoi vedere esattamente ciò che l'app ha memorizzato nella cache. Dallo stesso terminale che hai utilizzato nel passaggio precedente, connettiti all'host Memorystore for Redis utilizzando telnet:

$ telnet <memorystore-host-ip-address> 6379

Per visualizzare l'elenco delle chiavi cache, utilizza il seguente comando:

KEYS *
hello::bob

Come puoi vedere, il nome della cache viene utilizzato come prefisso per la chiave e il valore del parametro viene utilizzato come seconda parte.

Per recuperare il valore, utilizza il comando GET:

$ GET hello::bob
   Hello bob!

Utilizza il comando QUIT per uscire.

8. Esegui la pulizia

Per eseguire la pulizia, elimina le istanze di Compute Engine e Memorystore da Cloud Shell.

Elimina l'istanza Compute:

$ gcloud compute instances delete instance-1 --zone us-central1-c

Elimina l'istanza Memorystore for Redis:

$ gcloud redis instances delete myinstance --region=us-central1

9. Complimenti!

Hai creato Memorystore for Redis e un'istanza di Compute Engine. Inoltre, hai configurato un'app per l'avvio Spring in modo che utilizzi Memorystore con la memorizzazione dei dati nella cache di Spring Boot.

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.