Buforowanie danych aplikacji Spring Boot za pomocą Memorystore

Memorystore for Redis to w pełni zarządzana usługa Redis dla Google Cloud. Aplikacje działające w Google Cloud mogą osiągać ekstremalną wydajność dzięki wysoce skalowalnej, dostępnej i bezpiecznej usłudze Redis bez konieczności zarządzania złożonymi wdrożeniami Redis. Może być używany jako backend do buforowania danych, aby zwiększyć wydajność aplikacji Spring Boot. W tym samouczku znajdziesz instrukcje konfiguracji.

Czego się nauczysz

  • Jak używać Memorystore jako backendu pamięci podręcznej w aplikacji Spring Boot.

Czego potrzebujesz

  • projekt Google Cloud,
  • przeglądarka, np. Google Chrome;
  • Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, Emacs i GNU Nano

Jak zamierzasz wykorzystać ten codelab?

Tylko do odczytu Czytanie i wykonywanie ćwiczeń

Jak oceniasz korzystanie z usług Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

Samodzielne konfigurowanie środowiska

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

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

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów Google Cloud.

Wykonanie tego samouczka nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz je uruchomione (patrz sekcja „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Aktywuj Google Cloud Shell

W konsoli GCP kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

Następnie kliknij „Uruchom Cloud Shell”:

Udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil:

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelniania. Większość, jeśli nie wszystkie, zadań w tym laboratorium można wykonać za pomocą przeglądarki lub Chromebooka Google.

Po połączeniu z Cloud Shell zobaczysz, że jesteś już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID.

Aby potwierdzić, że masz autoryzację, uruchom w Cloud Shell to polecenie:

gcloud auth list

Wynik polecenia

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz ustawić go za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

Uruchom Cloud Shell.

Po uruchomieniu Cloud Shell możesz utworzyć nową instancję Memorystore za pomocą wiersza poleceń.

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

Jeśli interfejs Memorystore API nie jest włączony, pojawi się pytanie, czy chcesz go włączyć. Odpowiedz 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].

Po zakończeniu operacji instancja będzie gotowa do użycia.

Aby uzyskać adres IP hosta Redis instancji, uruchom to polecenie. Użyjesz go ponownie później podczas konfigurowania aplikacji Spring Boot.

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

Jeśli w konsoli Google Cloud otworzysz Storage (Przechowywanie) > Memorystore, powinna być widoczna instancja w stanie „gotowa”:

Utwórz instancję Compute Engine w tym samym regionie.

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

Po zakończeniu operacji instancja będzie gotowa do użycia.

Połącz się z instancją przez SSH. W tym celu otwórz Compute > Compute Engine > Instancje maszyn wirtualnych i w kolumnie Połącz kliknij SSH:

W powłoce instancji maszyny wirtualnej (nie w Cloud Shell) zainstaluj OpenJDK, Maven i telnet:

$ sudo apt-get install openjdk-8-jdk-headless maven telnet

Poczekaj na zakończenie instalacji, a potem przejdź do następnego kroku.

Utwórz nowy projekt Spring Boot z zależnościami web, redis i 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

Edytuj plik application.properties , aby skonfigurować aplikację do używania adresu IP instancji Memorystore for Redis jako hosta.

$ nano src/main/resources/application.properties

Dodaj ten wiersz z adresem IP Memorystore for Redis (z poprzednich kroków):

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

Dodaj po nim nowy wiersz i utwórz klasę Java kontrolera REST:

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

Wklej do pliku tę zawartość:

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

Adnotacja @RequestMapping udostępnia metodę jako punkt końcowy HTTP i mapuje część ścieżki na parametr metody (wskazany przez adnotację @PathVariable).

Adnotacja @Cacheable("hello") wskazuje, że wykonanie metody powinno być przechowywane w pamięci podręcznej, a nazwa pamięci podręcznej to „hello”. Jest ona używana w połączeniu z wartością parametru jako klucz pamięci podręcznej. Przykład zobaczysz w dalszej części tego modułu.

Musisz też włączyć buforowanie w klasie aplikacji Spring Boot.

Edytuj DemoApplication.java:

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

Importuj org.springframework.cache.annotation.EnableCaching i dodaj do zajęć adnotację. Wynik powinien wyglądać tak:

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

Możesz teraz uruchomić aplikację.

$ mvn spring-boot:run

Otwórz kolejne połączenie SSH z instancją w taki sam sposób jak wcześniej. W nowym oknie SSH uzyskaj dostęp do punktu końcowego /hello/ kilka razy, przekazując „bob” jako nazwę.

$ 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

Zauważ, że pierwsze żądanie zajęło 5 sekund, a kolejne było znacznie szybsze, mimo że w metodzie masz Thread.sleep(5000)invocation. Dzieje się tak, ponieważ rzeczywista metoda została wykonana tylko raz, a wynik został umieszczony w pamięci podręcznej. Każde kolejne wywołanie zwraca wynik bezpośrednio z pamięci podręcznej.

Możesz dokładnie sprawdzić, co aplikacja zapisała w pamięci podręcznej. Z tego samego terminala, którego używasz w poprzednim kroku, połącz się z hostem Memorystore for Redis za pomocą telnetu:

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

Aby wyświetlić listę kluczy pamięci podręcznej, użyj tego polecenia:

KEYS *
hello::bob

Jak widać, nazwa pamięci podręcznej jest używana jako prefiks klucza, a wartość parametru jako druga część.

Aby pobrać wartość, użyj polecenia GET:

$ GET hello::bob
   Hello bob!

Aby wyjść, użyj polecenia QUIT.

Aby przeprowadzić czyszczenie, usuń instancje Compute Engine i Memorystore z Cloud Shell.

Usuń instancję obliczeniową:

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

Usuń instancję Memorystore for Redis:

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

Utworzono instancję Memorystore for Redis i instancję Compute Engine. Skonfigurowaliśmy też aplikację Spring Boot, aby korzystała z Memorystore z pamięcią podręczną Spring Boot.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.