最近线上环境和测试环境总是时不时报找不到dubbo服务的错,或者是路径错误。
java.io.IOException: com.esotericsoftware.kryo.KryoException: Unable to find class: path
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.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:146)
at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:74)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:138)
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:108)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
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:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.esotericsoftware.kryo.KryoException: Unable to find class: path
at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:138)
at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:115)
at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:641)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:752)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectInput.readObject(KryoObjectInput.java:125)
... 23 more
Failed to invoke the method setWxOpenId in the service com.pengji.linker.dubbox.services.modules.membermanager.service.interf.IWechatService. Tried 1 times of the providers [192.168.1.147:20883] (1/1) from the registry 10.10.111.187:2181 on the consumer 192.168.1.147 using the dubbo version 2.8.4. Last error is: Invoke remote method timeout. method: setWxOpenId, provider: dubbo://192.168.1.147:20883/com.pengji.linker.dubbox.services.modules.membermanager.service.interf.IWechatService?anyhost=true&application=linker-dubbox-bg&check=false&default.delay=-1&default.retries=0&default.timeout=6000&delay=-1&dubbo=2.8.4&generic=false&interface=com.pengji.linker.dubbox.services.modules.membermanager.service.interf.IWechatService&methods=getWxOpenId,getWxSubscribe,setWxOpenId,getShareConfig,getWxCodeUrl&organization=pengji&owner=summer&pid=15212&revision=0.0.1-SNAPSHOT&serialization=kryo&side=consumer×tamp=1564456778614, cause: Waiting server-side response timeout. start time: 2019-07-30 11:27:20.027, end time: 2019-07-30 11:27:26.201, client elapsed: 116 ms, server elapsed: 6006 ms, timeout: 6000 ms, request: Request [id=2, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=setWxOpenId, parameterTypes=[class com.pengji.linker.dubbox.services.modules.membermanager.entity.requestmodel.WxShareParamEntity], arguments=[com.pengji.linker.dubbox.services.modules.membermanager.entity.requestmodel.WxShareParamEntity@319431f7], attachments={path=com.pengji.linker.dubbox.services.modules.membermanager.service.interf.IWechatService, interface=com.pengji.linker.dubbox.services.modules.membermanager.service.interf.IWechatService, version=0.0.0, timeout=6000}]], channel: /192.168.1.147:54749 -> /192.168.1.147:20883
后来针对该问题,又将配置改为了dubbo默认序列化配置,才解决版本兼容问题。所以针对频繁变动的输入输出时,一般建议采用dubbo默认配置,虽然kryo速度快,但是还不够成熟,这也是dubbo默认配置是hession2而不是kryo。
还有一个值得注意的问题:输入输出参数最好都实现Serializable接口,因为hession2要求必须实现Serializable接口,而kryo不作要求,所以为了方便切换,最好都按要求实现序列化接口
由于项目以前是使用kryo进行序列化的,遂将其改为hession2。
此次改动中还解决了问题:
dubbo调用发生StackOverflowError栈溢出异常.note
https://blog.youkuaiyun.com/rainbow_lasia/article/details/107185296 dubbo调用发生StackOverflowError栈溢出异常
记Dubbo调用Hessian序列化丢属性.note
https://blog.youkuaiyun.com/rainbow_lasia/article/details/107185335 记Dubbo调用Hessian序列化丢属性
dubbo使用hessian协议传输MultipartFile文件内容丟失.note
https://blog.youkuaiyun.com/rainbow_lasia/article/details/107185172 dubbo使用hessian协议传输MultipartFile文件内容丟失