使用带有RESTful的Spring Boot/MVC/JavaConfig进行GZIP压缩

use*_*614 86 java rest gzip spring-mvc spring-java-config

我们将Spring Boot/MVC与基于注释的java-config一起用于一系列RESTful服务,我们希望有选择地HTTP GZIP在某些API响应上启用流压缩.

我知道我可以在我的控制器中手动执行此操作byte[] @ResponseBody,但是我们更愿意依赖SpringMVC基础结构(过滤器/等)并让它自动执行JSON转换和压缩(即该方法返回POJO).

如何在ResponseBody或嵌入式Tomcat实例中启用GZIP压缩,并且我们可以选择性地仅压缩某些响应?

谢谢!

PS.:我们目前没有任何基于XML的配置.

Joh*_*ner 176

这些答案的其余部分已经过时和/或顶部复杂的东西应该是简单的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 
Run Code Online (Sandbox Code Playgroud)

在application.properties 1.2.2 - <1.3

server.tomcat.compression=on
server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
Run Code Online (Sandbox Code Playgroud)

年龄超过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");
  }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,只有在运行嵌入式tomcat时,这才会起作用:

如果您计划部署到非嵌入式tomcat,则必须在server.xml中启用它http://tomcat.apache.org/tomcat-9.0-doc/config/http.html#Standard_Implementation

IRL生产注意事项:

另外,为了避免所有这些,请考虑在Tomcat前面使用nginx和/或haproxy或类似设置代理/负载均衡器,因为它将比Java/Tomcat的线程模型更有效,更轻松地处理静态资产和gzip MUCH.

你不想把'cat in the bath因为它正在忙于压缩东西而不是提供请求(或者更可能是在启动你的AWS账单时,在等待数据库IO发生时旋转线程/吃CPU /堆)为什么传统的Java/Tomcat可能不是一个好主意,取决于你在做什么,但我离题...)

refs: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

  • 在SpringBoot,新属性server.compression.enabled =真和server.compression.mime类型= XXX,YYY https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3. 0 - 全释放 - 说明 (3认同)
  • 您还应该提到压缩的最小响应大小(例如:10KB),否则服务器压缩每个(例如:0.5KB)请求都将成为开销。`server.compression.min-response-size = 10240` (3认同)
  • 如果对于春季启动,我们有多个rest控制器都返回JSON响应。我们可以选择性地将zip应用于某些控制器吗? (2认同)

mat*_*sev 12

这与@ andy-wilkinson提供的解决方案基本相同,但从Spring Boot 1.0开始,customize(...)方法具有ConfigurableEmbeddedServletContainer参数.

这是值得一提的另一件事是,Tomcat的只有压缩的内容类型text/html,text/xmltext/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);
                        }
                    }
            );
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 如果使用curl:尝试通过指定`Accept-Encoding:gzip,deflate`标头进行验证:`curl -i -H'Accept-Encoding:gzip,deflate'http:// url.to.your.server` (2认同)

M. *_*loo 11

application.yml配置中的最新版本:

---

spring:
  profiles: dev

server:
  compression:
    enabled: true
    mime-types: text/html,text/css,application/javascript,application/json

---
Run Code Online (Sandbox Code Playgroud)


Ron*_*ley 9

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
Run Code Online (Sandbox Code Playgroud)

  • 我们如何验证这种压缩? (2认同)
  • @Bhargav 查看您的 api 响应的响应标头。它应该包含标题:`Content-Encoding` : `gzip` (2认同)

Ole*_*syn 6

我为此添加了:

服务器压缩

server.compression.enabled=true
server.compression.min-response-size=2048
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
Run Code Online (Sandbox Code Playgroud)

取自http://bisaga.com/blog/programming/web-compression-on-spring-boot-application/


And*_*son 5

开启GZIP压缩需要修改内嵌Tomcat实例的配置。为此,您EmbeddedServletContainerCustomizer在 Java 配置中声明了一个bean,然后TomcatConnectorCustomizer用它注册了一个bean 。

例如:

@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);
                }
            });
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

有关可用的各种压缩配置选项的更多详细信息,请参阅Tomcat 文档

你说你想有选择地启用压缩。根据您的选择标准,上述方法可能就足够了。它使您能够通过请求的用户代理、响应的大小和响应的 MIME 类型来控制压缩。

如果这不能满足您的需求,那么我相信您将不得不在控制器中执行压缩并返回一个带有 gzip 内容编码标头的 byte[] 响应。

  • 您对将设置放在 application.properties 上的选项的回答有何不同?server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css (2认同)

use*_*860 5

在Tomcat中启用GZip在我的Spring Boot项目中不起作用。我使用了在这里找到的CompressingFilter

@Bean
public Filter compressingFilter() {
    CompressingFilter compressingFilter = new CompressingFilter();
    return compressingFilter;
}
Run Code Online (Sandbox Code Playgroud)

  • 可以在此处找到该过滤器的较新版本:https://github.com/ziplet/ziplet (3认同)