Proto Buffer是Google公司开发的一种数据描述语言,并于2008年对外开源。Protobuf刚开源时的定位类似于XML、JSON等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。但是我们更关注的是Protobuf作为接口规范的描述语言,可以作为设计安全的跨语言PRC接口的基础工具。

1. 什么是Proto Buffer

Protocol Buffers (a.k.a., protobuf) 是Google开发的,和语言无关、平台无关的可扩展机制,用于序列化结构体数据。可以在Google Developers网站上找到protobuf的文档。

  • 类似于XMLjson,用于数据的存储和传输。
  • 当前,Protocol Buffer 目前有两个版本:proto2proto3 (推荐使用最新的版本 proto3

2. 用途和优缺点

首先,我们需要了解,什么是序列化和反序列化:

  1. 序列化: 将 数据结构或对象 转换成 二进制串 的过程
  2. 反序列化:将在序列化过程中所生成的二进制串 转换成 数据结构或者对象 的过程

Protocol Buffers的作用,就是将数据进行序列化,方便数据的存储或者在网络中的传输。在接收端,可以将数据反序列化解码出来。

对比于 常见的 XML、Json 数据存储格式,Protocol Buffer有如下优缺点:

优点

  1. 序列化后的数据体积更小,压缩效率高
  2. 序列化和反序列化的速度更快(由于ProtoBuf的序列化原理,编码速度快)
  3. 传输的速度更快,这是由于体积小,是二进制传输

总结就是一句话:由于ProtoBuf的序列化原理,带来了性能上的优化

缺点

  1. 对比与XML和 Json,其可读性差,二进制人为不可读
  2. 不如他们的通用性好,而且自解释性差

使用场景

传输数据量大 & 网络环境不稳定 的数据存储、RPC 数据交换 的需求场景

3. 安装ProtoBuf编译器

Linux 上安装

我们可以从 github 上找到他的源码,而安装 protobuf 协议的编译器的最简单方法是从发行页面下载预构建的二进制文件:

发行页面:https://github.com/protocolbuffers/protobuf/releases

一般是下载 protobuf-cpp-xxx(版本号).tar.gz。下载好后,解压,切换到对应目录下,编译安装:

protobuf默认安装在 /usr/local 目录
你可以修改安装目录通过 ./configure --prefix=命令
虽然我是root用户但觉得默认安装过于分散,所以统一安装在/usr/local/protobuf下

$./configure --prefix=/usr/local/protobuf
$ make             //编译未编译的依赖包  #要编译很久
$ make check       //检查依赖包是否完整
$ make install     //开始安装Protocol Buffer

添加到系统的环境变量中:

vim  /etc/profile

打开配置文件,在该文件中添加下面内容,配置环境变量:

####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
######################################

然后保存退出,执行:

source /etc/profile

检查 Protocol Buffer 是否安装成功

λ protoc --version
libprotoc 3.10.0

Windows下安装

github上下载windows版本的Protocol Buffers,我下载的是 protoc-3.10.0-win64.zip

下载好后直接解压,就可以运行了

但是如果要再任意的地方运行,需要将其添加到环境变量中,如图所示:

protobuf能支持JAVA的泛型吗 protobuffer详解_protobuf能支持JAVA的泛型吗

打开终端,输入:

λ protoc --version
libprotoc 3.10.0

成功!!!

4. 使用ProtoBuf编译器

我们使用protoc 命令,可以将写好的 .proto 文件,转换成对应的代码。

如何编写 .proto 文件,请移步我的另一篇博客:// TODO


写好文件后,切换到要使用的proto文件路径下(或者,你如果以及配置好环境变量后,可以忽略这一步)

打开cmd窗口执行以下命令:

protoc --java_out=${OUTPUT_DIR} path/to/your/proto/file

例子:

我的.proto文件放在本目录下,希望java版本的proto文件也输出到本目录下,则:

protoc --java_out=./ test_hello.proto

如果是c++版本的话则需要写成:--cpp_out

其他版本的输出,可以参考下图:

protobuf能支持JAVA的泛型吗 protobuffer详解_微服务_02

输出之后程序命名一般为:

test_hello_pb2.py或TestHello.java格式,根据语言而变化

后续如果需要具体的使用,还需要配置一些环境

安装Go编译插件

有些语言需要单独安装插件才能编译proto,例如golang

安装go语言的protoc编译器插件
go get -u github.com/golang/protobuf/protoc-gen-go

注意: 安装go语言插件后,需要将 $GOPATH/bin 路径加入到PATH环境变量中。
即:
export PATH=$PATH:$GOPATH/bin
这样协议编译器protoc才能找到它。

编译成go语言版本:

protoc --go_out=. helloworld.proto

如果go get -u github.com/速度太慢,则可以考虑换源:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

5. 学习资料

  • Github官网:https://github.com/protocolbuffers/protobuf
  • 官网文档:https://developers.google.com/protocol-buffers/ (需要翻墙)
  • 中文官网文档:https://developers.google.cn/protocol-buffers

6. 总结

本文中,我们搞明白了Proto Buffer是什么,他的用途和优缺点是什么,有哪些应用场景,以及最重要的是如何安装 protoc。
后续可以阅读:

  • 详解Proto Buffer(初级)语法