乐趣区

关于java:Dubbo-序列化

前言

大家好,明天开始给大家分享 — Dubbo 专题之 Dubbo 序列化。在前一个章节中咱们介绍了 Dubbo 路由规定之标签路由,其实现原理为:如果生产端传递标签则和配置的动静规定和动态规定进行匹配,如果生产端未传递标签则应用服务提供端的本地配置的动态标签和动静配置标签进行匹配。同时咱们也例举了常见的应用场景并且进行了源码解析来剖析其实现原理。有的小伙伴能够想晓得 Dubbo 中近程调用数据传输是通过哪些形式进行数据的序列化呢?那么这个章节咱们一起来探讨在咱们的 Dubbo 中有哪些序列化形式以及性能体现如何。上面就让咱们疾速开始吧!

1. 序列化简介

首先咱们得明确什么是序列化和发序列化,举个简略的例子:当咱们须要把一个数据对象写入到文件或者在网络中传输时,就要把数据对象进行转换为二进制格局进行数据传输这个过程就叫做序列化,反之如果一个近程数据或本地文件数据须要读取并解析为咱们的对象时就叫做反序列化。在 Dubbo RPC 中,同时反对多种序列化形式:

  1. Dubbo 序列化:阿里尚未开发成熟的高效 Java 序列化实现,阿里不倡议在生产环境应用它
  2. Hessian2 序列化:Hessian 是一种跨语言的高效二进制序列化形式。但这里理论不是原生的 Hessian2 序列化,而是阿里批改过的 Hessian Lite,它是 Dubbo RPC 默认启用的序列化形式
  3. Json 序列化:目前有两种实现,一种是采纳的阿里的 Fastjson 库,另一种是采纳 Dubbo 中本人实现的简略 Json 库,但其实现都不是特地成熟,而且 Json 这种文本序列化性能个别不如下面两种二进制序列化。
  4. Java 序列化:次要是采纳 JDK 自带的 Java 序列化实现,性能很不现实。

下图是以后 2.7.x 版本中反对的序列化形式:

Dubbo RPC 默认采纳 Hessian2 序列化。但 Hessian 是一个比拟老的序列化实现了,而且它是跨语言的,所以不是独自针对 Java 进行优化的。而 Dubbo RPC 实际上齐全是一种 Java to Java 的近程调用,其实没有必要采纳跨语言的序列化形式。最近几年,各种新的高效序列化形式层出不穷,一直刷新序列化性能的下限,最典型的包含:

  1. 专门针对 Java 语言的:Kryo、FST 等等
  2. 跨语言的:Protostuff、ProtoBuf、Thrift、Avro、MsgPack 等等

其中,Kryo 是一种十分成熟的序列化实现,曾经在 Twitter、Groupon、Yahoo 以及多个驰名开源我的项目(如 Hive、Storm)中宽泛的应用。而 FST 是一种较新的序列化实现,目前还不足足够多的成熟应用案例。

2. 配置形式

上面咱们次要通过 XML 形式进行配置介绍:

XML 形式

<dubbo:protocol name="dubbo" serialization="hession2"/>

这里应用 serialization 来进行序列化形式配置。

3. 应用场景

依据后面的介绍咱们大略了解了什么是序列化和反序列化,而序列化和反序列化在 Dubbo 中是必须的,那么 Dubbo 中提供了多种序列化形式咱们应该应用哪一种序列化形式呢?咱们先看一个来自官网的性能测试图:

从上图能够看出序列化形式:kyro、FST 性能最优。如果被序列化的类中不蕴含无参的构造函数,则在 Kryo 的序列化中,性能将会大打折扣,因为此时咱们在底层将用 Java 的序列化来通明的取代 Kryo 序列化。所以,尽可能为每一个被序列化的类增加无参构造函数是一种最佳实际。另外,Kryo 和 FST 原本都不须要被序列化都类实现 Serializable 接口,但咱们还是倡议每个被序列化类都去实现它,因为这样能够放弃和 Java 序列化以及 Dubbo 序列化的兼容性。

4. 示例演示

上面我以获取图书列表为例进行演示。我的项目构造如下:

咱们次要看服务提供者端的 dubbo-provider-xml.xml 的 XML 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 自定序列化形式为:hession2 -->
    <dubbo:protocol port="20880"  serialization="hession2"/>

    <dubbo:application name="demo-provider" metadata-type="remote"/>

    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <bean id="bookFacade" class="com.muke.dubbocourse.serializable.provider.BookFacadeImpl"/>

    <!-- 裸露服务为 Dubbo 服务 -->
    <dubbo:service interface="com.muke.dubbocourse.common.api.BookFacade" ref="bookFacade" />

</beans>

下面的配置文件中指定序列化形式为hession2

5. 实现原理

上面咱们通过源码的形式简略的剖析它们的实现原理。上面咱们间接到序列化的外围类 org.apache.dubbo.remoting.transport.CodecSupport 咱们看其中的反序列化办法deserialize

 public static ObjectInput deserialize(URL url, InputStream is, byte proto) throws IOException {
   // 获取序列化对象     
   Serialization s = getSerialization(url, proto);
        return s.deserialize(url, is);
    }

咱们持续看看 getSerialization 办法:

 public static Serialization getSerialization(URL url, Byte id) throws IOException {
        // 通过协定查找 Serialization 对象
        Serialization serialization = getSerializationById(id);
        String serializationName = url.getParameter(Constants.SERIALIZATION_KEY, Constants.DEFAULT_REMOTING_SERIALIZATION);
        //...
        return serialization;
    }

下面查找通过 SPI 注册的所有序列化形式。咱们接着 deserialize 办法看,这里咱们以 Java JDK 提供的序列化形式为例:

    public ObjectInput deserialize(URL url, InputStream is) throws IOException {return new JavaObjectInput(is);
    }

能够看到这了通过 JDK 提供的 JavaObjectInput 对象包装数据流。其余的序列化形式也是相似,小伙伴能够自行剖析。

6. 小结

在本大节中咱们次要学习了 Dubbo 序列化,同时咱们也剖析了 Dubbo 中序列化的实现原理。其底层的实现原理就是利用咱们的序列化和反序列化框架对数据对象进行操作,同时咱们也介绍了以后针对 Java 序列化性能比拟高的两种形式,别离是:Kryo 和 FST。

本节课程的重点如下:

  1. 了解 Dubbo 序列化和反序列化
  2. 理解了序列化应用形式
  3. 理解序列化框架性能
  4. 理解序列化实现原理

作者

集体从事金融行业,就任过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就任于某银行负责对立领取零碎建设。本身对金融行业有强烈的喜好。同时也实际大数据、数据存储、自动化集成和部署、散布式微服务、响应式编程、人工智能等畛域。同时也热衷于技术分享创建公众号和博客站点对常识体系进行分享。关注公众号:青年 IT 男 获取最新技术文章推送!

博客地址: http://youngitman.tech

微信公众号:

退出移动版