将Spring Boot / MVC / JavaConfig与RESTful一起使用GZIP压缩

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (134)

我们使用Spring Boot / MVC和基于注解的java-config来实现一系列RESTful服务,并且我们希望有选择地HTTP GZIP对某些API响应启用流压缩。

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

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

提问于
用户回答回答于

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

这是值得一提的另一件事是,Tomcat的只有压缩的内容类型text/htmltext/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);
                        }
                    }
            );
        }
    };
}
用户回答回答于

这些答案的其余部分已过时和/或在顶部复杂的东西,应该是简单的国际海事组织(GZIP现在已经多久了?比Java更长......)从文档:

在application.properties 1.3+中

server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain

在application.properties 1.2.2 - <1.3

server.tomcat.compression: on
server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain

比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或类似的代理/负载均衡器设置,因为它将比Java / Tomcat的线程模型更高效和更轻松地处理静态资产和gzip。你不想把猫放在浴缸里,因为它忙于压缩东西,而不是提供请求(或者更可能旋转线程/吃掉CPU,等待数据库IO在运行AWS账单时出现,这就是为什么Java可能不是一个好主意,首先取决于你在做什么,但我离题了......)

参考:http : //docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#how-to-enable-http-response-compression

https://github.com/spring-projects/spring-boot/issues/2031

扫码关注云+社区