Кэширование вычисляемых ответов в SpringBoot

У меня есть RestController, возвращающий некоторые локализованные объекты, такие как названия книг и описания, переведенные на запрошенный пользователем язык.

@RestController
public class BooksResource {

    @Autowired
    private BookService bookService;

    @GetMapping("/books")
    public List<Book> findBooks(
            @RequestParam(required = false) Boolean active,
            @RequestHeader(value = "accept-language", defaultValue = "*") String acceptedLanguages) {
        return bookService.findAll(active, acceptedLanguages);
    }

    @GetMapping("/books/{bookId}")
    public Book findBook(
            @PathVariable String bookId,
            @RequestHeader(value = "accept-language", defaultValue = "*") String acceptedLanguages) {
        return bookService.findById(bookId, acceptedLanguages);
    }
}

У меня много разных клиентов, делающих один и тот же запрос, но каждый клиент не часто делает повторяющиеся запросы.

Я ищу способ кэшировать локализованные ответы (полностью вычисленные/отображаемые json) с помощью набора параметров запроса и заголовков.

Я знаю, что могу добавить использование Кэшируемый к методам ресурсов и использовать Генератор ключей для создания ключей кеша из заголовка accept-language, возможно, медиа-типа и любых других параметров, которые я хочу.

Однако это будет кэшировать объекты, а не отображаемый json (или XML).

Я прочитал документация по кэшированию статических ресурсов, но это просто установка заголовков управления кешем.

Я хочу избежать сериализации этих объектов, если они уже кэшированы.

Я мог бы изменить методы ресурса, чтобы он возвращал ResponseEntity<String> и сам обрабатывал рендеринг, но мне пришлось бы изменить код в каждом методе ресурса для каждого нового типа мультимедиа, который мы хотим поддерживать.

Я думал об использовании ОбработчикПерехватчик, но он обрабатывает ответ до его рендеринга.

Я думаю, что могу использовать пользовательский CacheProvider, но, похоже, это может потребовать много работы.

0
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать Filter для этого. Они могли читать визуализированный поток вывода, а также могли записывать в него. Если вы настроите его с помощью прокси-сервера с делегирующим фильтром, он также может получить доступ к службам Spring и подобным аннотациям @Cacheable.

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

Да, делегирующий прокси-фильтр сработает. Лак был бы лучше, но это не наш вариант. Спасибо! Очень надеялся, что есть более простой способ.

Townsfolk 17.04.2019 00:02

Другие вопросы по теме