首页 > 代码库 > 热部署环境下,dubbo序列化的bug和优化
热部署环境下,dubbo序列化的bug和优化
一、问题的发现与解决
(1) 在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException。
最后发现原因是我们的框架选择使用了java序列化,反序列化时底层会加载和寻找pojo类,在ObjectInputStream调用了如下函数:
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String name = desc.getName(); try { return Class.forName(name, false, latestUserDefinedLoader()); } catch (ClassNotFoundException ex) { Class<?> cl = primClasses.get(name); if (cl != null) { return cl; } else { throw ex; } } }
(2)latestUserDefinedLoader()默认使用了tomcat的webapploader。而在热部署环境下,loader是其它的,所以加载不到。
(3)解决办法是选择其它序列化方式。当然也可以继承ObjectInputStream,重写resolveClass,不过重写就显得麻烦了。
dubbo支持的序列化有dubbo、hessian2、java、compactedjava、json、fastjson、nativejava。其中java和nativejava序列化在热部署环境下有问题。
从效率和压缩比角度来看:建议使用默认的hessian2,也可以自定义为dubbo和compactedjava等方式。
二、dubbo序列化框架的时序图
解决问题时整理的时序图:
三、自定义序列化
如果对dubbo的序列化不满意,想使用kyro等针对java做了专门优化的序列化。
也可以按照如下设计草稿进行设计:
然后需要加上相关配置。
热部署环境下,dubbo序列化的bug和优化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。