Spring Boot + Gzip 压缩超大 JSON 对象,传输大小减少一半!
关注公众号,学习更多 Java 干货!
1. 业务背景
adName
:广告名字adTag
:广告渲染的 HTML 代码,超级大数据库中都是用 text 类型来存放的,我看到最大的 adTag 足足有 60kb 大小…
对与需要占用而外的 CPU 计算资源来说,公司的内部系统属于 IO 密集型应用,因此用一些 CPU 资源来换取更快的网络传输其实是很划算的 使用过滤器在请求数据到达 Controller 之前对数据进行解压缩处理后重新写回到 Body 中,避免影响 Controller 的逻辑,代码零侵入 而对于改造接口的同时是否会影响到原来的接口这一点可以通过 HttpHeader 的 Content-Encoding=gzip 属性来区分是否需要对请求数据进行解压缩
2. 实现思路
前置知识:
Http 请求结构以及 Content-Encoding 属性 GZIP 压缩方式 Servlet Filter HttpServletRequestWrapper Spring Boot Java 输入输出流
实现流程图 :
推荐一个开源免费的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
核心代码:
创建一个 SpringBoot 项目,先编写一个接口,功能很简单就是传入一个 JSON 对象并返回,以模拟将广告数据保存到数据库:
编写并注册一个拦截器
实现
RequestWrapper
实现解压和写回 Body 的逻辑附上压缩工具类
Spring Boot 基础就不介绍了,推荐看这个免费教程:
https://github.com/javastacks/spring-boot-best-practice
3. 测试效果
注意一个大坑:千万不要直接将压缩后的
byte[]
当作字符串进行传输,否则你会发现压缩后的请求数据竟然比没压缩后的要大得多 🐶!一般有两种传输压缩后的 byte[]的方式:将压缩后的 byet[]
进行 base64 编码再传输字符串,这种方式会损失掉一部分 GZIP 的压缩效果,适用于压缩结果要存储在 Redis 中的情况将压缩后的 byte[]
以二进制的形式写入到文件中,请求时直接在 body 中带上文件即可,用这种方式可以不损失压缩效果
Postman 测试 GZIP 压缩数据请求:
请求头指定数据压缩方式:
Body 带上压缩后的 byte[]
写入的二进制文件
执行请求,服务端正确处理了请求并且请求 size 缩小了将近一半,效果还是很不错的。
注:针对json 数据大小优化,也可以通过修改 nginx 配置项来解决,开启 contentType: gzip 内容传输编码支持,并对Tomcat进行配置即可。
版权声明:本文为CSDN博主「jinchange」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43441509/article/details/123816603
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。