vlambda博客
学习文章列表

【Java】如何在spring boot中启用gzip压缩并验证其生效

背景:

当用户调用接口服务请求大量数据时,在传输过程中会导致接口服务的网关内存溢出,导致接口服务部分不可用。


解决方案:
对用户的数据进行压缩传输,以降低接口服务的网关传输开销,提高网关进程鲁棒性。
对于spring boot而言,启用gzip压缩只需要application.properties里配置下列参数:
#启用压缩server.compression.enabled=true#设置压缩支持格式,由测试接口中的Content-Type决定server.compression.mime-types=application/json#设置触发压缩的数据量阈值(单位:byte)server.compression.min-response-size=1024


验证:

为获得良好测试效果,挑选一个返回数据量较大的接口进行测试,使用postman对该接口进行测试,该接口正常返回body数据量稳定在为134.25KB。(注意:直接使用postman调用接口服务获取返回数据量以验证gzip压缩是否开启是无效的,因为postman在返回结果时把已经压缩好的gzip包再次解开。所以如果要验证gzip压缩有效,必须通过网络抓包去获取更细致的http传输过程数据。


下面简单介绍一下抓包及后续分析流程:
1.在服务部署的linux机器上使用tcpdump抓包
tcpdump -i <网卡名> -w ./<输出结果名>.pcap
2.将抓好的pcap包下载到windows本地,使用Wireshark网络封包分析软件(我使用的版本号为3.0.6)进行解析。
①在wireshark输入框中输入http以过滤所有的http记录。

【Java】如何在spring boot中启用gzip压缩并验证其生效

②根据源IP( 自己的windows机器ip)、目标IP(访问的服务的ip)定位到第一行符合该条件的http请求后,点击该行,wireshark最左侧边框会将该行in记录及对应的out记录对应的行用箭头标识出来,如图中红框所示。

【Java】如何在spring boot中启用gzip压缩并验证其生效

③点击out记录对应的“<--”箭头,在页面最下方边框处可以看到调用该接口返回的数据量未压缩及压缩后的大小。由图中数据可知,原始数据大小为 134.25 KB,经压缩后在http上传输的数据大小仅为3.04 KB。压缩后的数据仅占原始数据的约 五十分之一,大大降低了接口服务传输数据的压力。

“<--”箭头对应记录的Hypertext Transfer Protocol中,也可以看到Content-Encoding值为gzip。证明开启gzip压缩机制成功。