熱部署環境下,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