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?
Настройка среды для самостоятельного обучения
Если у вас ещё нет учётной записи Google (Gmail или Google Apps), необходимо её создать . Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не будет вам работать, извините!). Далее в этой практической работе он будет обозначаться как PROJECT_ID
.
Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этой лабораторной работы не должно обойтись вам дороже нескольких долларов, но может обойтись дороже, если вы решите использовать больше ресурсов или оставите их запущенными (см. раздел «Очистка» в конце этого документа).
Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Активировать Google Cloud Shell
В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:
Затем нажмите «Запустить Cloud Shell»:
Подготовка и подключение к среде займет всего несколько минут:
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предлагает постоянный домашний каталог объёмом 5 ГБ и работает в облаке Google Cloud, что значительно повышает производительность сети и аутентификацию. Значительную часть работы в этой лаборатории, если не всю, можно выполнить, просто используя браузер или Chromebook от Google.
После подключения к 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.
После запуска Cloud Shell вы можете использовать командную строку для создания нового экземпляра Memorystore.
$ gcloud redis instances create myinstance --size=1 --region=us-central1
Если API Memorystore не был включён, вам будет предложено включить его. Ответьте 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].
После завершения операции ваш экземпляр будет готов к использованию.
Получите IP-адрес хоста Redis для экземпляра, выполнив следующую команду. Она понадобится вам позже при настройке приложения Spring Boot.
$ gcloud redis instances describe myinstance --region=us-central1 \ | grep host host: 10.0.0.4
Если вы перейдете в раздел Хранилище > 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-адресом вашего хранилища памяти для 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 !
Узнать больше
- Кэширование Spring Boot
- Хранилище памяти
- Проект Spring on Google Cloud
- Spring в репозитории Google Cloud GitHub
- Java в Google Cloud
Лицензия
Данная работа распространяется по лицензии Creative Commons Attribution 2.0 Generic License.