干翻Dubbo系列第九篇:Dubbo体系中序列化详解

这篇具有很好参考价值的文章主要介绍了干翻Dubbo系列第九篇:Dubbo体系中序列化详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

干翻Dubbo系列第九篇:Dubbo体系中序列化详解,dubbo

文章目录

文章说明

一:序列化概念

1:概念

2:Dubbo中序列化方式

二:Kyro序列化方案

1:引入依赖

2:XML的配置方式

3:Boot的方式

4:Consumer端调用

三:FST序列化方式使用

1:引入依赖

2:XML的配置方式

3:SpringBoot的配置方式

4: Consumer端调⽤


一:序列化概念

1:概念

序列化是RPC的时候,将需要传输的内容,按照一定方式转换为二进制的过程,这也是编码的过程。同样将这样的二进制数据解码的过程,也叫反序列化。

不要小看这个过程,好的序列化方案,就好比人说话,三个字能表达清楚的含义绝对不需要写一篇小作文,这样做最大的好处就是节省了带宽,提升了传输效率。

Dubbo设计序列化的时候,设计了一个接口Serialization,接口下有具体的序列化实现方案。

干翻Dubbo系列第九篇:Dubbo体系中序列化详解,dubbo

2:Dubbo中序列化方式

1:JDK的序列化方式

2:Hessian2  Hessian序列化方式第二个版本, Dubbo自己的序列化方式,Dubbo默认方案

3:Dubbo序列化  阿里尚未开发成熟的一种高效率序列化方案,阿里不建议在生产环境使用。

4:基于Json的序列化方式。目前有两种方案,一种是采用阿里的FastJson库,另外一种是采用dubbo中自己实现的简单json库,使用这种序列化方式,基本上使用的都是http协议。

5:Kryo   Java序列化方式,后续替换Hessian2一种非常成熟的序列化实现。相对比较新

6:FST    Java序列化方式,后续替换Hessian2会中非常成熟的序列化方案。相对比较新

7:跨语言序列化方式:ProtoBuf (性能最优),Thrift ,Avro(大数据),(MsgPackage是一种有效的二进制格式,允许在多种语言(如Json)交换数据,但他体积更小。短整形被编码成为一个字节)。

 干翻Dubbo系列第九篇:Dubbo体系中序列化详解,dubbo

已完成。 了解不同序列化方案,通信。

二:Kyro序列化方案

Kyro序列化方案,Dubbo是不支持的,所以想要使用这种序列化方案,需要引入对应的Jar包。

1:引入依赖

        <dependency>
            <groupId>org.apache.dubbo.extensions</groupId>
            <artifactId>dubbo-serialization-kryo</artifactId>
            <version>1.0.1</version>
        </dependency>

2:XML的配置方式

    <dubbo:protocol name="dubbo" port="20880" server="kyro"/>

3:Boot的方式

dubbo:
    protocol:
        name: dubbo
        port:-1
        serialization:kryo

4:Consumer端调用

<dubbo:reference interface="com.suns.service.UserService" id="userService"
url="dubbo://192.168.8.1:20880/com.suns.service.UserService?serialization=kyro"/>

补充说明:

Provider启动成功后可以看到Export日志的中URL地址后边?拼接上了serialization=kyro这就代表了指定了序列化方案为kyro。

后续如果使用注册中心的话,上述配置中的URL就可以不写了。如果不用注册中心的话,Consumer的调用的需要写上URL和序列化方式的。

从上图中我们可以看到Kyro的这种序列化方式是非常棒的,后续我们也建议使用这种序列化方式。

三:FST序列化方式使用

1:引入依赖

        <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-serialization-fst</artifactId>
             <version>2.7.23</version>
             <exclusions>
                 <exclusion>
                     <artifactId>dubbo-common</artifactId>
                     <groupId>org.apache.dubbo</groupId>
                 </exclusion>
             </exclusions>
         </dependency>

补充说明: 经过验证,这块排除其实是没有必要的,因为Dubbo的jar包当中并没有依赖dubbo-common,所以不存在该依赖项的冲突。

