Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)
Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)
序列化简介
序列化是Dubbo在RPC中非常重要的一个组成部分,其核心作用就是把网络传输中的数据,按照特定的格式进行传输。减小数据的体积,从而提高传输效率。

Dubbo制定了Serialization接口,然后有不同的实现。
常见的Dubbo序列化方式
| 序列化方式 | 备注 |
|---|---|
| Hessian | Dubbo协议中默认的序列化实现方案。 |
| Java Serialization | JDK的序列化方式。 |
| Dubbo序列化 | 阿里尚未开发成熟的高效Java序列化实现,目前不建议我们在生产环境使用它。 |
| Json序列化 | 目前有两种实现:一种是采用阿里的fastjson库;一种是采用Dubbo中自己实现的简单json库。 |
| Kryo | Java序列化方式,后续替换Hessian2,是一种非常成熟的序列化实现,已经在Twitter、Groupon、Yahoo以及多个著名开源项目(如Hive、Storm)中广泛使用。 |
| FST | Java序列化方式,后续替换Hessian2,是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例。 |
| 跨语言序列化方式 | ProtoBuf,Thirft,Avro,MsgPack(它更快更小。短整型被编码成一个字节)。 |
不同序列化方式的对比
基于Java的方式序列化对比(没有对比protobuf)下图来自官方文档:

Kryo序列化方式的使用
在父项目的pom文件中添加依赖
<dependency>
<groupId>org.apache.dubbo.extensions</groupId>
<artifactId>dubbo-serialization-kryo</artifactId>
<version>1.0.1</version>
</dependency>

xml形式
provider
在配置文件中书写下面的内容:
<!-- 设置rpc相关的协议 使得可以网络通信 -->
<dubbo:protocol name="dubbo" port="20880" serialization="kryo"/>

启动起来观看效果:

dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?anyhost=true&application=dubbo-02-provider&background=false&bind.ip=192.168.96.1&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.sjdwz.service.UserService&methods=login&pid=13136&prefer.serialization=kryo&release=3.2.0&serialization=kryo&side=provider×tamp=1695216749509, dubbo version: 3.2.0, current host: 192.168.96.1
comsumer
在配置文件中添加配置
<dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?serialization=kryo"/>
运行效果:

Boot的方式
provider
在配置文件中书写下面的内容:
spring:
application:
name: dubbo-04-provider
dubbo:
protocol:
name: dubbo
port: -1
serialization: kryo
consumer
注解
@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?serialization=kryo")
FST序列化方式的使用
在父项目的pom文件中添加依赖
<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>
其他操作类似Kryo序列化方式的使用。
FASTJSON2序列化方式的使用
在父项目的pom文件中添加依赖
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.23</version>
</dependency>
其他操作类似Kryo序列化方式的使用。
ProtoBuf序列化方式的使用
环境搭建
在父项目的pom文件中增加相关依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.22.2</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.22.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-protobuf</artifactId>
<version>2.7.23</version>
<exclusions>
<exclusion>
<artifactId>dubbo-common</artifactId>
<groupId>org.apache.dubbo</groupId>
</exclusion>
<exclusion>
<artifactId>dubbo-serialization-api</artifactId>
<groupId>org.apache.dubbo</groupId>
</exclusion>
<exclusion>
<artifactId>protobuf-java</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
<exclusion>
<artifactId>protobuf-java-util</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
</exclusions>
</dependency>
在父项目的pom文件中增加build内容
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}</protocArtifact>
<outputDirectory>${basedir}/src/main/java</outputDirectory>
<clearOutputDirectory>false</clearOutputDirectory>
<protocPlugins>
<protocPlugin>
<id>dubbo</id>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-compiler</artifactId>
<version>0.0.2</version>
<mainClass>org.apache.dubbo.gen.dubbo.Dubbo3Generator</mainClass>
</protocPlugin>
</protocPlugins>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
protobuf文件的编写
在dubbo-01-api模块的main目录新建一个proto文件夹;
注意必须叫这个名字,这样才能被maven插件读取到;

新建一个HelloService.proto的文件,在文件中编写如下内容:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.sjdwz";
option java_outer_classname = "HelloServiceProto";
message HelloRequest{
string name = 1;
}
message HelloResponse{
string result = 1;
}
service HelloService{
rpc sayHello(HelloRequest) returns (HelloResponse);
}

服务开发
在protobuf文件中右键

执行此命令:

注意:如果项目中有中文路径可能会报错,需要改成英文目录

可以clean一下把target目录下的内容删掉;
provider的开发
实现生成的service接口

xml文件配置

<!-- 为dubbo起个名字,要做到唯一,可以被注册中心所管理 -->
<dubbo:application name="dubbo-02-provider"/>
<!-- 设置rpc相关的协议 使得可以网络通信 -->
<dubbo:protocol name="dubbo" port="20880" serialization="protobuf"/>
<!-- 创建对象 -->
<bean id="helloService" class="com.sjdwz.service.HelloServiceImpl"/>
<!-- 发布dubbo服务 -->
<dubbo:service interface="com.sjdwz.HelloService" ref="helloService"/>
运行结果如下:

