在工作中,遇到了调用远程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配置中添加一个属性即可:

在成为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项目接口_dubbo接口调用过程中,部分字段值丢失相关推荐

  1. jsonpath:从庞大的接口返回结果(返回结果为字典类型)中取字段值

    从庞大的接口返回结果(返回结果为字典类型)中取字段值,返回结果是list s = {"ec": 0, "errcode": 0, "em": ...

  2. Visual Studio 2015 安装过程中出现“安装包丢失或损坏”错误的解决方法

    Visual Studio 2015 下载链接: 由于官网实在是太慢了,而且有时候还打不开下载页面,所以我这里贴出了链接,大家可以使用迅雷下载(速度杠杠的) 链接:ISO镜像文件 安装方法: 将ISO ...

  3. 引入dubbo项目接口_Dubbo框架的Hello World

    最近写基于 Dubbo 的 Demo,本来挺简单的一个 Demo 但是整了两个小时,而最后解决的方法是因为包名的问题.可能很多所谓的经验不过就是一个踩坑的经验. Dubbo 介绍 Dubbo 的作用引 ...

  4. 引入dubbo项目接口_通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件...

    很流行的Dubbo很多朋友都听说过吧,最近我也在看这方面的东西,分享先我的心得笔记. 先说说我们团队要做的项目框架,很简单重在实现基于zookeeper的dubbo注册. 框架:springmvc+s ...

  5. 作为项目管理者如何避免项目的延期与执行过程中的加班问题

    作为一个项目管理者,最担心的事情就是项目的不能够如期完成:作为一个项目实施者,最担心的是无休无止的加班.项目的不能够如期完成直接导致的是用户或者甲方对公司信誉.能力等各个方面的怀疑与否定,项目实施过程 ...

  6. java调用构造函数中某一个值_Java如何在枚举的构造函数中调用另一个枚举值

    Java中的枚举(enum)是一种存储一组常量值的数据类型.您可以使用枚举来存储固定值,例如一周中的天,一年中的月等. 您可以使用关键字 enum定义枚举,后跟枚举的名称为-enum Days { S ...

  7. idea 调用c#接口_Dubbo 接口测试方法

    一.直接通telnet然后用dubbo协议调用方法 (1)在项目的配置文件中可以看到 dubbo.protocol.port=10022 说明dubbo对外暴漏的端口为10022,直接用telnet访 ...

  8. 使用openfeign调用报错java.io.IOException: too many bytes written,以及调用过程中参数传递为空等问题

    一.报错问题: 使用openfeign调用报错java.io.IOException: too many bytes written, 问题来源:在 Feign 调用拦截器里,当传递头header时, ...

  9. android JNI调用过程中的方法签名规则

    有了数据类型之间的对应关系,JNI就可以正确识别并转换Java类型,但是Java支持方法重载,仅靠函数名是无法唯一确定一个方法的.于是JNI提供了一套签名规则,用一个字符串来唯一确定一个方法.其规则如 ...

最新文章

  1. Concrete Math 混凝土数学(具体数学)随笔
  2. python软件是免费的吗-python属于软件吗
  3. 1339: 考试排名
  4. knockoutJS学习笔记06:ko数组与模板绑定
  5. Apache Camel中的断路器模式
  6. genymotion 极速模拟器
  7. 目前使用的工具及开发方式
  8. 敏捷开发系列学习总结(14)——Spotify敏捷模式详解三部曲第二篇:研发过程
  9. 微信支付商户平台,企业付款,企业向个人付款接口总结
  10. 迈向高算力、跨域融合新拐点,智能座舱各路玩家如何卡位?
  11. FishEye Crucible分析
  12. CSS重置默认样式reset.css代码模板
  13. FPGA可以转行数字IC验证吗?
  14. 如何让地面不起灰_水泥地面起灰怎么办?老师傅6招搞定了
  15. 离线数仓建设及技术选型
  16. 关于C++ non-aggregate cannot be initialized错误的解决
  17. 大屏地图背景透明效果,高德地图怎么才能只渲染局部地图,有全部代码详细。
  18. web前端零基础系统学习路线,每个阶段都需要学什么?
  19. 三参数坐标转换matlab,Coordinate-conversion
  20. 在设计电机电路项目中总结的一些电机参数知识和设计要点 - 直流电机、空心杯电机、步进电机、伺服电机等

热门文章

  1. Spring.NET 中的 ADO.NET 数据访问的示例
  2. VC编译选项 /EHa 异常处理
  3. gcc编译出现dlopen、dlerror、dlsym、dlcolse的解决方法
  4. laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)
  5. 【免费下载】2021年4月热门报告盘点下载
  6. Graph Embedding及其在知乎的实践(附pdf下载链接)
  7. 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...
  8. 程序员如何达到年薪百万?python程序员必读书籍!
  9. 视觉slam第一讲——
  10. 经典排序算法及其Python实现