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序列化的目的有兩個:
第一個是便於存儲,第二個是便於傳輸。