我们将 Spring Boot/MVC 与基于注解的 java-config 用于一系列 RESTful 服务,并且我们希望选择性地对某些 API 响应启用 HTTP GZIP 流压缩。
我知道我可以在我的 Controller 和 byte[] @ResponseBody
中手动执行此操作,但是我们更愿意依赖 Spring MVC 基础架构(过滤器/等)并让它自动执行JSON 转换和压缩(即该方法返回一个 POJO)。
如何在 ResponseBody 或嵌入式 Tomcat 实例中启用 GZIP 压缩,并且我们可以选择性地仅压缩某些响应?
我们目前没有任何基于 XML 的配置。
最佳答案
这些答案的其余部分已经过时和/或对于应该是简单的 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
server.tomcat.compression=on
server.tomcat.compressableMimeTypes=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css
早于 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 或类似的代理/负载平衡器设置,因为它将处理静态 Assets 和gzip 比 Java/Tomcat 的线程模型更高效、更容易。
您不想把 'cat 扔进浴缸,因为它忙于压缩内容而不是提供请求(或者更有可能在运行 AWS 时启动线程/占用 CPU/堆等待数据库 IO 发生)这就是为什么传统的 Java/Tomcat 可能不是一个好主意的原因,这取决于你在做什么,但我离题了......)
关于java - 将 GZIP 压缩与 Spring Boot/MVC/JavaConfig 与 RESTful 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410317/