dubbo接口调用过程中,部分字段值丢失

编程

在工作中,遇到了调用远程dubbo接口,字段值丢失的情况。排查后,发现调用前后的代码无误,主要原因是在接口调用时使用hessian序列化,出现了子类与父类重复字段,导致字段值丢失。

解决办法:将父类重复字段删除即可。<dubbo关于序列化丢失字段的问题>

  • dubbo序列化

  • 先看下序列化和反序列化的概念:

        序列化:把对象转换为字节序列的过程称为对象的序列化。 
        反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 

        

  • 为什么要序列化?

        序列化模块主要为dubbo协议提供服务提供者和服务消费者之间的数据序列化功能。

        dubbo是一种适合于高并发、小数据量的互联网应用场景的框架,

        而序列化对于远程调用的响应速度,吞吐量,网络带宽消耗也其中至关重要的作用,是提高分布式系统性能的最关键因素之一。

  • dubbo框架原生支持四种序列化类型,且与协议一一对应,性能依次下降,分别为:

  1. dubbo序列化:dubbo框架自身实现的一种Java序列化方案,但是不够成熟,不建议在生产环境使用。(二进制序列化)
  2. hessian2序列化(默认):hessian是一种跨语言的高效二进制序列化方式。(二进制序列化),后来新出了一些其他的跨语言序列化方式:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
  3. json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。(文本序列化)
  4. 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 编译器,自动进行序列化和反序列化,速度非常快,应该比 XMLJSON 快上了 20~100 倍;

2、它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。

<dubbo相关40道面试题>:一起学习学习鸭!冲鸭!

以上是 dubbo接口调用过程中,部分字段值丢失 的全部内容, 来源链接: utcz.com/z/510284.html

回到顶部