В этой статье описывается простой способ реализации службы кэширования в Java Spring Boot с использованием Google Guava CacheAPI.
Потребность в кеше
Приложения приобретают все более распределенный характер, что требует увеличения объема сетевого трафика в сквозном функциональном потоке. Внедрение шаблонов микросервисов позволяет программистам легко создавать и поддерживать приложения, но вносит больше сетевых задержек в общий поток приложений, чем монолитные приложения.
Чтобы свести к минимуму такую задержку в сети и повысить общую производительность приложений, программистам необходимо определить возможности для временного локального хранения часто используемых данных, чтобы избежать избыточного/ненужного сетевого трафика.
Что мы можем кэшировать
- Статические данные, которые не меняются
- Часто запрашиваемые данные, которые не меняются в течение определенного периода времени.
- Когда мы используем кэшированные данные, мы должны выбрать разумную продолжительность истечения срока действия, чтобы аннулировать/удалить сохраненные записи.
- По возможности храните в кэше только необходимые данные, чтобы избежать перегрузки памяти сервера приложений (особенно при использовании хранилища кэша в памяти).
Что такое кэш гуавы
Guava Cache — это библиотека, предоставленная Google для реализации простого внутрипроцессного хранилища кэшей. Guava Cache — это инкрементный кеш, больше похожий на ConcurrentMap, с дополнительной функцией, которая автоматически делает записи недействительными при определенных настраиваемых условиях истечения срока действия.
Пример реализации кэша Guava
Давайте посмотрим, как мы можем реализовать простое Cache-Store, используя библиотеку Guava Cache.
В оставшейся части статьи подробно описаны все шаги, необходимые для реализации техники кэширования. Если это полезно, вы также можете загрузить окончательный исходный код из Ссылка на GitHub — Реализация кэша Guava
Шаг 1: Создайте проект Spring Boot
Нам нужен один проект Spring Boot. Базовый скелет можно быстро создать с помощью https://start.spring.io/, как показано ниже:
Шаг 2. Напишите HTTP GET REST API
Напишите один пример REST API, как описано ниже. В этом API мы моделируем вызов серверной службы, добавляя преднамеренное время ожидания. На следующем шаге мы представим Guava Cache для кэширования ответа API и уменьшения общей задержки.
Когда мы создадим и запустим это приложение, оно выдаст приведенный ниже вывод, который показывает некоторую задержку, поскольку каждый раз, когда вызов отправляется в серверную службу для извлечения данных,
Шаг 3: Добавьте зависимость от гуавы
В файле build.gradle добавьте библиотеку Guava в список зависимостей как,
compile group: 'com.google.guava', name: 'guava', version: '30.0-jre'
Шаг 4: Определите класс, чтобы обеспечить кэш-хранилище для любого универсального типа ‹T›
Давайте назовем этот класс CacheStore, который может помочь нам создать экземпляр Cache для любого универсального типа.
Обратите внимание: expireAfterWrite() предоставляет возможность аннулировать записи кэша в соответствии с предоставленными параметрами.
Шаг 5: Определите Java Bean для создания нового Cache Store типа записи Employee
Шаг 6. Измените класс ApiController для реализации кэширования записей сотрудников.
Здесь, на этом этапе, мы будем хранить записи о сотрудниках в кэше Guava.
Обратите внимание:
- По первому запросу мы не найдем запись Employee в Cache. И нам нужно вызвать внутренний API, чтобы получить запись о сотруднике. (Здесь внутренний API имеет преднамеренную задержку для имитации HTTP-вызова по сети.)
- Извлеченная запись сотрудника должна быть сначала сохранена в кэше, прежде чем возвращаться потребителю.
- Для последующих запросов мы будем находить запись Employee в Cache. Мы можем немедленно вернуть кешированную запись Employee в ответе, пропустив вызов внутреннего API.
- На шаге №5 мы создали Cache-Store со сроком действия 120 секунд. Поэтому LoadingCache будет хранить запись о сотруднике только в течение 120 секунд. Guava Cache будет отслеживать время и аннулировать/удалять запись о сотруднике из кеша самостоятельно через 120 секунд.
Шаг 7: Демонстрация
Создайте и запустите приложение ApiController локально. Чтобы проверить кэширование, перейдите по URL-адресу:
http://localhost:8080/employee/1
Поскольку это будет первый вызов, ключ сотрудника «1» не будет найден в кэше. Поэтому будет запущен вызов внутренней службы, и мы увидим некоторую задержку в ответе.
Протестируйте тот же URL-адрес еще раз, и вы увидите улучшение времени отклика, поскольку запись из кэша используется за счет пропуска вызова серверной службы.
Затем проверьте идентификатор другого сотрудника:
http://localhost:8080/employee/2
Этот новый ключ сотрудника «2» отсутствует в кэше. Поэтому для получения сведений инициируется вызов внутренней службы.
См. последовательные журналы ниже для всех 3 тестов:
Шаг 8. Повторное использование класса CacheStore‹T› для создания другого Cache-Store с записью другого типа.
После того, как мы выполним шаги с 1 по 6, у нас будет возможность быстро добавить новое хранилище кэша с любым количеством типов записей.
Обратитесь к приведенному ниже примеру, чтобы узнать, какие изменения необходимы для создания любого нового Cache-Store:
Обратите внимание: здесь Product.java и ProductService.Java соответствуют тому же шаблону, что и ранее предоставленный Employee.Java. и EmployeeService.Java. Если вы заинтересованы, вы можете загрузить полный исходный код с GitHub Link — Implementing Guava Cache.
Обратите внимание, что productNameCachestore кэширует только обязательное поле, даже если серверная служба возвращает объект большего размера. Это позволяет избежать ненужной перегрузки памяти сервера приложений.
Резюме
В этой статье мы увидели простой способ реализации кэша Guava в Spring Boot.
Загрузите полный исходный код для этой статьи со страницы GitHub Link — Implementing Guava Cache
Удачного кодирования!