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序列化的目的有两个:
第一个是便于存储,第二个是便于传输。

发布了44 篇原创文章 · 获赞 5 · 访问量 898

猜你喜欢

转载自blog.csdn.net/qq_40634246/article/details/104660507