gRPC

KevinL水杉 · · 1409 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  1. 介绍
    gRPC(Google Remote Procedure Calls)是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计,是由google发布的基于Protocol Buffers的RPC框架。 gRPC基于HTTP/2标准设计,带来诸如双向流、头部压缩、单TCP连接上的多复用请求等等特性。省电且省空间占用。
    gRPC
  2. 关键词
    HTTP/2、Protocol Buffers
  3. 教程
    gRPC:https://grpc.io/docs/tutorials/basic/go.html

Protocol Buffers

  1. 介绍
    Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。
    Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 Json、XML 来说,Protocol buffers 更加小巧,更加快速,更加简单。一旦定义了要处理的数据的数据结构之后,就可以利用 Protocol buffers 的code生成工具生成相关的code。只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
    Protocol buffers 很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
  2. Varints编码思想
    了解PB encoding之前,可以先来了解一下varint。Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。每个字节的前7个bit来表示数据,而最高位的bit(MSB,Most Significant Bit)则用作记号(flag)
    链接:https://developers.google.com/protocol-buffers/docs/encoding
  3. 优缺点
    优点
    体积小:序列化后,数据大小可缩小约3倍
    维护成本底:多个平台(Golang、Java、Python、C等等)仅需维护一套对象协议文件(.proto)
    缺点
    二进制数据流方式存储(不可读),需要通过.proto文件才能了解数据结构
  4. 使用过程
    发送发:序列化消息
    接收方:反序列化消息

依赖

  1. 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
  1. golang grpc插件
$ go get google.golang.org/grpc
  1. golang版本proto编译器插件
$ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  1. 生成
$ 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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:KevinL水杉

查看原文:gRPC

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1409 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传