Daten aus einer Spring Boot-Anwendung mit Memorystore im Cache speichern

1. Übersicht

Memorystore for Redis ist ein vollständig verwalteter Redis-Dienst für Google Cloud. Anwendungen, die in Google Cloud ausgeführt werden, können mithilfe des hoch skalierbaren, hochverfügbaren und sicheren Redis-Dienstes eine extrem hohe Leistung erzielen, ohne dass komplexe Redis-Bereitstellungen verwaltet werden müssen. Er kann als Backend für das Daten-Caching verwendet werden, um die Leistung von Spring Boot-Apps zu verbessern. Im Codelab wird beschrieben, wie Sie es einrichten.

Lerninhalte

  • Wie Sie Memorystore als Cache-Back-End für eine Spring Boot-App verwenden.

Voraussetzungen

  • Ein Google Cloud-Projekt
  • Ein Browser, z. B. Google Chrome
  • Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, Emacs und GNU Nano

Wie werden Sie das Codelab verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder G Suite-Konto haben, müssen Sie eines erstellen.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird später in diesem Codelab als PROJECT_ID bezeichnet.

  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“, in der Sie erfahren, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

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

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser oder Ihrem Chromebook erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Memorystore for Redis-Instanz einrichten

Starten Sie Cloud Shell.

Nachdem Cloud Shell gestartet wurde, aktivieren Sie über die Befehlszeile die Memorystore API und erstellen Sie eine neue Memorystore-Instanz.

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

Nach Abschluss des Vorgangs ist Ihre Instanz einsatzbereit.

Rufen Sie die Redis-Host-IP-Adresse der Instanz mit dem folgenden Befehl ab. Sie benötigen sie später noch einmal, wenn Sie Ihre Spring Boot-App konfigurieren.

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

Rufen Sie in der Google Cloud Console Datenbanken > Memorystore > Redis auf. Ihre Instanz sollte den Status „Bereit“ haben :

ee90b43f15a6dc1f.png

4. Compute Engine-Instanz einrichten

Erstellen Sie eine Compute Engine-Instanz in derselben Region.

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

Nach Abschluss des Vorgangs ist Ihre Instanz einsatzbereit.

Stellen Sie mit dem folgenden Befehl eine SSH-Verbindung zu Ihrer Instanz her:

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

Alternativ können Sie zu Compute > Compute Engine > VM-Instanzen gehen und in der Spalte Verbinden auf SSH klicken:

a87bd437a0c8c7b4.png

Installieren Sie in der Shell der VM-Instanz (nicht in Cloud Shell) OpenJDK, Maven und Redis-Tools:

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

Warten Sie, bis die Installation abgeschlossen ist, und fahren Sie dann mit dem nächsten Schritt fort.

5. Spring Boot-Anwendung einrichten

Erstellen Sie ein neues Spring Boot-Projekt mit den Abhängigkeiten web, redis und 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

Bearbeiten Sie die Datei application.properties, um die App so zu konfigurieren, dass sie die IP-Adresse der Memorystore-Instanz für den Redis-Host verwendet.

$ nano src/main/resources/application.properties

Fügen Sie die folgende Zeile mit Ihrer Memorystore for Redis-IP-Adresse (von vor einigen Schritten) hinzu:

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

Fügen Sie danach eine neue Zeile ein und erstellen Sie eine Java-Klasse für den REST-Controller:

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

Fügen Sie der Datei den folgenden Inhalt hinzu:

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

Die Annotation @RequestMapping macht die Methode als HTTP-Endpunkt verfügbar und ordnet einen Teil des Pfads einem Methodenparameter zu (wie durch die Annotation @PathVariable angegeben).

Die Annotation @Cacheable("hello") gibt an, dass die Ausführung der Methode im Cache gespeichert werden soll. Der Cache-Name ist „hello“. Sie wird in Kombination mit dem Parameterwert als Cache-Schlüssel verwendet. Ein Beispiel sehen Sie später im Codelab.

Als Nächstes aktivieren wir das Caching in der Spring Boot-App-Klasse. DemoApplication.java bearbeiten:

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

Importieren Sie org.springframework.cache.annotation.EnableCaching und versehen Sie die Klasse mit dieser Annotation. Das Ergebnis sollte so aussehen:

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. App ausführen und auf den Endpunkt zugreifen

Prüfen Sie, ob JAVA_HOME auf die richtige Version eingestellt ist:

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

Jetzt können Sie die App ausführen.

$ mvn spring-boot:run

Öffnen Sie eine weitere SSH-Verbindung zu Ihrer Instanz. Gehen Sie dabei so vor wie zuvor. Greifen Sie im neuen SSH-Fenster mehrmals auf den Endpunkt /hello/ zu und übergeben Sie „bob“ als Namen.

$ 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

Die erste Anfrage hat fünf Sekunden gedauert, die nächste war aber deutlich schneller, obwohl Sie Thread.sleep(5000)invocation in der Methode haben. Das liegt daran, dass die eigentliche Methode nur einmal ausgeführt und das Ergebnis im Cache gespeichert wurde. Bei jedem nachfolgenden Aufruf wird das Ergebnis direkt aus dem Cache zurückgegeben.

7. Im Cache gespeicherte Objekte prüfen

Sie können genau sehen, was die App im Cache gespeichert hat. Stellen Sie über dasselbe Terminal, das Sie im vorherigen Schritt verwendet haben, mit redis-cli eine Verbindung zum Memorystore for Redis-Host her:

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

Verwenden Sie den folgenden Befehl, um die Liste der Cache-Schlüssel aufzurufen:

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

Wie Sie sehen, wird der Cache-Name als Präfix für den Schlüssel und der Parameterwert als zweiter Teil verwendet.

Verwenden Sie den Befehl GET, um den Wert abzurufen:

:6379> GET hello::bob
   Hello bob!

Verwenden Sie den Befehl exit, um das Programm zu beenden.

8. Bereinigen

Löschen Sie zum Bereinigen Compute Engine- und Memorystore-Instanzen aus Cloud Shell.

Löschen Sie die Compute-Instanz:

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

Memorystore for Redis-Instanz löschen:

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

9. Glückwunsch!

Sie haben Memorystore for Redis und eine Compute Engine-Instanz erstellt. Außerdem haben Sie eine Spring Boot-App für die Verwendung von Memorystore mit Spring Boot-Caching konfiguriert.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.