consumer的开发
xml配置
<dubbo:reference interface="com.sjdwz.HelloService" id="helloService"
url="dubbo://192.168.96.1:20880/com.sjdwz.HelloService?serialization=protobuf"/>
Java测试类
public class ClientApplication {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-consumer.xml");
HelloService hellService = applicationContext.getBean(HelloService.class);
HelloResponse response = hellService.sayHello(HelloRequest.newBuilder().setName("sjdwz").build());
System.out.println("response.getResult() = " + response.getResult());
System.in.read();
}
}

provider的开发——boot配置
spring:
application:
name: dubbo-04-provider
dubbo:
protocol:
name: dubbo
port: -1
serialization: protobuf
consumer的开发——boot配置
@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.HelloService?serialization=protobuf")
Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)的更多相关文章
- 透过byte数组简单分析Java序列化、Kryo、ProtoBuf序列化
序列化在高性能网络编程.分布式系统开发中是举足轻重的之前有用过Java序列化.ProtocolBuffer等,在这篇文章这里中简单分析序列化后的byte数组观察各种序列化的差异与性能,这里主要分析Ja ...
- 在Dubbo中使用高效的Java序列化(Kryo和FST)
在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ...
- java原生序列化和Kryo序列化性能比较
简介 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf,Thrift, ...
- jackson、fastjson、kryo、protostuff等序列化工具性能对比
简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...
- Netron开发快速上手(二):Netron序列化
Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用 ...
- SNF快速开发平台--多组织+多平台+多系统处理方案
多组织架构的集团要看组织的组成形式: 1.如果每个组织都是独立法人,这个相对来说简单一些,组织之间的关联交易跟集团外部客户交易没什么本质区别, 各个公司都是独立核算,正常的应收应付都需要开发票,各自出 ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi跨域处理方案
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案:目前采用we ...
- iOS开发图片加载的内存问题及优化方案
原创作者:Magic-Unique 原文地址:https://github.com/Magic-Unique/HXImage猿吧 - 资源共享论坛: http://www.coderbar.cn 做最 ...
- 2.dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据
作者:中华石杉 面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo ...
- 高效开发 Dubbo?用 Spring Boot 可得劲!
不仅简化了 Dubbo 基于 xml 配置的方式,也提高了日常开发效率,甚至提升了工作幸福感. 为了节省亲爱的读者您的时间,请根据以下2点提示来阅读本文,以提高您的阅读收获效率哦. 如果您只有简单的 ...
随机推荐
- 基于 gulp 的 fancybox 源码压缩
前不久,处理生信分析的网页版自动化报告时候就使用过 fancybox,今天在优化个人博客,为博文增加图片缩放效果,解决一些滚动条问题时,才从 fancybox 的 Github 源码中接触到 gulp ...
- 逍遥自在学C语言 | for循环详解
前言 C语言中的循环结构时,for循环是最常用的一种.它允许重复执行一段代码,直到满足特定条件为止. 本文将详细介绍for循环的用法,并提供相关的可编译运行的C代码示例. 一.人物简介 第一位闪亮登场 ...
- 10.5. 版本控制(如Git)
版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...
- 你以为搞个流水线每天跑,团队就在使用CI/CD实践了?
在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃.实际上,流水线的设计和写代码一样,需要基于"业务场景"进行一定的设计编排, ...
- Instruments中常用Template的使用
Instruments是苹果提供的Xcode套件,可用于分析iOS,MacOS程序的性能数据,进行性能提升.Instruments提供了很多类型的Template,用于特定场景的分析.这里选了3种常 ...
- 5步带你玩转SpringBoot自定义自动配置那些知识点
目前SpringBoot框架真的深受广大开发者喜爱,毕竟它最大的特点就是:快速构建基于Spring的应用程序的框架,而且它提供了各种默认的功能和配置,可以让开发者快速搭建应用程序的基础结构. 但是,当 ...
- CF1817E Half-sum
题意 有一个大小为 \(N\) 的非负整数集合 \(A\),每次你可以从集合中取任意两个数,并将它们的平均数放回序列.不停操作,知道集合最后剩下两个数.请求出这两个数的差的绝对值的最大值对 \(10^ ...
- 适合Windows桌面、Material Design设计风格、WPF美观控件库【强烈推荐】
推荐一个在Github已start超过13.6K,非常流行.美观的WPF控件库. 项目简介 这是一个适用于Windows桌面,全面且易于使用的控件库,遵循Google推测的Material Desig ...
- gRPC vs. HTTP:网络通信协议的对比
概述 gRPC 和 HTTP 是两种常见的网络通信协议,用于在客户端和服务器之间进行通信.它们具有不同的特点和适用场景,下面对它们进行详细比较. HTTP(Hypertext Transfer Pro ...
- 永远拥抱开放生态 | Metaworld2.0能力发布
回看过去的二十年,互联网从门户网站发布信息,用户只能获取阅读:到如今的人人生产内容,再借助各类平台设施上传投递给其他用户.这个过程中,内容生产力的分布从集中转为分散,恰似互联网从1.0走向2.0的 ...