dubbo接口调用过程中,部分字段值丢失
在工作中,遇到了调用远程dubbo接口,字段值丢失的情况。排查后,发现调用前后的代码无误,主要原因是在接口调用时使用hessian序列化,出现了子类与父类重复字段,导致字段值丢失。
解决办法:将父类重复字段删除即可。<dubbo关于序列化丢失字段的问题>
dubbo序列化
- 先看下序列化和反序列化的概念:
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
- 为什么要序列化?
序列化模块主要为dubbo协议提供服务提供者和服务消费者之间的数据序列化功能。
dubbo是一种适合于高并发、小数据量的互联网应用场景的框架,
而序列化对于远程调用的响应速度,吞吐量,网络带宽消耗也其中至关重要的作用,是提高分布式系统性能的最关键因素之一。
- dubbo框架原生支持四种序列化类型,且与协议一一对应,性能依次下降,分别为:
- dubbo序列化:dubbo框架自身实现的一种Java序列化方案,但是不够成熟,不建议在生产环境使用。(二进制序列化)
- hessian2序列化(默认):hessian是一种跨语言的高效二进制序列化方式。(二进制序列化),后来新出了一些其他的跨语言序列化方式:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
- json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。(文本序列化)
- jdk序列化:主要是采用JDK自带的Java序列化实现,性能很不理想。专门针对java语言的序列化方式:Kryo,FST
使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:<dubbo:protocol name="dubbo" serialization="kryo"/>
在成为Apache孵化项目之后,对序列化方式进行了优化,支持的类型,分别为:fastjson,fst,hessian2,jdk和kryo。
其中fst为完全兼容JDK序列化协议的序列化框架,序列化速度是JDK的4到10倍,大小是JDK的1/3左右。
kryo序列化速度也比JDK的要快,并且大小是JDK的1/10左右。fst和kryo性能普通好于其他序列化方案,生产环境比较推荐使用。
- 常问面试题
dubbo 支持不同的通信协议
1、dubbo 协议
默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协议。使用的场景是:传输数据量小(每次请求在 100kb 以内),但是并发量很高。
为了要支持高并发场景,一般是服务提供者就几台机器,但是服务消费者有上百台,可能每天调用量达到上亿次!此时用长连接是最合适的,就是跟每个服务消费者维持一个长连接就可以,可能总共就 100 个连接。然后后面直接基于长连接 NIO 异步通信,可以支撑高并发请求。
长连接,通俗点说,就是建立连接过后可以持续发送请求,无须再建立连接。
dubbo-keep-connection
而短连接,每次要发送请求之前,需要先重新建立一次连接。
dubbo-not-keep-connection
2、rmi 协议:走 Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。
3、hessian 协议:走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。
4、http 协议:走 json 序列化。
5、webservice:走 SOAP 文本序列化。
dubbo 支持的序列化协议
dubbo 支持 hession、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 hessian 是其默认的序列化协议。
说一下 Hessian 的数据结构
Hessian 的对象序列化机制有 8 种原始类型:
- 原始二进制数据
- boolean
- 64-bit date(64 位毫秒值的日期)
- 64-bit double
- 32-bit int
- 64-bit long
- null
- UTF-8 编码的 string
另外还包括 3 种递归类型:
- list for lists and arrays
- map for maps and dictionaries
- object for objects
还有一种特殊的类型:
- ref:用来表示对共享对象的引用。
为什么 PB 的效率是最高的?
其实 PB 之所以性能如此好,主要由于以下两个原因:
1、使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML
和 JSON
快上了 20~100
倍;
2、它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。
<dubbo相关40道面试题>:一起学习学习鸭!冲鸭!
以上是 dubbo接口调用过程中,部分字段值丢失 的全部内容, 来源链接: utcz.com/z/510284.html