dangdangdotcom / dubbox

Dubbox now means Dubbo eXtensions, and it adds features like RESTful remoting, Kyro/FST serialization, etc to the Dubbo service framework.
http://dangdangdotcom.github.io/dubbox
Apache License 2.0
4.9k stars 2.06k forks source link

dubbox在修改了服务提供方序列化方式,没有重新部署服务消费方时,还是使用原来的序列化方式 #368

Open xt8469 opened 6 years ago

xt8469 commented 6 years ago

项目原来使用的是kryo序列化,但是由于kryo序列化对于字段的增加敏感(增加了一个字段之后消费者将无法正常的反序列化),就想换回hessian2序列化方式,这时候就出现了一个问题。

1.我部署服务方的时候修改了序列化方式为hessian2,并且删除了kryo的相关Maven引入,部署之后就会报错,堆栈信息如下:

2017-11-08 14:40:03,654 WARN  [New I/O worker #1] slf4j.Slf4jLogger (Slf4jLogger.java:62) -  [DUBBO] Decode rpc invocation failed: com/esotericsoftware/kryo/KryoException, dubbo version: 2.8.4, current host: 127.0.0.1
java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/KryoException
        at com.alibaba.dubbo.common.serialize.support.kryo.KryoSerialization.deserialize(KryoSerialization.java:47) ~[dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:104) ~[dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:78) [dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:138) [dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:134) [dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:95) [dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:46) [dubbo-2.8.4.jar:2.8.4]
        at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:153) [dubbo-2.8.4.jar:2.8.4]
        at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564) [netty-3.10.4.Final.jar:?]
--
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.4.Final.jar:?]
        at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [netty-3.10.4.Final.jar:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_25]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_25]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_25]
Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.KryoException
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) ~[catalina.jar:8.0.44]
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) ~[catalina.jar:8.0.44]
        ... 23 more

我怀疑就是还是使用了原来老的kryo序列化方式。

然后我发现当我把消费者也重新部署一边之后就没有这个错误了

现在的解决方案是,在修改序列化方式的时候,不将kryo这个引入删除,然后再重新部署消费者之后就能切换到正常修改之后的序列化方式。

但是这样感觉很二啊, 消费者是自己的项目还好,如果消费者是其他系统的项目就需要别人也重新部署一下,十分得奇怪。

想问一下这个是BUG么,有没有其他解决方案。

修改之前的dubbo序列化配置:

修改后的dubbo序列化配置:

多谢各位。