热部署环境下,dubbo序列化的bug和优化

Posted 叶扬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了热部署环境下,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和优化的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot入门-开发环境热部署

dubbo provider 反序列化rce及补丁绕过

软件项目部署环境

dubbo windows环境下安装部署

关于dubbo在linux环境weblogic下启动报错

性能测试二十八:环境部署之Dubbo部署