最近在看canal源码的时候发现其中server与client数据通信使用了Protobuf协议,从前听过这个协议但是没用过,趁这个机会学习一下。
Protobuf是Google开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。
它不依赖于语言和平台并且可扩展性极强。相比于json
和xml
,Protobuf的使用更简单,传输的数据更小,序列化反序列化的性能更高。
本文简单介绍一下Protobuf在java中的使用。
安装
首先安装Protobuf。对于Mac OS只需要使用brew命令安装:
1 | brew install protobuf |
定义消息格式
和json
和xml
等协议不同,Protobuf在使用之前需要先定义一个.proto
文件作为消息的格式。
.proto
文件的格式参考:https://blog.csdn.net/u011518120/article/details/54604615#ScalarValueTypes
假设我们要定义一个评论的消息格式:
1 | syntax = "proto3"; |
Java使用
定义完.proto
消息描述文件之后,执行以下命令生成Java代码:
1 | protoc -I=src/main/java/love/wangqi --java_out=src/main/java comment.proto |
-I
:proto文件所在的目录--java_out
:Java文件存放目录- 最后是proto文件名称
执行完命令之后在src/main/java
目录下会生成CommentProto.java
类。
接下来我们就可以是用这个类了。
首先在pom文件中引入protobuf-java依赖:
1 | <dependency> |
之后我们就可以使用protobuf:
1 | public static void main(String[] args) throws InvalidProtocolBufferException { |
Protobuf与Json的性能对比
上面我们提高过,Protobuf相比于Json传输的数据更小,性能更高。下面我们来实验一下。
性能测试父类,通过多线程循环执行之后统计执行时间:
1 | public class Performance { |
ProtoBuf的性能测试代码:
1 | public class ProtoPerformance extends Performance { |
Json的性能测试代码:
1 | public class JsonPerformance extends Performance { |
接下来执行Json与Protobuf的性能对比:
1 | public class Main { |
执行结果如下:
从结果中我们可以看到protobuf序列化之后生成的数据要大大小于Json生成的数据,而且无论是序列化还是反序列化的性能都优于Json。
https://www.jianshu.com/p/bb3ac7e5834e
https://juejin.im/post/5b2a2880f265da598451eff3