基本概念:
Protocol Buffers(通常简称为 Protobuf)是一种由 Google 开发的用于序列化结构化数据的语言中立、平台中立、可扩展的机制。它类似于 XML 和 JSON,但更小、更快、更简单。以下是对 Protocol Buffers 的简单介绍
主要特点:
语言中立:Protocol Buffers 可以生成多种编程语言的代码(如 C++、Java、Python、Go、C# 等),使得不同语言编写的系统之间可以轻松地交换数据。
平台中立:它可以在不同的操作系统和硬件平台上使用,确保数据在不同环境中的兼容性。
高效的数据序列化:Protocol Buffers 生成的数据格式非常紧凑,比 XML 和 JSON 更小,传输和存储效率更高。序列化和反序列化速度快,适合高性能应用场景。
可扩展性:您可以随时添加新的字段到数据结构中,而不会破坏现有的代码和数据。旧版本的代码仍然可以读取新版本的数据,只要忽略新字段即可。
定义数据结构:使用 .proto
文件定义数据结构,描述数据的字段和类型。例如:
message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
如何在 mac 上进行安装protobuf 和相关 go 插件:
在 mac 上可以很方便的使用 homebrew 进行安装。不过需要注意的是,名称需要注意。
brew install protobuf
brew install protoc-gen-go
brew install protoc-gen-go-grpc
三个命令分别执行之后等待一段时间久可以下载完成。
验证安装结果:
protoc --version
protoc-gen-go --version
protoc-gen-go-grpc --version
执行上面的命令,能看到命令行,输出版本信息,说明已经安装完成,比如我安装的版本是 28.2。
libprotoc 28.2
protoc-gen-go v1.35.1
protoc-gen-go-grpc 1.5.1
几个关键的名词解释:
Protocol Buffers(Protobuf)、protoc-gen-go
和 protoc-gen-go-grpc
之间的关系可以概括为以下几点:
Protocol Buffers(Protobuf)
- 定义:Protocol Buffers 是一种用于序列化结构化数据的语言中立、平台中立、可扩展的机制。
- 作用:它允许开发者定义数据结构(使用
.proto
文件),并通过编译器生成不同编程语言的代码,以便在不同系统之间高效地交换数据。
protoc
编译器
- 定义:
protoc
是 Protocol Buffers 的编译器,用于将.proto
文件编译成目标编程语言的代码。 - 作用:
protoc
读取.proto
文件,并生成相应的代码文件,这些代码文件包含了数据结构的定义和序列化/反序列化的方法。
protoc-gen-go
- 定义:
protoc-gen-go
是一个插件,用于protoc
编译器,专门生成 Go 语言的代码。 - 作用:当使用
protoc
编译.proto
文件时,可以通过指定--go_out
参数来调用protoc-gen-go
插件,生成 Go 语言的代码。生成的代码包括数据结构的定义、序列化和反序列化的方法。
protoc-gen-go-grpc
- 定义:
protoc-gen-go-grpc
是另一个插件,用于protoc
编译器,专门生成 Go 语言的 gRPC 代码。 - 作用:当使用
protoc
编译.proto
文件时,可以通过指定--go-grpc_out
参数来调用protoc-gen-go-grpc
插件,生成 Go 语言的 gRPC 代码。生成的代码包括 gRPC 服务的接口定义、客户端和服务器端的代码。
关系总结
- Protocol Buffers 是定义数据结构和序列化机制的基础。
protoc
编译器 是用于将.proto
文件编译成不同编程语言代码的工具。protoc-gen-go
是protoc
的一个插件,专门用于生成 Go 语言的代码。protoc-gen-go-grpc
是protoc
的另一个插件,专门用于生成 Go 语言的 gRPC 代码。
使用示例
假设你有一个 .proto
文件 example.proto
,你可以使用以下命令生成 Go 语言的代码:
protoc --go_out=. --go-grpc_out=. example.proto
--go_out=.
参数调用protoc-gen-go
插件,生成 Go 语言的基本代码。--go-grpc_out=.
参数调用protoc-gen-go-grpc
插件,生成 Go 语言的 gRPC 代码。