2015-12-31 3 views
0

У меня есть автономный WildFly 9.0.2, и я хочу кэшировать на стороне сервера ответы на определенные запросы.Кэширование на стороне сервера

Некоторые из запросов доступны для всех пользователей (посетителей), другие должны быть доступны только для аутентифицированных пользователей.

Я не понимаю из документации, как это сделать. Можете ли вы указать мне учебник или руководство по реализации этой функции?

Я начал wildfly с использованием конфигурации по умолчанию для Infispan, что находится в автономной конфигурации \ \ standalone.xml

Затем я изменил объект ответа содержать информацию заголовков для кэширования, надеясь, что он будет работать как JAX-RS, где он будет проверять заголовки и автоматически кэшировать.

final HttpServletResponse response 
long current = System.currentTimeMillis(); 
long expires = current + 86400000; 
response.setHeader("Cache-Control", "no-transform, max-age="+ 86400 + ", public"); 
response.addDateHeader("Expires", expires); 
response.addDateHeader("Last-Modified", current); 

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

Когда я попытался просмотреть настройки Infinispan с панели администрирования в http://127.0.0.1:9990, я получаю исключение и не могу продолжить.

Заранее благодарю вас за помощь.

ответ

2

Нет автономного сервера сервлетов Java, который выполняет кэширование ответов так, как вы ожидали. Заголовки, заданные в ответе, будут интерпретироваться браузером (который делает кеш) или промежуточными прокси-серверами, которые могут также кэшироваться. Специализированные прокси для кеширования: лак, NGINX. Эти прокси также называются Edge Proxies.

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

Если вы хотите кэшировать внутри приложения, то обычно нужно использовать библиотеку кеширования, такую ​​как EHCache, cache2k, Google Guava Cache и другие.

В вашем конкретном примере случаев я бы рекомендовал вам ознакомиться с сервером прокси-кеша, таким как NGINX, и поставить его перед вашим приложением. Это, скажем, «отраслевой стандарт». Это не желательно делать кэширование ответа HTTP внутри сервера Java, в течение нескольких причин:

  • В случае попадания в кэш, ответ от прокси быстрее и сервер Java не попал
  • Вы можете масштабировать, добавив больше кеширования прокси перед вашим приложением.
  • Куча Java не подходит для кэширования большого количества данных. Куда он должен идти? Есть кеши, которые переполняют диск. Это требует сложной установки, а также прокси-кэширования перед приложением
  • Для отладки и прозрачности, то лучше, что сервер генерирует свежий ответ, когда запрос отправляется к нему

Я всегда рекомендую делать кэширование внутри приложения тоже. Однако мы делаем это на уровне объектов Java. Размер кеша ограничен, поэтому куча остается маленькой.В приложении используется много кешированных объектов, поэтому для кэширования объектов используется более точный уровень кэширования HTTP-ответов.

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

Надеюсь, что это поможет.