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

Memorystore for Redis ist ein vollständig verwalteter Redis-Dienst für Google Cloud. In Google Cloud ausgeführte Anwendungen können eine extrem hohe Leistung erzielen, indem sie den hoch skalierbaren, verfügbaren und sicheren Redis-Dienst nutzen, ohne komplexe Redis-Bereitstellungen verwalten zu müssen. Es kann als Back-End für das Daten-Caching verwendet werden, um die Leistung von Spring Boot-Apps zu verbessern. Im Codelab wird die Einrichtung erklärt.

Lerninhalte

  • Memorystore als Cache-Back-End für eine Spring Boot-Anwendung verwenden.

Voraussetzungen

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

Wie verwenden Sie das Codelab?

Nur Lesen Übungen lesen und abschließen

Wie würdest du deine Erfahrung mit den Google Cloud-Diensten bewerten?

Fortgeschritten Fortgeschritten Profi

Umgebung im eigenen Tempo einrichten

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

Screenshot von 2016-02-10 12:45:26.png

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. In diesem Codelab wird sie später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.

Das Durchlaufen dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen brauchen oder sie weiterlaufen möchten (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert 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 dass das Projekt auf Ihre PROJECT_ID festgelegt ist.

Führen Sie in Cloud Shell den folgenden Befehl aus, um zu bestätigen, dass 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.

Nach dem Start von Cloud Shell können Sie über die Befehlszeile eine neue Memorystore-Instanz erstellen.

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

Wenn Memorystore API 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 kann die Instanz verwendet werden.

Rufen Sie mit dem folgenden Befehl die redis-Host-IP-Adresse der Instanz ab. Sie benötigen es später später wieder, 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 Speicher & Memorystore gehen, sollte die Instanz im Status „Bereit“ angezeigt werden :

Erstellen Sie eine Compute Engine-Instanz in derselben Region.

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

Nach Abschluss des Vorgangs kann die Instanz verwendet werden.

Stellen Sie über SSH eine Verbindung zu Ihrer Instanz her. Rufen Sie dazu Compute > Compute Engine > VM-Instanzen auf und klicken Sie in der Spalte Verbinden auf SSH:

Installieren Sie in der Shell der virtuellen Maschine (VM) (nicht Cloud Shell) OpenINSTANCE, 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.

Erstelle 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 Anwendung 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 Ihrer Memorystore for Redis-IP-Adresse hinzu (vor einigen Schritten):

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

In der Annotation @RequestMapping wird die Methode als HTTP-Endpunkt verfügbar gemacht und ein Teil des Pfads einem Methodenparameter zugeordnet, wie durch die Annotation @PathVariable angegeben.

Die Annotation @Cacheable("hello") gibt an, dass die Ausführung der Methode im Cache gespeichert werden soll und der Cache-Name „hello“ ist. Diese Kombination wird in Kombination mit dem Parameterwert als Cache-Schlüssel verwendet. Im Code-Lab wird später ein Beispiel angezeigt.

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

Sie können die App jetzt ausführen.

$ mvn spring-boot:run

Öffnen Sie auf dieselbe Weise eine andere SSH-Verbindung zur Instanz wie zuvor. Greifen Sie im neuen SSH-Fenster mehrmals auf den /hello/-Endpunkt 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

Beachten Sie, dass die erste Anfrage zum ersten Mal fünf Sekunden dauerte, die nächste jedoch erheblich schneller war, da Sie in der Methode Thread.sleep(5000)-Aufruf haben. Das liegt daran, dass die tatsächliche Methode nur einmal ausgeführt und das Ergebnis in den Cache verschoben 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 Verbindung zu Memorystore for Redis-Host über Telnet her:

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

Rufen Sie die folgende Liste der Cache-Schlüssel auf:

KEYS *
hello::bob

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

Rufen Sie den Wert mit dem Befehl GET ab:

$ GET hello::bob
   Hello bob!

Beenden Sie mit dem Befehl QUIT.

Löschen Sie für die Bereinigung Compute Engine- und Memorystore-Instanzen aus Cloud Shell.

Löschen Sie die Compute-Instanz:

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

Löschen Sie die Memorystore for Redis-Instanz:

$ 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 so konfiguriert, dass Memorystore mit Spring Boot-Caching verwendet wird.

Weitere Informationen

Lizenz

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