`
征途2010
  • 浏览: 247945 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dubbo序列化问题(二)hession2与kryo切换

阅读更多

dubbo提供了好几种序列化方式,一般我们都是用的是默认的hession2,而dubbox为我们增加了kryo和fst许了方式,主要体现在速度快,占用内存小,然后我们将序列化配置改为是用kryo:

<dubbo:protocol name="dubbo" serialization="kryo"/>  
 

 

但是是用一段时间后遇到了不少问题,其中最困扰人的是不兼容以前的版本,我们的需求变动频繁,并且迭代比较快,经常需要增加字段或者对类进行重构,这就导致dubbo反序列化时经常报如下错误:

 

 

ERROR] [2017-08-10 17:18:55] Tried 3 times of the providers [172.20.50.35:20980] (1/1) from the registry 172.18.50.29:2181 on the consumer 172.19.21.69 using the dubbo version 2.8.4a. Last error is: Failed to invoke remote method: getApptConfig, provider: dubbo://172.20.50.35:20980/com.appt.api.appointment.ApptService?anyhost=true&application=web&check=false&dubbo=server&environment=test&generic=false&interface=com.appt.api.appointment.ApptService&methods=changgeAppRecordDate,confirmDiagnosisByApptOrderCode,getWaitUserTreatmentConfirm,getApptMinAndMaxDayConfig,getApptRecordBySchedule,getApptConfig,getApptConfirmRecord,userTreatmentConfirm,clinicApptConfirm,getApptImageUrl,confirmRecordByApptOrderCode,getScheduleDaysByClinic,getApptOptLog,getTreatmentProve,uploadApptTreatmentProveImages,getConfig2IsNeedClinicConfirmAppt,getApptItem,getClinicApptCount,getApptPoolSummary,getWaitApptConfirm,getScheduleSetApptDetailByClinic,getApptRecord,getClinicApptRecord,getDoctorScheduleDays,getApptRecordByApptOrderCode,getApptScheduleByDept,getPerToCreateOrEdit,modifyAppt,getApptPoolDetail,getDocotrApptStatisByDay,getApptRecordsByType,getApptRecordWx,cancleRecordByApptOrderCode,getHealthProductByHealthProductId,getScheduleSetApptByClinic,clinicTreatmentConfirm,apptCancel,getDepartmentApptStatisByDay,apptSubmit,checkTreatmentNumByApptOrderCode,getScheduleList,deleteByApptOrderCode&organization=wanjia&owner=xujie510&pid=576&revision=2.0.0&serialization=kryo&side=consumer&timeout=30000&timestamp=1502356382889, cause: java.io.IOException: com.esotericsoftware.kryo.KryoException: java.lang.ArrayIndexOutOfBoundsException: -2
Serialization trace:haveScheduleDoctorInfos (com.model.appt.vo.ApptConfigRsp)result (com.appt.domain.JsonResponse)
java.io.IOException: com.esotericsoftware.kryo.KryoException: java.lang.ArrayIndexOutOfBoundsException: -2
Serialization trace:
haveScheduleDoctorInfos (com.model.appt.vo.ApptConfigRsp)
result (com.appt.domain.JsonResponse)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectInput.readObject(KryoObjectInput.java:127)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectInput.readObject(KryoObjectInput.java:140)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectInput.readObject(KryoObjectInput.java:151)
at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:87)
at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcResult.decode(DecodeableRpcResult.java:117)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:98)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:134)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:95)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:46)
at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:134)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: com.esotericsoftware.kryo.KryoException: java.lang.ArrayIndexOutOfBoundsException: -2
Serialization trace:
haveScheduleDoctorInfos (com.model.appt.vo.ApptConfigRsp)
result (com.appt.domain.JsonResponse)
at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125)
at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:528)
at com.esotericsoftwa
 

 

只要输入参数、输出参数或者嵌套类有任何变动,就报以上错误,很是困扰人。

 

后来针对该问题,又将配置改为了dubbo默认序列化配置,才解决版本兼容问题。所以针对频繁变动的输入输出时,一般建议采用dubbo默认配置,虽然kryo速度快,但是还不够成熟,这也是dubbo默认配置是hession2而不是kryo。

 

 还有一个值得注意的问题:输入输出参数最好都实现Serializable接口,因为hession2要求必须实现Serializable接口,而kryo不作要求,所以为了方便切换,最好都按要求实现序列化接口

分享到:
评论

相关推荐

    dubbo_rpc_hession_rmi

    首先,Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了服务注册与发现、负载均衡、容错机制等核心功能。在“dubbo的消费者demo”中,我们将了解如何创建一个服务消费者,调用远程服务。消费者需要...

    Dubbo 序列化协议 5 连问,你接得住不.PDF

    默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...

    dubbo注意的问题,注入问题,接口中的bo应该实现序列化,否则服务注册失败

    当服务接口中的BO(Business Object,业务对象)未实现序列化时,服务注册时可能会遇到问题,因为Dubbo在传输过程中通常需要将对象转换为字节流,这就涉及到了对象的序列化。 对象序列化是Java中一个重要的概念,它...

    Dubbo序列化协议5连问,你接得住不?.docx

    在Dubbo中,序列化协议是实现RPC通信的关键部分,因为它涉及到数据的转换和网络传输。 1. **Dubbo支持的通信协议**: - **Dubbo协议**:默认协议,采用单个长连接和NIO异步通信,基于Hessian进行序列化。适用于大...

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    2. **Hessian2**:一种快速的二进制序列化协议,它将Java对象转换为高效的字节流,适合于内部系统间通信。 3. **Fastjson**:阿里巴巴开源的JSON库,它也可以用于序列化和反序列化Java对象,性能较好,且支持复杂的...

    dubbo admin dubbo可视化工具

    dubbo可视化工具

    dubbo-hessian协议http请求demo(java)

    - 在实际开发中,我们可能会需要编写一些辅助工具类来处理Hessian的相关操作,例如Hessian2Input和Hessian2Output,它们用于读写Hessian序列化的二进制流。 6. **安全性与优化**: - 虽然Hessian协议效率高,但其...

    dubbo-serialization-avro:适用于avro的dubbo序列化扩展

    双重序列化-avro 适用于dubbo的avro序列化工具。1.从src编译我们使用maven来构建和管理依赖项。 下载src git clone https://github.com/dubbo/dubbo-serialization-avro.git 从src构建,然后安装到本地maven存储库。...

    dubbo自动化测试

    在IT行业中,Dubbo是一款非常知名的高性能、轻量级的Java RPC框架,它极大地促进了服务化时代的进程。本文将深入探讨“dubbo自动化测试”的主题,帮助开发者理解如何有效地进行Dubbo服务的自动化测试,提高代码质量...

    dubbo源码解析2

    Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务自动注册与发现、透明化的远程方法调用、智能负载均衡等功能。Dubbo的设计理念是“为服务而生”,旨在简化微服务架构下的服务管理和调用。 #### 三、...

    dubbo 视频下载

    6. **协议与序列化**:Dubbo支持多种通信协议,如HTTP、RMI、Hessian、Dubbo等,以及多种序列化方式,如Java序列化、FastJson、Kryo等。选择合适的协议和序列化方式对服务性能有很大影响。 7. **负载均衡策略**:...

    dubbo 监控中心的二进制代码 (可运行)

    本压缩包包含的是Dubbo监控中心的二进制代码,版本为2.5.3,解压后可以直接运行,方便快速搭建和体验Dubbo的服务治理功能。 1. **Dubbo框架概述** Dubbo是一个Java语言编写的分布式服务框架,旨在提高服务的透明性...

    Dubbo培训与实战

    1. **远程通讯(Remote Communication)**:Dubbo提供了对多种基于长连接的NIO框架的抽象封装,支持多种线程模型、序列化方式以及“请求-响应”模式的信息交换方式。 2. **集群容错(Cluster Fault Tolerance)**...

    dubbo-exp:Dubbo反序列化一键快速攻击测试工具,支持dubbo协议和http协议,支持hessian反序列化和java原生反序列化

    工具仅用于安全研究以及内部自查,禁止使用工具发起非法攻击,造成的后果使用者负责Dubbo反序列化测试工具使用帮助usage: java -jar exp.jar [OPTION]-h --help 帮助信息-l --list 输出所有gadget信息-g --gadget ...

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    3. **Hessian二进制序列化**:了解Hessian的序列化和反序列化流程,如何将JavaScript对象转换为Hessian格式,以及如何将接收到的Hessian数据还原为JavaScript对象。 4. **Node.js的第三方库**:研究并使用像`dubbo2...

    dubbo 源码

    `Serialization`负责对象的序列化和反序列化,Dubbo支持多种序列化方式,如Hessian、Fastjson等。`Transporter`处理网络通信,通常使用Netty作为底层网络库,实现高效的异步非阻塞I/O。 四、负载均衡 Dubbo提供了...

    dubbo捕获自定义异常_dubbo异常捕获_dubbo异常_自定义异常_捕捉异常_

    6. **异常的序列化与反序列化** 当服务间通信涉及网络传输时,异常需要进行序列化和反序列化。Dubbo 默认支持 Java 的序列化,但为了性能和安全性,可以考虑使用更轻量级的序列化库,如 Protobuf 或 JSON。 7. **...

    dubbo的技术文档

    - **序列化(Serialization)**:数据在网络中传输前需要进行序列化,Dubbo支持多种序列化方式,如Hessian2、FastJson、Kryo等,选择合适的序列化方式可以提高通信效率。 5. **服务治理**: - **负载均衡(Load ...

    dubbo-samples-master_dubbo_breathgz9_

    5. **协议与序列化(Protocol & Serialization)**:Dubbo支持多种通信协议和序列化方式,如Dubbo协议、RMI、HTTP等,以及Hessian、FastJson、Kryo等序列化方式。通过`dubbo-samples-master`,我们可以了解到如何...

Global site tag (gtag.js) - Google Analytics