报文压缩的使用场景:当数据大于1kb时,我在使用该方式进行传输,当数据比较小的时候使用gzip的话成本比较大,本来数据量不大,没有必要。
GZIP: 一种压缩算法,一般压缩比例大概在6-8之间
HTTP GZIP:Http协议中的gzip压缩算法,除了gzip外http协议里还支持一些其他的算法,比如compress/deflate。当然也可以定制自己的压缩算法,前提是客户端支持。
压缩的好处是可以节约带宽/流量,但是带来的代价是额外的cpu/内存资源消耗,不过在如今性能过剩的时代,这些远远没有带宽宝贵。
tomcat作为servet容器+http server,自然是支持gzip压缩的,只是在embed版本下需要通过代码来配置。
spring-boot内置的tomcat是embed版本,通过内置的autoconfig机制已经做了一些默认tomcat配置,但是对于一些不常用/高级的配置,spring-boot并没有提供入口。
不过由于spring bean的特性,可以覆盖默认装配的bean,包括tomcat相关的配置。TomcatServletWebServerFactory是springboot2.0.2下对tomcat embed的配置封装,覆盖此bean即可实现动态配置(不要问我怎么知道这个类的,看源码……)
本次增加gzip压缩是为了解决客服部门的使用问题,虽然解决了问题但是治标不治本。
只需在WebAppConfigurer implements WebMvcConfigurer配置即可 @Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory(){ TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory(); tomcatServletWebServerFactory.addConnectorCustomizers((connector)->{ ProtocolHandler protocolHandler = connector.getProtocolHandler(); if(protocolHandler instanceof Http11NioProtocol){ Http11NioProtocol http11NioProtocol = (Http11NioProtocol)protocolHandler; http11NioProtocol.setCompression("on");//default off http11NioProtocol.setCompressionMinSize(2048);//default 2048(B) http11NioProtocol.setMaxKeepAliveRequests(1);//default 200 } }); return tomcatServletWebServerFactory; }
yml配置人如下
server:
compression:
enabled: true
min-response-size: 1024
mime-types:
application/json
二者配其一即可。