Buforowanie danych aplikacji Spring Boot za pomocą Memorystore

1. Omówienie

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ąć ekstremalną wydajność dzięki wykorzystaniu wysoce skalowalnej, dostępnej i bezpiecznej usługi Redis bez konieczności zarządzania złożonymi wdrożeniami Redis. Może służyć jako backend do buforowania danych, który zwiększa wydajność aplikacji Spring Boot. Z ćwiczeń w Codelabs dowiesz się, jak to skonfigurować.

Czego się nauczysz

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

Czego potrzebujesz

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

Jak będziesz używać tych ćwiczeń w Codelabs?

Tylko do odczytu Przeczytaj i wykonaj ćwiczenia

Jak oceniasz usługi Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail lub G Suite, musisz je utworzyć.

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Zapamiętaj identyfikator projektu, unikalną nazwę we wszystkich projektach Google Cloud (powyższa nazwa jest już zajęta i nie będzie Ci odpowiadać). W dalszej części tego ćwiczenia w programie będzie ona określana jako PROJECT_ID.

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

Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Postępuj zgodnie z instrukcjami podanymi w sekcji „Czyszczenie” W tym samouczku znajdziesz wskazówki, jak wyłączyć zasoby, aby uniknąć naliczania opłat. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Jeśli dopiero zaczynasz korzystać z Cloud Shell, wyświetli się ekran pośredni (w części strony widocznej po przewinięciu) z opisem tej funkcji. W takim przypadku kliknij Dalej (nie zobaczysz go więcej). Tak wygląda ten jednorazowy ekran:

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

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Ta maszyna wirtualna ma 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 uwierzytelnianie. Większość czynności z tego ćwiczenia z programowania można wykonać w przeglądarce lub na Chromebooku.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

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

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Konfigurowanie instancji Memorystore for Redis

Uruchom Cloud Shell.

Po uruchomieniu Cloud Shell użyj wiersza poleceń, aby włączyć interfejs Memorystore API i utworzyć nową instancję Memorystore.

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

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

Uzyskaj adres IP hosta redis, uruchamiając poniższe polecenie. Użyjesz go później podczas konfigurowania aplikacji Spring Boot.

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

W konsoli Google Cloud otwórz Bazy danych > Memorystore > Redis. Instancja powinna być w stanie „gotowy” województwo :

ee90b43f15a6dc1f.png

4. Konfigurowanie instancji Compute Engine

utworzyć instancję Compute Engine w tym samym regionie,

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

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

Połącz się z instancją przez SSH za pomocą tego polecenia:

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

Możesz też otworzyć Compute > Compute Engine > Maszyny wirtualne i kliknij SSH w kolumnie Połącz:

a87bd437a0c8c7b4.png

W powłoce maszyny wirtualnej (nie Cloud Shell) zainstaluj narzędzia OpenJDK, Maven i Redis:

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

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

5. Konfigurowanie aplikacji Spring Boot

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 \
  -d type=maven-project \
  | tar -xzvf - && cd cache-app

Edytuj plik application.properties, aby skonfigurować aplikację tak, aby używała adresu IP instancji Memorystore for Redis.

$ nano src/main/resources/application.properties

Dodaj ten wiersz z adresem IP Memorystore for Redis (przed kilkoma krokami):

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

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

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

Umieść w 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 ujawnia metodę jako punkt końcowy HTTP i mapuje część ścieżki na parametr metody (co wskazuje adnotacja @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 używany w połączeniu z wartością parametru jako klucz pamięci podręcznej. W dalszej części modułu dotyczącego kodu zobaczysz przykład.

Następnie włączymy buforowanie w klasie aplikacji Spring Boot. Edytuj DemoApplication.java:

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

Zaimportuj plik org.springframework.cache.annotation.EnableCaching i dodaj do zajęć adnotacje z tą 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);
 }
}

6. Uruchamianie aplikacji i uzyskiwanie dostępu do punktu końcowego

Sprawdź, czy zasada JAVA_HOME jest ustawiona na odpowiednią wersję:

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

Teraz możesz uruchomić aplikację.

$ mvn spring-boot:run

Otwórz inne połączenie SSH ze swoją 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

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

7. Przejrzyj obiekty z pamięci podręcznej

Możesz zobaczyć, co dokładnie aplikacja zapisała w pamięci podręcznej. Za pomocą polecenia redis-cli połącz się z hostem Memorystore for Redis, korzystając z tego samego terminala w poprzednim kroku:

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

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

:6379> KEYS *
1) "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:

:6379> GET hello::bob
   Hello bob!

Aby wyjść, użyj polecenia exit.

8. Czyszczenie danych

Aby wyczyścić dane, 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

9. Gratulacje!

Udało Ci się utworzyć Memorystore for Redis i instancję Compute Engine. Udało Ci się też skonfigurować aplikację Spring Boot tak, aby korzystała z Memorystore z buforowaniem rozruchu wiosennego.

Więcej informacji

Licencja

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