这篇文章主要介绍“dubbo接口调用过程中,部分字段值丢失怎么办”,在日常操作中,相信很多人在dubbo接口调用过程中,部分字段值丢失怎么办问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”dubbo接口调用过程中,部分字段值丢失怎么办”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
在工作中,遇到了调用远程dubbo接口,字段值丢失的情况。排查后,发现调用前后的代码无误,主要原因是在接口调用时使用hessian序列化,出现了子类与父类重复字段,导致字段值丢失。
解决办法:将父类重复字段删除即可。<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性能普通好于其他序列化方案,生产环境比较推荐使用。
常问面试题
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 支持 hession、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 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 之所以性能如此好,主要由于以下两个原因:
1、使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML
和 JSON
快上了 20~100
倍;
2、它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。
到此,关于“dubbo接口调用过程中,部分字段值丢失怎么办”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。