文章目录
文章说明
一:序列化概念
1:概念
2:Dubbo中序列化方式
二:Kyro序列化方案
1:引入依赖
2:XML的配置方式
3:Boot的方式
4:Consumer端调用
三:FST序列化方式使用
1:引入依赖
2:XML的配置方式
3:SpringBoot的配置方式
4: Consumer端调⽤
文章说明
本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系
一:序列化概念
1:概念
序列化是RPC的时候,将需要传输的内容,按照一定方式转换为二进制的过程,这也是编码的过程。同样将这样的二进制数据解码的过程,也叫反序列化。
不要小看这个过程,好的序列化方案,就好比人说话,三个字能表达清楚的含义绝对不需要写一篇小作文,这样做最大的好处就是节省了带宽,提升了传输效率。
Dubbo设计序列化的时候,设计了一个接口Serialization,接口下有具体的序列化实现方案。
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)交换数据,但他体积更小。短整形被编码成为一个字节)。
已完成。 了解不同序列化方案,通信。
二: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×tamp=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×tamp=1691596862730, dubbo version: 3.2.0, current host: 192.168.8.1