Google Protocol Buffer 和 gRPC 简介
Protocol Buffer
Protocol buffer 是谷歌推出的一种轻便高效的结构化数据存储格式,把结构化的数据序列化。常用以存储数据、作为网络通信的数据载体。具有提供多种编程语言的 API、跨平台和可扩展的特性。比 JSON 和 XML 更小、解析速度更快、更易于程序员上手,另外我在网上看到一篇文章介绍了三者的性能测试,Protobuf Marshal 大概比 JSON 快的五倍、XML 快十倍;Unmarshal 大概比 JOSN 快六倍,比 XML 快二十一倍。Benchmarking Protocol Buffers, JSON and XML in Go
- Protocol Buffers Marshal: 819 ns/op
- Protocol Buffers Unmarshal: 1163 ns/op
- JSON Marshal: 3316 ns/op
- JSON Unmarshal: 7196 ns/op
- XML Marshal: 9248 ns/op
- XML Unmarshal: 30485 ns/op
所以,如果团队开发条件允许,构建高并发扩展性灵活的接口,我还是会选择 gRPC, Protobuf 这两把利剑。
这两周大部分时间都在学习 Golang ,尝试着使用 gRPC 和 ProtoBuf 开发接口。安装 golang/protobuf Golang 语言版本的 API 时,需要先安装标准 C++ 实现的 protocol buffer google/protobuf
使用 MacOS 开发可通过 homebrew 直接安装即可:
brew install protobuf
Golang 开发环境的安装在这里不再赘述,有了 golang 环境之后,就可以安装支持 Go 调用的 Protocol buffer API 了:
go get -u github.com/golang/protobuf/protoc-gen-go
安装的工作看似已经完成,笔者在开发的过程中因为遗忘了把 Go 的 $GOPATH/bin
设置在系统 $PATH
中,导致在编译 xxx.proto
文件时出现报错:
➜ demo-grpc git:(master) ✗ protoc -I api/ \
-I${GOPATH}/src \
--go_out=plugins=grpc \
api/api.proto
protoc-gen-go: program not found or is not executable
--go_out: protoc-gen-go: Plugin failed with status code 1.
最后搜索了一把才意识到 Golang 环境变量没配好,提醒读者注意。
配置 Go 环境变量:
export PATH=$PATH:$GOPATH/bin
Unable to build protobuf to go endpoint
开发者可以定义各种结构的数据,然后通过 protobuf 编译器 protoc 生成各种编程语言的源代码读写定义的数据。
写到这里只是简单介绍 Protocol Buffer ,具体实现还得看看文档。
gRPC
gRPC 支持同时支持 HTTP2, 支持构建同步或者异步的服务通信模型的服务。此外,除了支持传统的 请求/响应 模型外,还支持 双向流 (bidirectional stream) 模型。
默认使用 protobuf 作为 接口描述语言 (IDL interface description language) 及底层消息通信格式。
- IDL通常用于远程调用软件。在这种情况下,一般是由远程客户终端调用不同操作系统上的对象组件,并且这些对象组件可能是由不同计算机语言编写的。IDL建立起了两个不同操作系统间通信的桥梁。
- 底层消息通信格式,跟 JSON, XML 类似,作为网络通信时数据的载体。
gRPC 结构的系统中,客户端程序能够像调用本地对象一样直接调用远程服务端程序的方法,以此实现了分布式系统应用和服务。RPC 的核心思想为:定义一个程序服务,并指定某些方法能够被远程注册的客户端服务调用。
服务端实现被调用接口并运行一个 gPRC 服务来处理客户端服务的调用;发起远程调用的客户端服务有一个 client stub
实现了和服务端一样的方法。
安装 Golang 语言版本的 gRPC 依赖 $ go get google.golang.org/grpc
写到这对 gRPC 的简单介绍已经结束,具体编码和使用还得看看文档。