dubbo RPC是dubbo体系中最核心的一种高性能、高吞吐量的远程调用方式

dubbo RPC主要用于两个dubbo系统之间作远程调用,特别适合高并发、小数据的互联网场景

而序列化对于远程调用的响应速度、吞吐量、网络带宽消耗等同样也起着至关重要的作用

  • 专门针对Java语言的:Kryo,FST等等
  • 这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。
    有鉴于此,我们为dubbo引入Kryo和FST这两种高效Java序列化实现,来逐步取代hessian2。
  • 在面向生产环境的应用中,我建议目前更优先选择Kryo。

启用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="com.alibaba.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[]

Dubbo RPC中不同序列化生成字节大小比较

序列化生成字节码的大小是一个比较有确定性的指标,它决定了远程调用的网络传输时间和带宽占用。

针对复杂对象的结果如下(数值越小越好):

序列化实现

请求字节数

响应字节数

Kryo

272

90

FST

288

96

Dubbo Serialization

430

186

Hessian

546

329

FastJson

461

218

Json

657

409

Java Serialization

963

630

dubbo 序列化踩坑 dubbo 序列化方式_序列化

Dubbo RPC中不同序列化响应时间和吞吐量对比

远程调用方式

平均响应时间

平均TPS(每秒事务数)

REST: Jetty + JSON

7.806

1280

REST: Jetty + JSON + GZIP

TODO

TODO

REST: Jetty + XML

TODO

TODO

REST: Jetty + XML + GZIP

TODO

TODO

REST: Tomcat + JSON

2.082

4796

REST: Netty + JSON

2.182

4576

Dubbo: FST

1.211

8244

Dubbo: kyro

1.182

8444

Dubbo: dubbo serialization

1.43

6982

Dubbo: hessian2

1.49

6701

Dubbo: fastjson

1.572

6352

dubbo 序列化踩坑 dubbo 序列化方式_dubbo 序列化踩坑_02

dubbo 序列化踩坑 dubbo 序列化方式_dubbo 序列化踩坑_03