Proto学习 | 青训营笔记

151 阅读2分钟

这是我参与「 第五届青训营 」伴学笔记创作活动的第 17 天

grpc概括来说就是rpc的一个框架,而实现rpc最重要的就是proto文件的编写了吧。下面就是我学习proto文件书写的笔记。

一、下载proto

下载地址:Releases · protocolbuffers/protobuf (github.com)

image.png

选择适合自己系统的进行下载。 将文件解压,并把添加到环境变量中

二、文件介绍

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请求,等待同步响应,得到回调后返回响应结果
  • 输出响应结果