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

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

 然后需要加上相关配置。

posted @ 2017-06-04 22:56  叶扬  阅读(2624)  评论(0编辑  收藏  举报