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

1. Обзор

Memorystore для 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

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

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

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

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

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWapJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecH rbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbha

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью простого браузера или 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 Console перейдите в «Базы данных» > «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-адресом вашего Memorystore для 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 для 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 для 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 License.