Kryo 和 FST 序列化

    在 Dubbo 中使用高效的 Java 序列化(Kryo 和 FST)

    启用 Kryo 和 FST

    使用 Kryo 和 FST 非常简单,只需要在 dubbo RPC 的 XML 配置中添加一个属性即可:

    <dubbo:protocol name="dubbo" serialization="kryo"/>
    
    <dubbo:protocol name="dubbo" serialization="fst"/>
    

    注册被序列化类

    要让 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;
        }
    }
    

    然后在 XML 配置中添加:

    <dubbo:protocol name="dubbo" serialization="kryo" optimizer="org.apache.dubbo.demo.SerializationOptimizerImpl"/>
    

    在注册这些类后,序列化的性能可能被大大提升,特别针对小数量的嵌套对象的时候。

    当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:

    GregorianCalendar
    InvocationHandler
    BigDecimal
    BigInteger
    Pattern
    BitSet
    URI
    UUID
    HashMap
    ArrayList
    LinkedList
    HashSet
    TreeSet
    Hashtable
    Date
    Calendar
    ConcurrentHashMap
    SimpleDateFormat
    Vector
    BitSet
    StringBuffer
    StringBuilder
    Object
    Object[]
    String[]
    byte[]
    char[]
    int[]
    float[]
    double[]
    

    由于注册被序列化的类仅仅是出于性能优化的目的,所以即使你忘记注册某些类也没有关系。事实上,即使不注册任何类,Kryo和FST的性能依然普遍优于 hessian 和 dubbo 序列化。