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

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

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

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

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

  • Облачный проект Google
  • Браузер, например Google Chrome
  • Знакомство со стандартными текстовыми редакторами Linux, такими как Vim, Emacs и GNU Nano.

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

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

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

Новичок Средний Опытный

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

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

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Активировать облачную оболочку Google

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

Затем нажмите «Запустить Cloud Shell»:

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

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

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

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

gcloud auth list

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

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

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

Запустите Облачную оболочку.

После запуска Cloud Shell вы можете использовать командную строку для создания нового экземпляра Memorystore.

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

Если API Memorystore не был включен, вас спросят, хотите ли вы его включить. Ответить й .

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].

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

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

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

Если вы перейдете в Storage > Memorystore в Google Cloud Console, вы сможете увидеть свой экземпляр в состоянии «готово»:

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

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

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

Подключитесь к своему экземпляру через SSH, выбрав Compute > Compute Engine > VM instances и нажав SSH в столбце Connect :

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

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

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

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

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

$ nano src/main/resources/application.properties

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

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

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

$ 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) в методе. Это потому, что фактический метод был выполнен только один раз, а результат был помещен в кеш. Каждый последующий вызов возвращает результат непосредственно из кеша.

На самом деле вы можете увидеть, что именно кэшировало приложение. С того же терминала, который вы использовали на предыдущем шаге, подключитесь к узлу Memorystore for Redis с помощью telnet:

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

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

KEYS *
hello::bob

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

Чтобы получить значение, используйте команду GET :

$ GET hello::bob
   Hello bob!

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

Для очистки удалите экземпляры 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

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

Учить больше

Лицензия

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