2:XML的配置方式

<dubbo:protocol name="dubbo" port="-1" serialization="fst"/>

3:SpringBoot的配置方式

dubbo:
    protocol:
        name: dubbo
        port: -1
        serialization: fst

4: Consumer端调⽤

<dubbo:reference id="userService" interface="com.suns.service.UserServ
ice" url="dubbo://192.168.50.62:20880/com.suns.service.UserService?serial
ization=fst"/>

如果是基于注解的方式:

@DubboReference(url = "dubbo://192.168.50.62:20880/com.suns.service.Us
erService?serialization=fst")

补充说明:

Provider启动成功后可以看到Export日志的中URL地址后边?拼接上了serialization=fst这就代表了指定序列化方案为fst

后续如果使用注册中心的话,上述配置中的URL就可以不写了。如果不用注册中心的话,Consumer的调用的需要写上URL和序列化方式的。

Fst序列化方式很高,可以替换Hessian2但是,现在比较新的序列化方式,但是没有大厂敢用,没有成熟案例。真正实战的时候,建议还是使用kyro。

关于Dubbo默认序列化的版本问题:3.2.0之前默认的是Hessian2的方式,3.2.0之后,默认就是FastJson2的方式了

prefer.serialization=fastjson2,hessian2

00:01:03.745 [main] INFO org.apache.dubbo.config.ServiceConfig -  [DUBBO] Export dubbo service com.suns.service.UserService to local registry url : injvm://127.0.0.1/com.suns.service.UserService?anyhost=true&application=dubbo-02-provider&background=false&bind.ip=192.168.8.1&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&exporter.listener=injvm&file-cache=true&generic=false&interface=com.suns.service.UserService&methods=login&pid=2396&prefer.serialization=fastjson2,hessian2&release=3.2.0&side=provider&timestamp=1691596862730, dubbo version: 3.2.0, current host: 192.168.8.1

00:01:03.745 [main] INFO org.apache.dubbo.config.ServiceConfig -  [DUBBO] Export dubbo service com.suns.service.UserService to url dubbo://192.168.8.1:20880/com.suns.service.UserService?anyhost=true&application=dubbo-02-provider&background=false&bind.ip=192.168.8.1&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.suns.service.UserService&methods=login&pid=2396&prefer.serialization=fastjson2,hessian2&release=3.2.0&side=provider&timestamp=1691596862730, dubbo version: 3.2.0, current host: 192.168.8.1

四:FASTJSON2序列化方式

1:引入依赖

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.23</version>
        </dependency>

2:XML的配置方式

<dubbo:protocol name="dubbo" port="-1" serialization="fastjson2"/>

3:SpringBoot的配置方式

dubbo:
    protocol:
        name: dubbo
        port: -1
        serialization: fastjson2

4:Cosumer端调动

1<dubbo:reference interface="com.suns.service.UserService" id="userService" url="dubbo://192.168.50.62:20880/com.suns.service.Use
rService?serialization=fastjson2"/>

补充说明:

这中方式主要是适用于应用JSON的方式。通过JSON的方式在消费者和提供者之间进行网络传输。

为什么采用FastJson2的这种方式呢?

干翻Dubbo系列第九篇:Dubbo体系中序列化详解,dubbo

 FastJSON2在FASTJSON的基础上解决了安全漏洞,提供了更快的效率,目前是一个高性能的JSON库。

作为FastJSON2只能在3.1.0以上的版本才会支持。甚至在Dubbo3.2以上版本之后,FastJson2已经替换掉了Hession2。

五:文章来源地址https://www.toymoban.com/news/detail-636655.html

到了这里,关于干翻Dubbo系列第九篇:Dubbo体系中序列化详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DevOps系列文章 之 SnakeYAML解析与序列化YAML

    如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档 。 在DevOps平台系统中是基础的能力支持,不管是spring boot 的配置还是K8S 资源清单yaml 要在项目中使用SnakeYAML,需要添加Maven依赖项(可在此处找到最新版本) 该 YAML 类是API的入口点: 由于实现不

    2024年02月13日
    浏览(65)
  • 告别脚本小子系列丨JAVA安全(8)——反序列化利用链(下)

    0x01 前言 在前面的文章中介绍了基于CC链的反序列化利用方式,并且通过最终调用Runtime类的exec方法达到命令执行的效果。在CC链中还可以通过xalan来执行命令。 xalan是java操作xml的库,属于java内置的官方库之一,在CC链中主要用到的是com.sun.org.apache.xalan.internal.xsltc.trax.Templates

    2024年02月11日
    浏览(32)
  • 【优化技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码; 对象传递和保存时,保证对象的完整性和可传递性。把对象转换为有字节码,以便在网络上传输或保存在本地文件中; 反序列化就是指把字节码恢复为对象; 根据字节流中保存的对象状态及描述信息,通过反序列化重建

    2024年01月22日
    浏览(39)
  • 干翻Dubbo系列第一篇:Dubbo是什么?

    早期Dubbo的定位基于JAVA的高性能,轻量级RPC框架 [high-performance, lightweight,Java-based RPC framework] SOA[Service-Oriented Architecture 面向服务的架构] = RPC+服务治理,服务治理包括注册中心、配置中心等等。 2018年阿里巴巴把这个框架捐献给了 Apache 基金会,正式更名为Apache Dubbo最新版本为

    2024年02月09日
    浏览(30)
  • 干翻Dubbo系列第十二篇:Dubbo协议介绍

    文章目录 文章说明 一:Dubbo协议 1:Dubbo协议简介 2:Dubbo协议优点  3:Dubbo协议帧的组成 (一):幻数 (二):2Way (三):event (四):Serilization ID (五):status (六):RequestID (七):数据长度         Rpc过程当中三个核心的要素就是: 协议、序列化 、通信方式         Dubbo协议

    2024年02月12日
    浏览(23)
  • 干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

    1:协议端口 补充说明1: 显示指定Dubbo服务启动的端口号:一个服务器上起多个Provider都这样显示的指定port端口号的话,会造成端口号冲突。 解决方式:我们可以port设置为-1,服务启动时默认采用20880(dubbo协议默认端口),此端口被占用默认会+1,一直到加端口不占用为止。

    2024年02月15日
    浏览(34)
  • 【序列化与反序列化】关于序列化与反序列化MessagePack的实践

    在进行序列化操作之前,我们还对系统进行压测,通过 jvisualvm 分析cpu,线程,垃圾回收情况等;运用火焰图 async-profiler 分析系统性能,找出程序中占用CPU资源时间最长的代码块。 代码放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/ser

    2024年02月11日
    浏览(45)
  • 【网络】序列化反序列化

    在前文《网络编程套接字》中,我们实现了服务器与客户端之间的字符串通信,这是非常简单的通信,在实际使用的过程中,网络需要传输的不仅仅是字符串,更多的是结构化的数据(类似于 class , struct 类似的数据)。 那么我们应该怎么发送这些结构化的数据呢? 如果我们

    2024年02月05日
    浏览(32)
  • 序列化,反序列化之实例

    介绍文章 __construct() 当一个对象创建时自动调用 __destruct() 当对象被销毁时自动调用 (php绝大多数情况下会自动调用销毁对象) __sleep() 使**用serialize()函数时触发 __wakeup 使用unserialse()**函数时会自动调用 __toString 当一个对象被当作一个字符串被调用 __call() 在对象上下文中调用不

    2024年02月14日
    浏览(34)
  • 协议,序列化,反序列化,Json

    协议究竟是什么呢?首先得知道主机之间的网络通信交互的是什么数据,像平时使用聊天APP聊天可以清楚,用户看到的不仅仅是聊天的文字,还能够看到用户的头像昵称等其他属性。也就可以证明网络通信不仅仅是交互字符串那么简单。事实上网络通信还可能会通过一个结构

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包