Кэширование вычисленных ответов в SpringBoot - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть 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) с помощью набора параметров запроса и заголовков.

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

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

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

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

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

Я думал об использовании HandlerInterceptor , но он имеет дело с ответом перед его обработкой.

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

1 Ответ

0 голосов
/ 13 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...