背景
在项目开发过程中,前后端参数比较多,导致网络传输耗时比较多,因此想将数据压缩传输,以减少网络传输的耗时,从而减少接口的响应时间,可以自己实现,但是spring相关的框架已经内置了该功能,因此建议开箱即用比较好
环境
Springboot2+,JDK11,maven3.6,tomcat容器,swagger接口文档测试
配置
配置中有默认配置,可以按需选择
# 开启请求压缩
enabled: true mime-types: text/xml,application/xml,application/json# 设置请求大小,1024kb以上开始压缩
min-request-size: 1024
server:compression:enabled: true # 开启压缩
结果对比如下
源数据56.6kb,压缩传输之后差不多8.4kb,cpu消耗不明显,压缩传输效果显著
思考
这时,难免会想springboot的设计大牛们是如何实现压缩的,于是跟踪代码发现。
1、 读取压缩配置类
主要在启动的时候读取配置文件中的压缩配置参数
2、tomcat压缩连接器类
实例化压缩配置类,并根据配置参数将压缩配置设置到AbstractHttp11Protocol<?>中
3、AbstractHttp11Protocol类
使用上一部设置的启用参数,并提供是否压缩的方法
4、Http11Processor类
持有AbstractHttp11Protocol对象,根据是否启用压缩和body是否为空,添加输出过滤器对象
5、Http11OutputBuffer类
持有多种输出过滤器,根据启用的索引使用目标输出过滤器
6、GzipOutputFilter
根据启用的过滤器索引,获取过滤器对象,内部持有GZIPOutputStream对象,将数据写出
结尾
做一些流刷新,资源释放等操作
以上是压缩算法启用和真实生效的流程,记录备查