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 das 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?
Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?
Einrichtung der Umgebung im eigenen Tempo
Wenn Sie noch kein Google-Konto (Gmail oder Google Apps) haben, müssen Sie eins erstellen. Melden Sie sich in der Google Cloud Platform Console (console.cloud.google.com) an und erstellen Sie ein neues Projekt:
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 in diesem Codelab später als PROJECT_ID
bezeichnet.
Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.
Dieses Codelab sollte Sie nicht mehr als ein paar Dollar kosten, aber es könnte mehr sein, wenn Sie sich für mehr Ressourcen entscheiden oder wenn Sie sie laufen lassen (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).
Neuen Nutzern der Google Cloud Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.
Google Cloud Shell aktivieren
Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:
Klicken Sie dann auf "Cloud Shell starten":
Die Bereitstellung und Verbindung mit der Umgebung dauert nur einen Moment:
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 auf der Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Sie können die meisten, wenn nicht sogar alle Schritte in diesem Lab einfach mit einem Browser oder Ihrem Google Chromebook durchführen.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID eingestellt ist.
Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
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].
Starten Sie Cloud Shell.
Nachdem Cloud Shell gestartet wurde, können Sie über die Befehlszeile eine neue Memorystore-Instanz erstellen.
$ gcloud redis instances create myinstance --size=1 --region=us-central1
Wenn die Memorystore API nicht aktiviert ist, werden Sie gefragt, ob Sie sie aktivieren möchten. Antworte mit 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].
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
Wenn Sie in der Google Cloud Console zu Storage > Memorystore wechseln, sollte Ihre Instanz den Status „Bereit“ haben :
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 eine SSH-Verbindung zu Ihrer Instanz her, indem Sie zu Compute > Compute Engine > VM-Instanzen gehen und in der Spalte Verbinden auf SSH klicken:
Installieren Sie in der Shell der VM-Instanz (nicht in Cloud Shell) OpenJDK, Maven und Telnet:
$ sudo apt-get install openjdk-8-jdk-headless maven telnet
Warten Sie, bis die Installation abgeschlossen ist, und fahren Sie dann mit dem nächsten Schritt fort.
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 \ | tar -xzvf - && cd cache-app
Bearbeiten Sie die Datei application.properties
, um die App so zu konfigurieren, dass sie die IP-Adresse des Memorystore-Hosts für Redis 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.redis.host=<memorystore-host-ip-address>
Fügen Sie danach eine neue Zeile ein und erstellen Sie eine REST-Controller-Java-Klasse:
$ 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.
Außerdem müssen Sie das Caching in der Spring Boot-App-Klasse aktivieren.
DemoApplication.java
bearbeiten:
$ nano src/main/java/com/example/demo/DemoApplication.java
Importieren Sie org.springframework.cache.annotation.EnableCaching
und fügen Sie die Annotation in die Klasse ein. 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); } }
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 jedoch deutlich schneller, obwohl Sie die 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.
Sie können genau sehen, was die App im Cache gespeichert hat. Stellen Sie über dasselbe Terminal, das Sie im vorherigen Schritt verwendet haben, eine Telnet-Verbindung zum Memorystore for Redis-Host her:
$ telnet <memorystore-host-ip-address> 6379
Verwenden Sie den folgenden Befehl, um die Liste der Cache-Schlüssel aufzurufen:
KEYS * 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:
$ GET hello::bob Hello bob!
Verwenden Sie den Befehl QUIT
, um das Programm zu beenden.
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
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
- Spring Boot-Caching
- Memorystore
- Spring on Google Cloud-Projekt
- GitHub-Repository für Spring on Google Cloud
- Java in Google Cloud
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.