protobuf简介
Protocol Buffers(protobuf)
:与编程语言无关,与程序运行平台无关的数据序列化协议以及接口定义语言(IDL: interface definition language)。
要使用protobuf
需要先理解几个概念:
-
protobuf
编译器protoc
,用于编译.proto
文件
-
编程语言的
protobuf
插件,搭配protoc
编译器,根据.proto
文件生成对应编程语言的代码。 -
protobuf runtime library
:每个编程语言有各自的protobuf runtime
,用于实现各自语言的protobuf
协议。 -
Go语言的
protobuf
插件和runtime library
有过2个版本:-
第1个版本开源地址:https://github.com/golang/protobuf,包含有插件
proto-gen-go
,可以生成xx.pb.go
和xx_grpc.pb.go
。Go工程里导入该版本的protobuf runtime
的方式如下:import "github.com/golang/protobuf"
-
第2个版本开源地址:https://github.com/protocolbuffers/protobuf-go,同样包含有插件
proto-gen-go
。不过该项目的proto-gen-go
从v1.20
版本开始,不再支持生成gRPC服务定义,也就是xx_grpc.pb.go
文件。要生成gRPC服务定义需要使用grpc-go
里的progo-gen-go-grpc
插件。Go工程里导入该版本的protobuf runtime
的方式如下:import "google.golang.org/protobuf"
推荐使用第2个版本,对protobuf的API做了优化和精简,并且把工程界限分清楚了:
-
第一,把
protobuf
的Go实现都放在protobuf的项目里,而不是放在golang语言项目下面。 -
第二,把
gRPC
的生成,放在grpc-go
项目里,而不是和protobuf runtime
混在一起。
有的老项目可能使用了第1个版本的
protobuf runt
-