java - 将 GZIP 压缩与 Spring Boot/MVC/JavaConfig 与 RESTful 结合使用

标签 java spring rest spring-mvc gzip

我们将 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 可能不是一个好主意的原因,这取决于你在做什么,但我离题了......)

引用: 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

关于java - 将 GZIP 压缩与 Spring Boot/MVC/JavaConfig 与 RESTful 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21410317/

相关文章:

java - 覆盖 hashCode() 时使用更大的素数作为乘数

java - 如何在android studio中的imageView上添加两个具有不同枢轴的旋转?

java - 将 30 分钟添加到 java 中的当前时间

java - 解析headers信息并设置到bean中

rest - 防止从浏览器直接访问 api

java - GSON 如何决定它在反序列化过程中使用哪个 TypeAdapter?

c# - 反序列化错误 ASP.NET MongoDB

java - 如何在java中保存从不带标题的csv文件中检索的特定数据?

java - 如何在不专门使用 Spring ApplicationContext 的情况下检索 beansOfType(Class) 列表?

Spring 和 hibernate : Function of annotatedClasses and packagesToScan