Dubbo(五)Dubbo+Kryo 實現高速序列化

Dubbo+Kryo 實現高速序列化

Kryo 是一種非常成熟的序列化實現,已經在 Twitter、Groupon、Yahoo 以及多個著名開源項目(如 Hive、Storm)中廣泛的使用。

在面向生產環境的應用中,目前更優先選擇 Kryo.


啓用Kryo

Provider 和 Consumer 項目啓用 Kryo 高速序列化功能,兩個項目的配置方式相同:

1、增加依賴(版本號,換成新的)

<dependency>
    <groupId>de.javakaffee</groupId>
    <artifactId>kryo-serializers</artifactId>
    <version>0.42</version>
</dependency>

2、application.yml增加配置

protocol:
	id: dubbo
	name: dubbo
	serialization: kryo
	optimizer: 自己的實現類地址

在這裏插入圖片描述

3、註冊被序列化類(實體類實現高速序列化)

要讓 Kryo 和 FST 完全發揮出高性能,最好將那些需要被序列化的類註冊到 dubbo 系統中,例如,我們可以實現如下回調接口:

public class SerializationOptimizerImpl implements SerializationOptimizer {
    public Collection<Class> getSerializableClasses() {
        List<Class> classes = new LinkedList<Class>();
        classes.add(BidRequest.class);
        classes.add(BidResponse.class);
        classes.add(Device.class);
        classes.add(Geo.class);
        classes.add(Impression.class);
        classes.add(SeatBid.class);
        return classes;
    }
}

由於註冊被序列化的類僅僅是出於性能優化的目的,所以即使你忘記註冊某些類也沒有關係。
事實上,即使不註冊任何類,Kryo 和 FST 的性能依然普遍優於 hessian 和 dubbo 序列化。


如果被序列化的類中 不包含無參的構造函數,則在 Kryo 的序列化中,性能將會大打折扣,因爲此時我們在底層將用 Java 的序列化來透明的取代 Kryo 序列化。
所以,儘可能爲每一個被序列化的類添加無參構造函數是一種最佳實踐(當然一個 Java 類如果不自定義構造函數,默認就有無參構造函數)。

另外,Kryo 和 FST 都不需要被序列化類實現 Serializable 接口,但我們還是建議每個被序列化類都去實現
Serializable 接口,因爲這樣可以保持和 Java 序列化以及 dubbo
序列化的兼容性,另外也使我們未來採用上述某些自動註冊機制帶來可能

建議:
(添加無參構造器)實體類 implement Serializable {} 和 kryo高速序列化,共同使用。

實體類 implement Serializable序列化的目的有兩個:
第一個是便於存儲,第二個是便於傳輸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章