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×tamp=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是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了服务注册与发现、负载均衡、容错机制等核心功能。在“dubbo的消费者demo”中,我们将了解如何创建一个服务消费者,调用远程服务。消费者需要...
默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...
当服务接口中的BO(Business Object,业务对象)未实现序列化时,服务注册时可能会遇到问题,因为Dubbo在传输过程中通常需要将对象转换为字节流,这就涉及到了对象的序列化。 对象序列化是Java中一个重要的概念,它...
在Dubbo中,序列化协议是实现RPC通信的关键部分,因为它涉及到数据的转换和网络传输。 1. **Dubbo支持的通信协议**: - **Dubbo协议**:默认协议,采用单个长连接和NIO异步通信,基于Hessian进行序列化。适用于大...
2. **Hessian2**:一种快速的二进制序列化协议,它将Java对象转换为高效的字节流,适合于内部系统间通信。 3. **Fastjson**:阿里巴巴开源的JSON库,它也可以用于序列化和反序列化Java对象,性能较好,且支持复杂的...
dubbo可视化工具
- 在实际开发中,我们可能会需要编写一些辅助工具类来处理Hessian的相关操作,例如Hessian2Input和Hessian2Output,它们用于读写Hessian序列化的二进制流。 6. **安全性与优化**: - 虽然Hessian协议效率高,但其...
双重序列化-avro 适用于dubbo的avro序列化工具。1.从src编译我们使用maven来构建和管理依赖项。 下载src git clone https://github.com/dubbo/dubbo-serialization-avro.git 从src构建,然后安装到本地maven存储库。...
在IT行业中,Dubbo是一款非常知名的高性能、轻量级的Java RPC框架,它极大地促进了服务化时代的进程。本文将深入探讨“dubbo自动化测试”的主题,帮助开发者理解如何有效地进行Dubbo服务的自动化测试,提高代码质量...
Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了服务自动注册与发现、透明化的远程方法调用、智能负载均衡等功能。Dubbo的设计理念是“为服务而生”,旨在简化微服务架构下的服务管理和调用。 #### 三、...
6. **协议与序列化**:Dubbo支持多种通信协议,如HTTP、RMI、Hessian、Dubbo等,以及多种序列化方式,如Java序列化、FastJson、Kryo等。选择合适的协议和序列化方式对服务性能有很大影响。 7. **负载均衡策略**:...
本压缩包包含的是Dubbo监控中心的二进制代码,版本为2.5.3,解压后可以直接运行,方便快速搭建和体验Dubbo的服务治理功能。 1. **Dubbo框架概述** Dubbo是一个Java语言编写的分布式服务框架,旨在提高服务的透明性...
1. **远程通讯(Remote Communication)**:Dubbo提供了对多种基于长连接的NIO框架的抽象封装,支持多种线程模型、序列化方式以及“请求-响应”模式的信息交换方式。 2. **集群容错(Cluster Fault Tolerance)**...
工具仅用于安全研究以及内部自查,禁止使用工具发起非法攻击,造成的后果使用者负责Dubbo反序列化测试工具使用帮助usage: java -jar exp.jar [OPTION]-h --help 帮助信息-l --list 输出所有gadget信息-g --gadget ...
3. **Hessian二进制序列化**:了解Hessian的序列化和反序列化流程,如何将JavaScript对象转换为Hessian格式,以及如何将接收到的Hessian数据还原为JavaScript对象。 4. **Node.js的第三方库**:研究并使用像`dubbo2...
`Serialization`负责对象的序列化和反序列化,Dubbo支持多种序列化方式,如Hessian、Fastjson等。`Transporter`处理网络通信,通常使用Netty作为底层网络库,实现高效的异步非阻塞I/O。 四、负载均衡 Dubbo提供了...
6. **异常的序列化与反序列化** 当服务间通信涉及网络传输时,异常需要进行序列化和反序列化。Dubbo 默认支持 Java 的序列化,但为了性能和安全性,可以考虑使用更轻量级的序列化库,如 Protobuf 或 JSON。 7. **...
- **序列化(Serialization)**:数据在网络中传输前需要进行序列化,Dubbo支持多种序列化方式,如Hessian2、FastJson、Kryo等,选择合适的序列化方式可以提高通信效率。 5. **服务治理**: - **负载均衡(Load ...
5. **协议与序列化(Protocol & Serialization)**:Dubbo支持多种通信协议和序列化方式,如Dubbo协议、RMI、HTTP等,以及Hessian、FastJson、Kryo等序列化方式。通过`dubbo-samples-master`,我们可以了解到如何...