这是我参与「 第五届青训营 」伴学笔记创作活动的第 17 天
grpc概括来说就是rpc的一个框架,而实现rpc最重要的就是proto文件的编写了吧。下面就是我学习proto文件书写的笔记。
一、下载proto
下载地址:Releases · protocolbuffers/protobuf (github.com)
选择适合自己系统的进行下载。 将文件解压,并把添加到环境变量中
二、文件介绍
message
通过关键字message字段指定定义一个消息类型式。消息就是需要传输的数据格式的定。message关键字类似于C++中的class,JAVA中的class,go中的struct。在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型。
一个proto文件中可以定义多个消息类型。
字段规则
required:消息体中必填字段,不设置会导致编码异常(protobuf3中没有)。 protobuf3没有了required,optional等说明关键字,都默认为optional。 repeate:消息体中可重复字段,重复的值的顺序会被保留在go中重复的会被定义为切片。
消息号
在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号一个整数。
嵌套消息
可以在其他消息类型中定义、使用消息类型,在下面的例子中,person消息就定义在PersonInfo消息内如
message PersonInfo{
message Person{
string name = 1;
int32 height = 2;
repeated int32 weight = 3;
}
repeated Person info = 1;
}
如果要在它的父消息类型的外部重用这个消息类型,需要PersonInfo.Person的形式使用它,如:
message PersonMessage{
PersonInfo.Person info = 1;
}
服务定义
如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根。
service Searchservice{
# rpc服务函数名(参数)返回(返回参数)
rpc Search(SearchRequest) returns (SearchResponse)
}
上述代表表示,定义了一个RPC服务,该方法接受SearchRequest返回SearchResponse。
总结
服务端编写
- 创建gRPC Server对象,你可以理解为它是Server端的抽象对象
- 将server (其包含需要被调用的服务端接口)注册到gRPC Server的内部注册中心。这样可以在接受到请求时,通过内部的服务发现,发现该服务端接口并转接进行逻辑处理
- 创建Listen,监听TCP端口
- gRPC Server开始lis.Accept,直到Stop
客户端编写
- 创建与给定目标(服务端)的连接交互
- 创建server的客户端对象
- 发送RPC请求,等待同步响应,得到回调后返回响应结果
- 输出响应结果