- 介绍
gRPC(Google Remote Procedure Calls)是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计,是由google发布的基于Protocol Buffers
的RPC框架。 gRPC基于HTTP/2
标准设计,带来诸如双向流、头部压缩、单TCP连接上的多复用请求等等特性。省电且省空间占用。
- 关键词
HTTP/2、Protocol Buffers - 教程
gRPC:https://grpc.io/docs/tutorials/basic/go.html
Protocol Buffers
- 介绍
Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。
Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 Json、XML 来说,Protocol buffers 更加小巧,更加快速,更加简单。一旦定义了要处理的数据的数据结构之后,就可以利用 Protocol buffers 的code生成工具生成相关的code。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
Protocol buffers 很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 - Varints编码思想
了解PB encoding之前,可以先来了解一下varint。Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。每个字节的前7个bit来表示数据,而最高位的bit(MSB,Most Significant Bit)则用作记号(flag)
链接:https://developers.google.com/protocol-buffers/docs/encoding - 优缺点
优点
体积小:序列化后,数据大小可缩小约3倍
维护成本底:多个平台(Golang、Java、Python、C等等)仅需维护一套对象协议文件(.proto)
缺点
二进制数据流方式存储(不可读),需要通过.proto文件才能了解数据结构 - 使用过程
发送发:序列化消息
接收方:反序列化消息
依赖
- Protocol Buffers3 编译器
https://github.com/protocolbuffers/protobuf/releases
安装
$ tar -xzf protobuf-3.6.1.tar.gz
$ cd protobuf-3.6.1
./configure --prefix=$INSTALL_DIR
$ make && make install
版本
$ protoc --version
- golang grpc插件
$ go get google.golang.org/grpc
- golang版本proto编译器插件
$ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
- 生成
$ protoc -I /e/bot/src -I /e/bot/src/github.com/google/protobuf/src -I. --govalidators_out=. --go_out=plugins=grpc:. staff/staff.proto
或者
$ protoc --go_out=./go/ ./helloworld.proto
$ protoc --go_out=plugins=grpc:. ./helloworld.proto
上面两个命令,第一个产生的只是 protobuffer 文件序列化和反序列化的code。
第二个产生包含第一个,还增加服务器和客户端通讯、实现的公共库code。
🌰
//client
...
pb "grpc-test/proto"
)
const (
port = ":5050"
)
...
func (s *server) Hello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
...
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
...
}
s := grpc.NewServer()
pb.RegisterHelloWorldServer(s, &server{})
reflection.Register(s)
if err := s.Serve(lis); err != nil {
...
}
}
//server
...
pb "grpc-test/proto"
)
const (
address = "localhost:5050"
)
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
...
}
defer conn.Close()
c := pb.NewHelloWorldClient(conn)
name := "world"
...
r, err := c.Hello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
...
}
...
}
例子:https://github.com/klbud/grpc-basic-functions-demo
常见问题:
1、google/protobuf not found
go get github.com/golang/protobuf/proto
2、install govalidators plug-in
sudo go get github.com/mwitkow/go-proto-validators/protoc-gen-govalidators
有疑问加站长微信联系(非本文作者)