Przechowywanie danych w pamięci podręcznej aplikacji w Spring rozruchu 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ągnąć maksymalną wydajność dzięki wykorzystaniu skalowalnej, dostępnej i bezpiecznej usługi Redis bez konieczności zarządzania złożonymi wdrożeniami Redis. Może być używany jako backend do buforowania danych, aby poprawić wydajność aplikacji Spring rozruchu. Sposób konfiguracji znajdziesz w ćwiczeniach z programowania.

Czego się nauczysz:

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

Czego potrzebujesz

  • Projekt Google Cloud
  • Przeglądarka taka jak Google Chrome
  • znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, Emacs czy GNU Nano.

Jak będziesz korzystać z ćwiczeń z programowania?

Tylko do odczytu Przeczytanie i ukończenie ćwiczeń

Jak oceniasz swoje doświadczenia z usługami Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

Konfiguracja środowiska we własnym tempie

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:

Zrzut ekranu z 10 września 2016 r., 12:45:26.png

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa została już użyta i nie będzie działać). W ćwiczeniach nazywamy je później PROJECT_ID.

Aby móc używać zasobów Google Cloud, musisz najpierw włączyć płatności w Cloud Console.

Ćwiczenia z programowania nie powinny kosztować więcej niż kilka dolarów, ale mogą być większe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz to uruchomione (zobacz sekcję „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnej wersji próbnej o wartoś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 jest wyposażona we wszystkie potrzebne narzędzia dla programistów. Oferuje trwały katalog domowy o pojemności 5 GB oraz działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Znaczna część (lub nawet całość) zadań wykonywanych w tym module można wykonać w przeglądarce lub na Chromebooku Google.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelniono już projekt i masz już ustawiony identyfikator PROJECT_ID.

Uruchom następujące polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:

gcloud auth list

Polecenie wyjściowe

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

Polecenie wyjściowe

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Polecenie wyjściowe

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 był 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.

Uzyskaj adres IP IP hosta hosta instancji, uruchamiając następujące polecenie. Użyjesz jej później podczas konfigurowania aplikacji Spring rozruchu.

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

Jeśli otworzysz Storage > Memorystore w Google Cloud Console, Twoja instancja będzie widoczna w stanie "ready":

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, wybierając Compute > Compute Engine > Instancje maszyn wirtualnych, i kliknij SSH w kolumnie Połącz:

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

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

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

Utwórz nowy projekt wiosennych butów 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 na potrzeby hosta Redis.

$ nano src/main/resources/application.properties

Dodaj następujący wiersz do adresu IP Memorystore for Redis (sprzed kilku kroków):

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

Następnie dodaj nowy wiersz i utwórz klasę Java REST:

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

W pliku umieść następujące treści:

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 ujawnia metodę jako punkt końcowy HTTP i mapuje część ścieżki do parametru metody (co wskazuje adnotacja @PathVariable).

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

Musisz też włączyć zapisywanie w pamięci podręcznej w klasie aplikacji Spring rozruchu.

Edytuj DemoApplication.java:

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

Zaimportuj org.springframework.cache.annotation.EnableCaching i dodaj do tej adnotacji adnotacje. 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);
 }
}

Teraz możesz uruchomić aplikację.

$ mvn spring-boot:run

Otwórz inne połączenie SSH z instancją w taki sam sposób jak wcześniej. W nowym oknie SSH wielokrotnie uzyskaj dostęp do punktu końcowego /hello/, 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

Pierwsze żądanie zajmowało 5 sekund, ale następne było znacznie szybsze, mimo że w tej metodzie Thread.sleep(5000)wywołano. Dzieje się tak, ponieważ rzeczywista metoda została wykonana tylko raz, a wynik został zapisany w pamięci podręcznej. Każde kolejne wywołanie zwraca wynik bezpośrednio z pamięci podręcznej.

Możesz sprawdzić, co dokładnie znajduje się w pamięci podręcznej aplikacji. Z tego samego terminala, który został użyty w poprzednim kroku, połącz się z hostem Memorystore for Redis za pomocą polecenia telnet:

$ 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 jest używana jako druga część.

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

$ GET hello::bob
   Hello bob!

Aby zamknąć okno, użyj polecenia QUIT.

Aby wyczyścić te dane, usuń instancje Compute Engine i Memorystore z Cloud Shell.

Usuń instancję Compute:

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

Usuń instancję Memorystore for Redis:

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

Udało Ci się utworzyć platformę Memorystore for Redis i instancję Compute Engine. Skonfigurowaliśmy też aplikację Spring Run, żeby używała Memorystore z pamięcią wiosenną.

Więcej informacji

Licencja

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