专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Dubbo踩坑实录Map序列化

发现问题

之前在做项目的时候,项目元数据查询的子项目耦合在整个大项目中,于是将元数据查询单独抽离成一个独立的项目模块,以dubbo服务的方式提供给其他项目。 但是在一次接口调用的时候,发现生产者一方返回的Map数据在消费者一方接受的时候出状况了,原本预期的返回的是{11:”zy”}这样的格式,结果debug发现消费者一方拿到的数据是{”keys”:[11],”values”:[”zy”]} 生产者代码如下:

public Map<Integer, DigitalAlbumCache> getDigitalAlbumCacheMap(List<Integer> ids) {
        List<DigitalAlbumCache> digitalAlbumCaches = musicCacheQueryService.getDigitalAlbumCacheByIds(ids);
        if (CollectionUtils.isEmpty(digitalAlbumCaches)) {
            return null;
        }

        Set<DigitalAlbumCache> digitalAlbumSet = new HashSet<>(digitalAlbumCaches);
        return Maps.uniqueIndex(digitalAlbumSet.iterator(), DigitalAlbumCache::getId);

    }

定位问题

确定的一点是,在之前这一段代码在同一个项目中调用的时候是没有问题的,而RPC项目比同项目调用多的步骤就是序列化->网络传输->反序列化,所以问题大概就是出在序列化上 打开Dubbo框架源码,找到序列化的地方

45_1.png

可见dubbo的序列化提供了SPI接口,默认使用的是hessian2。 Google一下可以知道,hession2框架对于List, Map, Number, Date, Calendar这几类对象,只支持JDK原生的实现类的序列化与反序列化,具体可参考com.alibaba.com.caucho.hessian.io.MapSerializer#writeObject方法的实现,而我们这边生产者的返回类型是guava的ImmutableMap。 遂放弃guava,重写了这段代码,使得返回类型为HashMap,问题迎刃而解。 问题到这里就解决了,以下是hession2框架对于Map序列化反序列化的源码剖析。

-——————————–分割线———————————-

源码导读

45_2.png进入实现类 Hessian2Serialization

45_3.png

45_4.png可见dubbo对于序列化的基本思路是这样的:
基于SPI,提供给用户各种Serialization的实现,具体实现类中,通过调用#serialize和#deserialize方法分别返回ObjectOutput和ObjectInput的具体实现,这连个类的实现有点类似于JDK中java.io.ObjectInput和java.io.ObjectOutput的作用,是用来具体针对各种不同类型的数据结构进行序列化和反序列化的。

文章永久链接:https://tech.souyunku.com/31483

未经允许不得转载:搜云库技术团队 » Dubbo踩坑实录Map序列化

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们