Memorystore for Redis è un servizio Redis completamente gestito per Google Cloud. Le app in esecuzione su Google Cloud possono raggiungere prestazioni estreme utilizzando il servizio Redis, estremamente sicuro, disponibile e scalabile, senza il carico di dover gestire complessi deployment 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 della cache per un'app Spring Boot.
Che cosa ti serve
- Un progetto Google Cloud
- Un browser, ad esempio Google Chrome
- Familiarità con gli editor di testo standard di Linux, ad esempio Vim, Emacs e GNU Nano
Come utilizzerai il codelab?
Come valuteresti la tua esperienza con i servizi Google Cloud?
Configurazione dell'ambiente autonoma
Se non hai ancora un Account Google (Gmail o Google Apps), devi crearne uno. Accedi alla console di Google Cloud (console.cloud.google.com) e crea un nuovo progetto:
Ricorda l'ID progetto, un nome univoco per tutti i progetti Google Cloud (il nome riportato sopra è già stato utilizzato e non funzionerà per te, mi dispiace). In questo codelab verrà chiamato PROJECT_ID
.
Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse Google Cloud.
L'esecuzione di questo codelab non dovrebbe costarti più di qualche dollaro, ma potrebbe essere più cara 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 possono beneficiare di una prova senza costi di 300$.
Attiva Google Cloud Shell
Nella console GCP, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:
Poi fai clic su "Avvia Cloud Shell":
Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente:
Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, il lavoro in questo lab può essere svolgersi semplicemente con un browser o con Google Chromebook.
Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e 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].
Avvia Cloud Shell.
Dopo l'avvio 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 abilitarla. Rispondi sì.
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 l'uso.
Recupera l'indirizzo IP host Redis dell'istanza eseguendo questo comando. Lo utilizzerai di nuovo in un secondo momento 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 nella console Google Cloud, dovresti vedere la tua istanza nello stato "Pronto":
Crea un'istanza Compute Engine nella stessa regione.
$ gcloud compute instances create instance-1 --zone us-central1-c
Al termine dell'operazione, l'istanza sarà pronta per l'uso.
Connettiti all'istanza tramite SSH andando su 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 e telnet:
$ sudo apt-get install openjdk-8-jdk-headless maven telnet
Attendi il completamento dell'installazione, quindi procedi al passaggio successivo.
Crea un nuovo progetto Spring Boot 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 l'indirizzo IP di Memorystore for Redis (di qualche passaggio fa):
spring.redis.host=<memorystore-host-ip-address>
Aggiungi una nuova riga e crea una classe Java del controller REST:
$ nano src/main/java/com/example/demo/HelloWorldController.java
Inserisci i seguenti contenuti nel file:
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 del metodo (come indicato dall'annotazione @PathVariable
).
L'annotazione @Cacheable("hello")
indica che l'esecuzione del metodo deve essere memorizzata nella cache e che il nome della cache è "hello
". Viene utilizzata in combinazione con il valore del parametro come chiave cache. Vedrai un esempio più avanti nel codelab.
Inoltre, devi abilitare 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 il corso con questa annotazione. Il risultato dovrebbe essere simile a questo:
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); } }
Ora puoi eseguire l'app.
$ mvn spring-boot:run
Apri un'altra connessione SSH all'istanza nello stesso modo in cui 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
Nota che la prima volta la richiesta ha impiegato cinque secondi, ma la successiva è stata molto più veloce nonostante la presenza di Thread.sleep(5000)
invocazioni nel metodo. Questo perché il metodo effettivo è stato eseguito una sola volta e il risultato è stato inserito nella cache. Ogni chiamata successiva restituisce il risultato direttamente dalla cache.
Puoi vedere esattamente cosa ha memorizzato nella cache l'app. Dallo stesso terminale utilizzato nel passaggio precedente, connettiti all'host Memorystore for Redis utilizzando telnet:
$ telnet <memorystore-host-ip-address> 6379
Per visualizzare l'elenco delle chiavi della 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.
Per eseguire la pulizia, elimina le istanze Compute Engine e Memorystore da Cloud Shell.
Elimina l'istanza di calcolo:
$ gcloud compute instances delete instance-1 --zone us-central1-c
Elimina l'istanza Memorystore for Redis:
$ gcloud redis instances delete myinstance --region=us-central1
Hai creato Memorystore for Redis e un'istanza Compute Engine. Inoltre, hai configurato un'app Spring Boot per utilizzare Memorystore con la memorizzazione nella cache di Spring Boot.
Scopri di più
- Memorizzazione nella cache di Spring Boot
- Memorystore
- Progetto Spring on Google Cloud
- Repository GitHub di Spring su Google Cloud
- Java su Google Cloud
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.