Рубрики
Без рубрики

Весенняя загрузка: Условное кэширование в 6 строках кода.

Добавьте условное кэширование в ваше приложение Spring Boot всего за 3 строки кода. С тегами java, spring, rest, web.

Spring Boot framework включает в себя простое решение для кэширования на стороне сервера, которое легко включить и увидеть немедленные результаты, а еще проще расширить с помощью надежных решений для кэширования с помощью интерфейса на основе аннотаций, который делает все это похожим на конфигурацию, а не на реализацию.

Когда вы работаете с различными источниками данных, ваши правила управления кэшем могут отличаться, и перед выполнением операций кэширования может потребоваться оценить условия. С этим требованием мы рискуем загрязнить наш бизнес-код логикой кэширования. Интерфейс Spring Boot @Cacheable элегантно справляется с этим, используя аннотации Java и Spring Expression Language (SpEL) .

Демонстрационное приложение служит серверной службой для интерфейса Typicode JSONPlaceholder , которая обслуживает образцы RESTful JSON, которые затем можно использовать для демонстраций и тестов, касающихся внешних API.

Для целей этого руководства API JSONPlaceholder имеет значительную сетевую задержку в 3 секунды при каждом вызове для чтения коллекций и записей. Мы могли бы кэшировать каждую отдельную конечную точку, но заинтересованные стороны заявили о дополнительном требовании. Мы можем кэшировать только /пользователей/ , /альбомы и /фотографии конечные точки. Все остальные конечные точки содержат данные, которые по каким-то причинам не могут быть кэшированы. Вместо этого команда интерфейсного интерфейса внедрит загрузочный экран для этих конечных точек.

Чтобы настроить демонстрационную версию, клонируйте Репозиторий Github и проверьте тег 1.0 как новую ветку.

$ git clone https://github.com/LySofDev/java-spring-conditional-caching-demo.git .

$ cd java-spring-conditional-caching-demo

$ git checkout tags/1.0 -b demo

Контроллер Placeholder передаст аргументы из URL-адреса запроса и конфигурации приложения службе JSONPlaceholder , которая выполнит REST-вызов API JSONPlaceholder.

src/main/java/com/example/conditionalcachingdemo/controllers/PlaceholderController.java

@GetMapping("/{name}")
public JSONArray getCollection(@PathVariable String name) {
    return placeholderService.getCollection(name);
}

@GetMapping("/{name}/{id}")
public JSONObject getRecord(@PathVariable String name, @PathVariable int id) {
    return placeholderService.getRecord(name, id);
}

src/main/java/com/example/conditionalcachingdemo/services/PlaceholderServiceImpl.java

@Override
public JSONArray getCollection(String name) {
    try {
        JSONArray collection = restTemplate.getForObject(collectionUrl(name), JSONArray.class);
        Thread.sleep(3000); // Simulating a slow network.
        return collection;
    } catch (HttpClientErrorException.NotFound | InterruptedException e) {
        throw new CollectionNotFoundException();
    }
}

@Override
public JSONObject getRecord(String name, int id) {
    try {
        JSONObject record = restTemplate.getForObject(recordUrl(name, id), JSONObject.class);
        Thread.sleep(3000); // Simulating a slow network.
        return record;
    } catch (HttpClientErrorException.NotFound | InterruptedException e) {
        throw new RecordNotFoundException();
    }
}

Эти два фрагмента кода охватывают суть приложения. Все остальное в репозитории создано для предоставления этой функциональности конечному пользователю. Не стесняйтесь потратить минутку, чтобы просмотреть остальную часть репозитория, поскольку большинство файлов являются краткими.

Чтобы имитировать сетевую задержку API JSONPlaceholder, мы включим в наш код 3-секундный период ожидания после получения данных из API.

src/main/java/com/example/conditionalcachingdemo/ConditionalCachingDemoApplication.java

@SpringBootApplication
@EnableCaching
public class ConditionalCachingDemoApplication {

Реализация кэша основана на интерфейсе Cache Manager . Spring framework включает в себя простую реализацию, которая хранит данные кэша в памяти. Это хорошо для разработки, но в производстве мы захотим использовать внешнее решение для кэширования, такое как Redis или Cassandra. Замена реализации по умолчанию так же проста, как предоставление альтернативной реализации Диспетчер кэша интерфейс.

Мы обновим конфигурацию приложения, включив в нее список кэшируемых конечных точек.

src/main/ресурсы/application.properties

api.url=https://jsonplaceholder.typicode.com/
api.cacheables=users,albums,photos

Затем мы добавим аннотации @Cacheable к контроллеру-заполнителю и обновим сигнатуры методов, включив в них значения конфигурации api.cacheables .

src/main/java/com/example/conditionalcachingdemo/controllers/PlaceholderController.java

@GetMapping("/{name}")
@Cacheable(value = "collections", condition = "#cacheables.contains(#name)")
public JSONArray getCollection(@PathVariable String name, @Value("${api.cacheables}") List cacheables) {
    return placeholderService.getCollection(name);
}

@GetMapping("/{name}/{id}")
@Cacheable(value = "records", key = "#name + #id", condition = "#cacheables.contains(#name)")
public JSONObject getRecord(@PathVariable String name, @PathVariable int id, @Value("${api.cacheables}") List cacheables) {
    return placeholderService.getRecord(name, id);
}

Это оно. Запустите приложение Spring Boot и перейдите к кэшируемым конечным точкам. При первом попадании на конечную точку ответ займет 3 секунды, поскольку кэш еще не был увлажнен. Как только данные из JSONPlaceholder будут загружены в кэш, последующие запросы к конечной точке будут обслуживаться почти немедленно, поскольку данные поступают из памяти, а не из сети.

Аннотация @Cacheable включает в себя два аргумента в методе getCollection . Аргумент value указывает имя кэша для коллекции. Это позволяет нам устанавливать различные конфигурации для каждого кэша, такие как время истечения срока действия и т.д. Аргумент condition подтверждает, что имя конечной точки, указанное в URL-адресе, включено в конфигурацию api.cacheable .

Возможно, вам интересно, почему мы включаем cacheable значение в сигнатуре метода контроллера вместо того, чтобы делать его частью самого класса. Заклинание взаимодействует только с переменными, которые объявлены статическими, но аннотация @Value может быть применена только к переменной экземпляра или параметру метода. Поэтому, чтобы предоставить значения конфигурации api.cacheable в @Cacheable состояние , , мы включим их как часть сигнатуры метода/| Список кэшируемых объектов и позвольте аннотации @Value заполнять значения во время выполнения.

В методе GetRecord мы также используем аргумент key для добавления выражения сопоставления #name + #id для генерации ключа для этой записи в кэше из имени коллекции и идентификатора записи. В методе getcollection ключ по умолчанию будет равен значению переменной name .

Приложение Spring Boot теперь удовлетворяет требованиям к кэшированию и может быть перенесено в среду UAT для демонстрации заинтересованным сторонам, пока разрабатывается базовое решение для кэширования для производственной среды.

Оригинал: “https://dev.to/lysofdev/spring-boot-conditional-caching-in-6-lines-of-code-2f5h”