热部署环境下,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做了专门优化的序列化。

也可以按照如下设计草稿进行设计:

 然后需要加上相关配置。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM