使用Zlib压缩数据,减少网络传输数据量

92 阅读2分钟

JAVA中使用Zlib解压数据

1.问题背景

最近在生产环境中遇到一个问题,当物理设备采集的数据非常多时,通过JSON格式发给平台系统的时候,这个过程消耗非常多的时间。而且对下层物理设备的流量消耗非常大(据估算,一天7个G)。于是就考虑,将数据压缩之后再传给平台系统。而平台系统只需要将原本解析JSON的步骤前,加上解压操作就可以。这样不仅可以节省传输而且可以给下层物理设备节约很多流量。(经过压缩后的数据量比原来小了近20倍)

2.技术选择

在Hutool的文档上看到了一个压缩方法,可以压缩字符串、文件,解压文件。

image-20231018152412229.png

3.编码

说明:由于下层物理设备是将数据先压缩之后,再用base64编码发给我的。所以,作为一名爪洼开发,我需要先使用base64解码,然后再对数据进行解压。以下代码中涉及到的工具类来自Hutool。

image-20231018152412229.png 定义的压缩后的JSON格式如下:

"compressData":""
 /**
     *
     * @param compressData  需要解压的数据对象
     * @param <T>           解压后的数据对象
     * @return
     */
    <T>  T deCompressData(T compressData) ;
    @Override
    public <T> T deCompressData(T obj) {
        // 反射获取compressData属性的值
        Object compressData = ReflectUtil.getFieldValue(obj, "compressData");
        // 判断有压缩数据
        if(ObjectUtil.isNotNull(compressData) && ObjectUtil.length(compressData)>0){
            log.info("开始解码");
            // 对象转成字节数组
            byte[] bytes = JsonUtils.toJsonByte(compressData);
            // base64解码
            byte[] decode = Base64.decode(bytes);
            // zlib 解压数据
            byte[] resultBytes = ZipUtil.unZlib(decode);
            return (T) JsonUtils.parseObject(resultBytes, obj.getClass());
        }else{
            return obj;
        }
    }

4.说明

上面定义了一个泛型方法,因为很多MQTT消息主题中的数据都需要压缩,考虑方法的可重用性,选择了这种方式。 有些数据没有经过压缩,所以我在方法里面先进行了判断是否有压缩字段。如果没有压缩字段的话,就把参数传入 的原数据对象返回。按照原来的流程进行处理,代码改动不大。