Кэшируйте данные из приложения Spring Boot с помощью Memorystore.

1. Обзор

Memorystore for Redis — это полностью управляемый сервис Redis для Google Cloud. Приложения, работающие в Google Cloud, могут достичь экстремальной производительности, используя масштабируемый, доступный и безопасный сервис Redis, без необходимости управления сложными развертываниями Redis. Его можно использовать в качестве бэкэнда для кэширования данных, чтобы повысить производительность приложений Spring Boot. В практическом руководстве объясняется, как его настроить.

Что вы узнаете

  • Как использовать Memorystore в качестве кэширующего хранилища для приложения Spring Boot.

Что вам понадобится

  • Проект Google Cloud
  • Браузер, например , Google Chrome
  • Знание стандартных текстовых редакторов Linux, таких как Vim, Emacs и GNU Nano.

Как вы будете использовать этот практический курс?

Только для чтения Прочитайте и выполните упражнения.

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Профессионал

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .

  1. Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

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

Подготовка и подключение к Cloud Shell займут всего несколько минут.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.

После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list

вывод команды

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

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

вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью следующей команды:

gcloud config set project <PROJECT_ID>

вывод команды

Updated property [core/project].

3. Настройте экземпляр Memorystore для Redis.

Запустите Cloud Shell.

После запуска Cloud Shell используйте командную строку, чтобы включить API Memorystore и создать новый экземпляр Memorystore.

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

После завершения операции ваш экземпляр будет готов к использованию.

Получите IP-адрес хоста Redis для экземпляра, выполнив следующую команду. Она понадобится вам позже при настройке приложения Spring Boot.

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

В консоли Google Cloud перейдите в раздел «Базы данных» > «Memorystore» > «Redis» . Ваш экземпляр должен находиться в состоянии «готов».

ee90b43f15a6dc1f.png

4. Настройте экземпляр Compute Engine.

Создайте экземпляр Compute Engine в том же регионе.

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

После завершения операции ваш экземпляр будет готов к использованию.

Подключитесь к своему экземпляру через SSH с помощью следующей команды:

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

В качестве альтернативы перейдите в раздел Вычисления > Compute Engine > Экземпляры виртуальных машин и нажмите SSH в столбце Подключиться :

a87bd437a0c8c7b4.png

В командной оболочке виртуальной машины (ВМ) (не в Cloud Shell) установите инструменты OpenJDK, Maven и Redis:

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

Дождитесь завершения установки, а затем переходите к следующему шагу.

5. Настройте приложение Spring Boot.

Создайте новый проект Spring Boot с зависимостями web , redis и 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

Отредактируйте файл application.properties , чтобы настроить приложение на использование IP-адреса экземпляра Memorystore для хоста Redis.

$ nano src/main/resources/application.properties

Добавьте следующую строку с IP-адресом вашего хранилища памяти для Redis (из предыдущего шага):

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

Добавьте после этого новую строку и создайте Java-класс REST-контроллера:

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

Вставьте в файл следующее содержимое:

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

Аннотация @RequestMapping предоставляет метод в качестве HTTP-конечной точки и сопоставляет часть пути с параметром метода (как указано в аннотации @PathVariable ).

Аннотация @Cacheable("hello") указывает, что выполнение метода должно быть кэшировано, а имя кэша — ` hello . Она используется в сочетании со значением параметра в качестве ключа кэша. Пример вы увидите позже в практическом задании.

Далее мы включим кэширование в классе приложения Spring Boot. Отредактируйте DemoApplication.java :

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

Импортируйте org.springframework.cache.annotation.EnableCaching и аннотируйте класс этой аннотацией. В результате должно получиться следующее:

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. Запустите приложение и получите доступ к конечной точке.

Убедитесь, что JAVA_HOME установлена ​​на правильную версию:

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

Теперь вы готовы запустить приложение!

$ mvn spring-boot:run

Откройте еще одно SSH-соединение с вашим экземпляром тем же способом, что и раньше. В новом окне SSH несколько раз подключитесь к конечной точке /hello/ , передавая в качестве имени " bob ".

$ 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

Обратите внимание, что первый запрос занял пять секунд, но следующий был значительно быстрее, несмотря на то, что в методе вызывается Thread.sleep(5000) . Это потому, что сам метод был выполнен только один раз, и результат был помещен в кэш. Каждый последующий вызов возвращает результат непосредственно из кэша.

7. Проверка кэшированных объектов.

Вы сможете точно увидеть, что именно приложение кэшировало. В том же терминале, что и на предыдущем шаге, подключитесь к хосту Memorystore for Redis с помощью redis-cli:

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

Чтобы просмотреть список ключей кэша, используйте следующую команду:

:6379> KEYS *
1) "hello::bob"

Как видите, имя кэша используется в качестве префикса для ключа, а значение параметра — в качестве второй части.

Для получения значения используйте команду GET :

:6379> GET hello::bob
   Hello bob!

Для выхода используйте команду exit .

8. Уборка

Для завершения процесса удалите экземпляры Compute Engine и Memorystore из Cloud Shell.

Удалите вычислительный экземпляр:

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

Удалите экземпляр Memorystore for Redis:

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

9. Поздравляем!

Вы создали Memorystore для Redis и экземпляр Compute Engine. Кроме того, вы настроили приложение Spring Boot для использования Memorystore с кэшированием Spring Boot !

Узнать больше

Лицензия

Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.