Protocol Buffer 介绍
Protocol Buffer(缩写Protobuf)是Google开发的一种跨语言、跨平台、可扩展的机制,用于序列化结构化数据。类似于XML,但是更小、更快和更简单。它是Google内部主要的数据交互格式。
介绍
发展历史
- 名称来自代码的类名
ProtocolBuffer proto1:2001年出在Google内部开发和使用proto2:2008年开源,独立后不依赖任何Google内部代码proto3:(当前主流版本)2016年开源,整合了很多的意见和建议,提高开发效率。但不兼容之前版本- 最新版本为 v21.5,更多版本见 releases
特点
- 支持多种语言,如 C++、Java、Python、Objective-C、C#、Ruby、Go、PHP、Dart
- 性能高:压缩率高,速度快
- 具有向后兼容的特性,更新
.proto文件后,老版本依旧可以兼容(设计之初期望解决的问题)- 编译器对不能识别的字段自动跳过
- 最主流的
IDL(interface description language)
什么是序列化
序列化是指将数据结构或对象状态转换成可取用(存储或网络传输)格式,以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程反序列化是其逆操作的过程
常见的序列化格式包括:yaml、json、xml、protobuf等。
安装 protoc compiler
protoc(Protocol Compiler)编译器- 新版本参考安装(推荐)
- 旧版本参考
- 安装包解压后放到
bin + include目录(父目录为/usr/local)unzip protoc-xx.x-linux-x86_64.zip -d /usr/local
include的文件也可以通过protoc -I/usr/local/include指定
源码安装
- Golang 安装部署配置
$GOPATH/$GOBIN - 二进制安装
protoc (protoc compiler)
直接到 github 下载,注意选择合适的版本
ubuntu 包安装
apt update
apt install protobuf-compiler golang-goprotobuf-dev安装 protoc 插件
- protoc 插件本质是一个命令行工具,根据 proto 文件,生成目标代码
- 插件可执行文件命名格式
protoc-gen-$NAME,默认安装在某个PATH下(如/usr/local/bin/),可以直接执行- 当
protoc命令中有--${NAME}_out参数时,会调用上述格式为protoc-gen-$NAME的插件 --${NAME}_out参数控制传递给插件的参数和生成文件输出目录,并且是以${OPTION},${OPTION}:${OUT_PATH}的形式- 新的参数
--${NAME}_opt专门来负责参数传递,区分开了两个功能- 即
--${NAME}_out=${OPTION},${OPTION}:${OUT_PATH}等价于--${NAME}_out=${OUT_PATH} --${NAME}_opt=${OPTION},${OPTION}
- 即
- 当
示例:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/demo.proto说明:
- protoc 执行时,调用
protoc-gen-go和protoc-gen-go-grpc两个插件 - 且均传递了参数
paths=source_relative
protoc-gen-go
安装 protoc-gen-go
export GO111MODULE=on
export GOPROXY=https://goproxy.io,direct
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
# old version
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}使用
以 proto3 为例(参考官方go示例)Protobuf 使用时,一般的步骤:
- 创建定义消息格式的
.proto文件,语法见:proto 语法 - 安装 protoc,并使用 protoc 编译 protocol buffer 文件,生成对应的
.pb.go文件(包括消息 struct 和对象的方法、grpc 文件等),参考:Golang 使用 protobuf 实现 grpc 通信 - 使用 Go protocol buffer API 来写入和读取消息
最近更新
最新评论