Protobuf,全称Protocol Buffers,由Google公司开发出来且其内部广泛使用,对比其它的编解码框架,有如下几个优点:
1. 跨语言支持,如Java、C++、Python等
2. 编码后消息更小,因此,更有利于网络传输和本地存储,当然,性能也很强大
3. 不同版本协议的数据结构前向兼容
Protobuf依据".proto"文件来生成各种语言代码,在Windows电脑可能要另外安装,而类Linux系统应该都默认安装了,我使用的Mac电脑已经安装了:
这里基于Java来使用,构建工具使用maven,首先在pom.xml增加对protobuf的依赖:
以及maven的protobuf插件:
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<!-- https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html -->
<configuration>
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
<clearOutputDirectory>true</clearOutputDirectory>
<pluginId>grpc-java</pluginId>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
新建目录:
- src/main/proto
安装IDEA插件,以便高亮语法:
这里做一个简单的登录请求接口,客户端发送账号密码到服务端,服务端验证后返回消息,因此,编写请求实体类的proto描述文件如下:
新建proto接口文件:
生成目标类文件:
点击其中的protobuf:compile即可,但发生如下错误:
因为Mac电脑默认装的是2.6.1版本,这里手动升级,在GitHub下载3.6.1的的OS X的编译好的可执行文件,配置环境变量即可(注意,默认IDE从/usr/local/bin目录下去找protoc可执行文件,这里ln -s做一个软链接过去即可):
重新,生成即可看到:
下面测试下序列化:
我们可以使用JSON来将对象序列化传输,但是性能肯定比不上protobuf,这里序列化后输出如下:
反序列化,就是把这串bytearray转成对象:
try {
System.out.println(ModelAccount.Account.parseFrom(account.toByteArray()).toString());
}
catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
基本使用就到这,更多扩展可以参考官方文档。protobuf在数据交换存储效率上较xml或json具有更高的效率,因此,在多个微服务的数据通信中可以借助它,对外,可以提供http数据形式的接口,但是,各个微服务内部,基于gRPC的远程过程调用,它底层使用protobuf来做数据交换,这样可以提供系统的性能。