Мы используем Spring Boot / MVC с java-config на основе аннотаций для ряда RESTful
сервисов, и мы хотим выборочно включить HTTP GZIP
сжатие потока для некоторых ответов API.
Я знаю, что могу сделать это вручную в своем контроллере и a byte[] @ResponseBody
, однако мы предпочли бы полагаться на инфраструктуру SpringMVC (фильтры и т. Д.), Чтобы она автоматически выполняла преобразование и сжатие JSON (т.е. метод возвращает POJO).
Как я могу включить сжатие GZIP в ResponseBody или встроенном экземпляре Tomcat, и таким образом мы можем выборочно сжимать только некоторые ответы?
Благодарность!
PS: В настоящее время у нас нет конфигурации на основе XML.
java
rest
spring-mvc
gzip
spring-java-config
user3182614
источник
источник
Ответы:
Остальные ответы устарели и / или чрезмерно сложны для чего-то, что должно быть простым IMO (как долго gzip существует? Дольше, чем Java ...) Из документов:
В application.properties 1.3+
# 🗜️🗜️🗜️ server.compression.enabled=true # opt in to content types server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css # not worth the CPU cycles at some point, probably server.compression.min-response-size=10240
В application.properties 1.2.2 - <1.3
Старше 1.2.2:
@Component public class TomcatCustomizer implements TomcatConnectorCustomizer { @Override public void customize(Connector connector) { connector.setProperty("compression", "on"); // Add json and xml mime types, as they're not in the mimetype list by default connector.setProperty("compressableMimeType", "text/html,text/xml,text/plain,application/json,application/xml"); } }
Также обратите внимание, что это будет работать ТОЛЬКО, если вы используете встроенный tomcat:
Если вы планируете развертывать на невстроенном tomcat, вам нужно будет включить его в server.xml http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation
Примечание по производству IRL:
Также, чтобы избежать всего этого, рассмотрите возможность использования настройки прокси / балансировщика нагрузки перед Tomcat с nginx и / или haproxy или аналогичными, поскольку он будет обрабатывать статические активы и gzip НАМНОГО более эффективно и легко, чем модель потоков Java / Tomcat.
Вы не хотите бросать кошку в ванну, потому что она занята сжатием вещей вместо обслуживания запросов (или, что более вероятно, раскручивает потоки / ест ЦП / кучу, сидя без дела в ожидании ввода-вывода базы данных, пока вы оплачиваете свой счет AWS, который почему традиционный Java / Tomcat может быть не очень хорошей идеей для начала в зависимости от того, что вы делаете, но я отвлекся ...)
ссылки: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto.html#how-to-enable-http-response-compression
https://github.com/spring-projects/spring-boot/issues/2031
источник
TomcatConnectorCustomizer
экземпляры в контексте приложения; они должны быть программно зарегистрированы сTomcatEmbeddedServletContainerFactory
server.compression.min-response-size=10240
По последним версиям в
application.yml
config:--- spring: profiles: dev server: compression: enabled: true mime-types: text/html,text/css,application/javascript,application/json ---
источник
По сути, это то же решение, что и @andy-wilkinson, но начиная с Spring Boot 1.0 метод customize (...) имеет параметр ConfigurableEmbeddedServletContainer .
Другое дело , что стоит упомянуть, что Tomcat только сжимает типы содержимого из
text/html
,text/xml
иtext/plain
по умолчанию. Ниже приведен пример, который также поддерживает сжатиеapplication/json
:@Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer servletContainer) { ((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers( new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); httpProtocol.setCompression("on"); httpProtocol.setCompressionMinSize(256); String mimeTypes = httpProtocol.getCompressableMimeTypes(); String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE; httpProtocol.setCompressableMimeTypes(mimeTypesWithJson); } } ); } }; }
источник
Accept-Encoding: gzip,deflate
заголовок, если вы используете curl:curl -i -H 'Accept-Encoding: gzip,deflate' http://url.to.your.server
Spring Boot 1.4 Используйте это для всех сжатий Javascript HTML Json.
server.compression.enabled: true server.compression.mime-types: application/json,application/xml,text/html,text/xml,text/plain,text/css,application/javascript
источник
Content-Encoding
:gzip
Я добавил для этого:
Сжатие сервера
server.compression.enabled=true server.compression.min-response-size=2048 server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
взято из http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/
источник
Добавление GZip в Tomcat не работает в моем проекте Spring Boot. Я использовал найденный здесь CompressingFilter .
@Bean public Filter compressingFilter() { CompressingFilter compressingFilter = new CompressingFilter(); return compressingFilter; }
источник
Чтобы включить сжатие GZIP, вам необходимо изменить конфигурацию встроенного экземпляра Tomcat. Для этого вы объявляете
EmbeddedServletContainerCustomizer
bean-компонент в конфигурации Java, а затем регистрируете вTomcatConnectorCustomizer
нем.Например:
@Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainerFactory factory) { ((TomcatEmbeddedServletContainerFactory) factory).addConnectorCustomizers(new TomcatConnectorCustomizer() { @Override public void customize(Connector connector) { AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler(); httpProtocol.setCompression("on"); httpProtocol.setCompressionMinSize(64); } }); } }; }
См. Документацию Tomcat для получения дополнительных сведений о различных доступных параметрах конфигурации сжатия.
Вы говорите, что хотите выборочно включить сжатие. В зависимости от ваших критериев выбора может быть достаточно описанного выше подхода. Он позволяет вам контролировать сжатие с помощью пользовательского агента запроса, размера ответа и типа mime ответа.
Если это не соответствует вашим потребностям, я считаю, что вам придется выполнить сжатие в своем контроллере и вернуть ответ byte [] с заголовком кодирования содержимого gzip.
источник
У меня была такая же проблема в моем проекте Spring Boot + Spring Data при вызове файла
@RepositoryRestResource
.Проблема в возвращаемом MIME-типе; что есть
application/hal+json
. Добавление его кserver.compression.mime-types
собственности решило эту проблему для меня.Надеюсь, это поможет кому-то другому!
источник