说一个挺有意思的解释dubbo关系,dubbo分为服务者和消费者,服务者比作司机,消费者比作乘客,zookeeper比作滴滴APP,双方之间的建立关系都在这个APP体现)
说正题了,昨天写了一个dubbo 提供的接口报错,百思不得其解。
第一眼感觉是序列化的问题,实际已经加上了:
1.序列化的问题,缺少Serializable(bean实现Serializable接口即可)
Serialized class com.yykj.mall.dto.ProductListItemDTO must implement java.io.Serializable
报错信息如下:
Caused by: java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/factories/SerializerFactory
at com.alibaba.dubbo.common.serialize.support.kryo.KryoFactory.createKryo(KryoFactory.java:74) at com.alibaba.dubbo.common.serialize.support.kryo.PooledKryoFactory.getKryo(PooledKryoFactory.java:43) at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectOutput.<init>(KryoObjectOutput.java:31) at com.alibaba.dubbo.common.serialize.support.kryo.KryoSerialization.serialize(KryoSerialization.java:43) at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encodeRequest(ExchangeCodec.java:240) at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:76) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:39) at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:81) at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:66) at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59) at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) at org.jboss.netty.channel.SimpleChannelHandler.writeRequested(SimpleChannelHandler.java:292) at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.writeRequested(NettyHandler.java:99) at org.jboss.netty.channel.SimpleChannelHandler.handleDownstream(SimpleChannelHandler.java:254) at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:582) at org.jboss.netty.channel.Channels.write(Channels.java:704) at org.jboss.netty.channel.Channels.write(Channels.java:671) at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:348) at com.alibaba.dubbo.remoting.transport.netty.NettyChannel.send(NettyChannel.java:98) ... 52 more
Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.factories.SerializerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 73 more
出现问题,总是感觉都配对了,很完美,嗯嗯嗯,但是就是一直这个错,感觉是一个心病一样缠绕。。。。
所以,想一想列出几项错误:
1.配置问题
2.接口调用(使用命令)
3.使用工具验证 (dubbo-admin)
1.首先保证配置正确(好像是废话,但是我不删)
2.使用dubbo-admin注册服务中心,等于zookeeper的可视化界面,服务端和消费端接口正常情况
3.使用CMD或win10 PowerShell操作,telnet本地的dubbo端口, telnet 127.0.0.1 20880
回车
(找之前的问题截屏,太费劲就手写了)
dubbo> ls dubbo> com.dubbo.IDubboService// 你的接口 dubbo> ls IDubboService // 查看你的方法是否存在 select // 三个方法 insert update dubbo> invoke select("哈哈哈") [{"哈哈哈","中国","xxx@qq.com"}] // 说明接口能调通,没有问题
说了这么多,总之前面的问题还没有解决,从另一方面解决,保证其他项是没有问题的(如配置,接口实现等)
想了好久,SerializerFactory感觉还是序列化出问题
1.dubbo请求接口正常,说明配置是没有问题的,问题出现在我消费者调用服务者的时候或,我在启动消费者过程中发现这个错,表示转换有问题,不兼容,不匹配-------> 检查版本
--查看zookper版本,dubbo引包的版本
服务者
消费者
哦,果然是,总结:版本不兼容,确实是,替换一样的版本就好了,原因在于,项目过多,依赖好多jar不一定是这个版本,所以,保证双方之间版本一致性是很重要的,解决很多调用的时候,或者异常错误不明朗,高版本和低版本差异等,检查版本往往是有效果的,夜深了就说这么多了。