文章插图
前言grpc是一个高性能、通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言 。在对接口具有严格约束或者传递大量数据的场景中得到了广泛的应用 。本文作者从什么是grpc开始介绍,讲诉了protobuf的语法以及如何使用grpc框架,对于想学习grpc的初学者来说,是一篇极好的入门教程,下来就跟随作者一起学习吧 。
简介什么是grpc
grpc是一个由google推出的、高性能、开源、通用的rpc框架 。它是基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言 。
什么是protobuf buffers
ProtoBuf buffer 是一种数据表达方式,以.proto结尾的数据文件,可以类比json、xml等 。针对ProtoBuf buffer 数据源,可以利用protoc 工具来生成各种语言的访问类 。
其操作步骤:
- 定义数据元;
- 生成数据元的访问类 。
- 编解码速度更快;
- 传输的数据更小 。
syntax = "proto3";package studentpb;service Student {rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}message StudentReqs {repeated StudentReq s = 1;}message StudentReq{string name= 1;int32 age = 2;}message StudentReply {int32 errno = 1;string errmsg = 2;}
- 关键字syntax:指定使用的proto3语法;
- 关键字package:定义一个包,需要注意避免命名冲突;
- 关键字message来定义请求或相应需要使用的消息格式,里面可以包含了不同类型的字段。一个.proto文件中,可以包含多个message的定义 。
- 关键字server来定一个服务 。GRPC的服务是通过参数和返回类型来指定可以远程调用的方法 。
- repeated:前置repeated关键词,声明该字段为数组类型 。
- proto3不支持proto2中的required和optional关键字 。
支持基础类型、枚举类型、map类型、数组类型、message类型等 。
- 基础类型
文章插图
- 枚举类型
syntax = "proto3";message Student{string name = 1;// 定义enum类型enum Sex {BOY = 0;GIRL = 1;}Sex sex = 1; // 使用Corpus作为字段类型}
- message类型
syntax = "proto3";message Students {repeated Student s = 1;}message Student{string name = 1;// 定义enum类型enum Sex {BOY = 0;GIRL = 1;}Sex sex = 4; // 使用Corpus作为字段类型}
如何利用protoc 工具生成访问类prooc常用参数文章插图
案例
文件目录如下:
文章插图
其中“t.proto”内容如下:
syntax = "proto3";package studentpb;service Student {rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}message StudentReqs {repeated StudentReq s = 1;}message StudentReq{string name= 1;int32 age = 2;}message StudentReply {int32 errno = 1;string errmsg = 2;}
生成go访问类的语句如下:protoc --go_out=plugins=grpc:. protobuf/*.proto
GO如何利用GRPC通信pb文件
syntax = "proto3";package studentpb;service Student {rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}message StudentReqs {repeated StudentReq s = 1;}message StudentReq{string name= 1;int32 age = 2;}message StudentReply {int32 errno = 1;string errmsg = 2;}
【grpc的入门使用】执行如下命令,生成grpc访问类protoc --go_out=plugins=grpc:. *.proto
服务端
目录结构如下:
文章插图
main.go内容如下:
package mainimport ("context""fmt""google.golang.org/grpc""log""net""test/studentpb")type Student struct {}// 新增studentsfunc (r *Student) Add(ctx context.Context, in *studentpb.StudentReqs) (*studentpb.StudentReply, error) {return &studentpb.StudentReply{Errno:0,Errmsg: "ok",}, nil}func main() {// 建立server监听rpcAddr := "127.0.0.1:8601"server, err := net.Listen("tcp", rpcAddr)if err != nil {fmt.Println("failed to listen", rpcAddr)panic(err)}// 建立rpc servervar RpcServer = grpc.NewServer()err = RpcServer.Serve(server)if err != nil {log.Fatalf("failed to listen: %v", err)}// 对外提供服务r := new(Student)studentpb.RegisterStudentServer(RpcServer, r)select {}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 禅茶中的端茶送客,叫做端茶送客
- 茶道修持生活,茶道的分类是什么分的
- 儿童喝白茶的好处,喝苦丁茶的好处
- 茶树菇老鸭汤的做法,丝瓜炒茶树菇的做法
- 如何挑选一款字体显示出色的显示器?这些问题值得注意
- 升级固件路由就安全了?你以为的真不是你以为的
- 茶叶怎么来的,紫砂壶的称谓是怎么来的
- 防止MacBook过热的7种方法
- 关于 MacBook 的电池问题,你了解多少
- 别再去找Docker命令了,你要的常用的全都在这