protobuf

发布时间 2023-09-14 19:42:48作者: Ykubernetes

protobuf

message关键字

类似于C++中的class,java中的class,go中struct,例如

在消息中承载的数据分别对应于每一个字段,

其中每个字段都有一个名字和一种类型。

message User {
	string username = 1;
	int32   age  = 2;
}

字段规则

required:消息体中必须填写的字段。

optional:消息体中可选字段,在Go中会定义为对应类型的指针

repeated:消息体中可重复字段,重复的值的顺序会被保留,在Go中重复的会被定义为切片

message User{
  string username = 1;
  int32 age = 2;
  optional string password =3;
  repeated string addresses = 4;
}

字段映射

proto Type Notes Go
double float64
float float32
int32 使用变长编码,对于负值的效率很低,如果你的域中有可能有负值,请使用sint64替代 int32
uint32 使用变长编码 uint32
uint64 使用变长编码 uint64
sint32 使用变长编码,这些编码在负值的时候比int32高效的多 int32
sint64 使用变长编码,有符号的整型值,编码时比通常int64高效 int64
fixed32 总是4个字节,如果数值总是比228大的话,这个类型会比uint32高效 uint32
fixed64 总是8个字节,如果数值总是比256大的话,这个类型比uint64高效 uint64
sfixed32 总是4个字节 int32
sfixed64 总是8个字节 int64
bool bool bool
string 一个字符串必须是utf-8编码或者7-bit ASCII编码的文本 string
bytes 可能包含任意顺序的字节数据 []byte

默认值

类型 默认值
bool false
整型 0
string 空字符串
枚举enum 第一个枚举元素的值,因为protobuf3强制要求第一个枚举元素的值必须是0,所以枚举的默认值就是0
message 不是null,而是DEFALT_INSTANCE

标识号

在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围中的一个整数。

message User {
	string username = 1; # 这个1 就是标识号
	int32   age  = 2;
}

定义多个消息类型

一个proto文件中可定义多个消息类型

message UserRequest{ # 名称唯一
  string username = 1;
  int32 age = 2;
  optional string password =3;
  repeated string addresses = 4;
}

message UserResponse{ # 名称唯一
  string username = 1;
  int32 age = 2;
  optional string password =3;
  repeated string addresses = 4;
}

嵌套消息

可以在其他消息类型中定义,使用消息类型,Person消息就定义在Personinfo消息体内。

message PersonInfo {
  message Person{
    string name = 1;
    int32  age = 2;
    repeated string addresses = 3;
  }
  repeated Person info =1;
}

如果你想在它的父消息类型的外部重用这个消息类型,你就需要以PersonIfo.Person的形式使用它。

message PersonMessage {
  PersonInfo.Person info = 1;
}

你也可以将消息嵌套任意多层,如:

message  Grandpa {
  message Father {
    message son {
      string name = 1;
      int32  age =2;
    }
  }
}

定义服务

如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器会将根据所选择的不同语言生成服务接口代码及存根。

service SearchService {
  // rpc 服务的函数名(传入参数) 返回 返回参数
  rpc Search(SearchRequest) returns (SearchResponse);
}

上诉代码表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse