Almacena datos en caché de una app de Spring Boot con Memorystore

1. Descripción general

Memorystore para Redis es un servicio de Redis completamente administrado para Google Cloud. Las apps que se ejecutan en Google Cloud pueden lograr un rendimiento extremo aprovechando el servicio de Redis altamente escalable, disponible y seguro sin la carga de administrar implementaciones complejas de Redis. Se puede usar como backend para el almacenamiento en caché de datos y, así, mejorar el rendimiento de las apps de Spring Boot. En el codelab, se explica cómo configurarlo.

Qué aprenderás

  • Cómo usar Memorystore como backend de caché para una app de Spring Boot

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador, como Google Chrome
  • Conocimientos de editores de texto estándares de Linux, como Vim, Emacs y GNU Nano

¿Cómo usarás el codelab?

Solo lectura Lee y completa los ejercicios .

¿Cómo calificarías tu experiencia con los servicios de Google Cloud?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud ShellH7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si nunca ha iniciado Cloud Shell, aparecerá una pantalla intermedia (debajo de la mitad inferior de la página) que describe qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verlo). Así es como se ve la pantalla única:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador o tu Chromebook.

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que está autenticado:
gcloud auth list

Resultado del comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Configura una instancia de Memorystore para Redis

Inicie Cloud Shell.

Después del inicio de Cloud Shell, usa la línea de comandos para habilitar la API de Memorystore y crear una nueva instancia de Memorystore.

$ gcloud services enable redis.googleapis.com
$ gcloud redis instances create myinstance --size=1 --region=us-central1

Una vez finalizada la operación, tu instancia estará lista para usarse.

Obtén la dirección IP del host de Redis de la instancia mediante la ejecución del siguiente comando. La usarás de nuevo más adelante cuando configures la app de Spring Boot.

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

En la consola de Google Cloud, navega a Bases de datos > Memorystore > Redis Tu instancia debería estar "lista" estado :

ee90b43f15a6dc1f.png

4. Configura una instancia de Compute Engine

Crea una instancia de Compute Engine en la misma región.

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

Una vez finalizada la operación, tu instancia estará lista para usarse.

Conéctate a la instancia a través de SSH con el siguiente comando:

$ gcloud compute ssh instance-1 --zone us-central1-c

Como alternativa, navega a Procesamiento > Compute Engine > Instancias de VM y haz clic en SSH en la columna Conectar:

a87bd437a0c8c7b4.png

En la shell de la instancia de máquina virtual (VM) (no Cloud Shell), instala las herramientas OpenJDK, Maven y Redis:

$ sudo apt-get install openjdk-17-jdk-headless maven redis-tools

Espera a que se complete la instalación y, luego, continúa con el siguiente paso.

5. Configura una app de Spring Boot

Crea un proyecto de Spring Boot nuevo con las dependencias web, redis y cache:

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

Edita el archivo application.properties para configurar la app de modo que use la dirección IP de la instancia de Memorystore para el host de Redis.

$ nano src/main/resources/application.properties

Agrega la siguiente línea a tu dirección IP de Memorystore para Redis (de hace un par de pasos):

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

Agrega una línea nueva después de esa y crea una clase Java de controlador de REST:

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

Ingresa el siguiente contenido en el archivo:

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;
 }
}

La anotación @RequestMapping expone el método como un extremo HTTP y asigna parte de la ruta de acceso a un parámetro del método (como lo indica la anotación @PathVariable).

La anotación @Cacheable("hello") indica que la ejecución del método se debe almacenar en caché y que el nombre de la caché es "hello". Se usa en combinación con el valor del parámetro como una clave de caché. Verás un ejemplo más adelante en el codelab.

A continuación, habilitaremos el almacenamiento en caché en la clase de la app de Spring Boot. Edita DemoApplication.java:

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

Importa org.springframework.cache.annotation.EnableCaching y anota la clase con esta anotación. El resultado debería verse como el siguiente:

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. Ejecuta la app y accede al extremo

Asegúrate de que JAVA_HOME esté configurado en la versión correcta:

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Ya está todo listo para que ejecutes la app.

$ mvn spring-boot:run

Abre otra conexión SSH a tu instancia de la misma manera que lo hiciste antes. En la nueva ventana SSH, accede al extremo /hello/ varias veces y pasa “bob” como nombre.

$ 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

Observa que la primera vez que la solicitud tardó cinco segundos, pero la siguiente fue significativamente más rápida a pesar de que tienes invocación a Thread.sleep(5000) en el método. Esto se debe a que el método real se ejecutó solo una vez y el resultado se guardó en la caché. Cada llamada posterior muestra el resultado directamente desde la caché.

7. Revisa los objetos almacenados en caché

Puedes ver exactamente lo que la app almacenó en caché. Desde la misma terminal que usaste en el paso anterior, conéctate al host de Memorystore para Redis con redis-cli:

$ redis-cli -h <memorystore-host-ip-address>

Para ver la lista de claves de caché, usa el siguiente comando:

:6379> KEYS *
1) "hello::bob"

Como puedes ver, el nombre de la caché se usa como prefijo de la clave y el valor del parámetro se usa como la segunda parte.

Para recuperar el valor, usa el comando GET:

:6379> GET hello::bob
   Hello bob!

Usa el comando exit para salir.

8. Limpia

Para realizar una limpieza, borra las instancias de Compute Engine y Memorystore de Cloud Shell.

Borra la instancia de procesamiento:

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

Borra la instancia de Memorystore para Redis:

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

9. ¡Felicitaciones!

Creaste Memorystore para Redis y una instancia de Compute Engine. Además, configuraste una app de Spring Boot para usar Memorystore con el almacenamiento en caché de Spring Boot.

Más información

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.