使用gzip压缩和spring boot/mvc/javaconfig以及restful

ewm0tg9j  于 2021-06-29  发布在  Java
关注(0)|答案(8)|浏览(656)

我们将springboot/mvc与基于注解的java配置一起用于一系列restful服务,并希望在一些api响应上有选择地启用httpgzip流压缩。
我知道我可以在我的控制器和 byte[] @ResponseBody 但是,我们更愿意依赖springmvc基础设施(filters/etc),让它自动执行json转换和压缩(即,该方法返回一个pojo)。
如何在responsebody或嵌入的tomcat示例中启用gzip压缩,并且在某种程度上我们只能有选择地压缩一些响应?
我们目前没有任何基于xml的配置。

nhjlsmyf

nhjlsmyf1#

要启用gzip压缩,需要修改嵌入式tomcat示例的配置。为此,您需要声明 EmbeddedServletContainerCustomizer bean,然后注册 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类型来控制压缩。
如果这不能满足您的需要,那么我相信您必须在控制器中执行压缩,并返回带有gzip内容编码头的byte[]响应。

yjghlzjz

yjghlzjz2#

在tomcat中启用gzip在我的spring boot项目中不起作用。我用了这里的压缩过滤器。

@Bean
public Filter compressingFilter() {
    CompressingFilter compressingFilter = new CompressingFilter();
    return compressingFilter;
}
lfapxunr

lfapxunr3#

其余的答案已经过时和/或过于复杂,因为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

应用属性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");
  }
}

另请注意,只有在运行embedded tomcat时,这才起作用:

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

irl生产说明:

为了避免所有这些问题,考虑在tomcat前面使用一个带有nginx和/或haproxy或类似工具的代理/负载平衡器设置,因为它将比java/tomcat的线程模型更高效、更容易地处理静态资产和gzip。
你不想把“猫”扔进浴缸,因为它忙于压缩东西,而不是提供请求(或者更可能是在运行aws账单的时候旋转线程/消耗cpu/堆,坐在那里等待数据库io的发生,这就是为什么传统的java/tomcat可能不是一个好主意,这取决于你在做什么但我离题了……)
参考文献:https://docs.spring.io/spring-boot/docs/current-snapshot/reference/html/howto.html#how-启用http响应压缩
https://github.com/spring-projects/spring-boot/issues/2031

mhd8tkvw

mhd8tkvw4#

论新版本 application.yml 配置:

---

spring:
  profiles: dev

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

---
yduiuuwa

yduiuuwa5#

为此,我添加了:

服务器压缩

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/

o2rvlv0m

o2rvlv0m6#

这与@andy wilkinson提供的解决方案基本相同,但从springboot1.0开始,customize(…)方法有一个configurablembeddedservletcontainer参数。
另一件值得一提的事情是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);
                        }
                    }
            );
        }
    };
}
smtd7mpg

smtd7mpg7#

springboot1.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
cuxqih21

cuxqih218#

我的spring boot+spring数据项目在调用 @RepositoryRestResource .
问题是返回的mime类型;哪个是 application/hal+json . 将其添加到 server.compression.mime-types 物业为我解决了这个问题。
希望这对别人有帮助!

相关问题