Sintaxis básica de protobuf3

Autor: Chen Jinjian
Blog personal: HTTPS: //jian1098.github.io
Blog de CSDN: https: //blog.csdn.net/c_jian
Libro de Jane: https: //www.jianshu.com/u/8ba9ac5706b6
Contacto: jian1098 @ qq.com

Introducción


ProtoBuf (búfer de protocolo de Google) es un formato de datos estructurado en serie que utiliza Google para el intercambio de datos. Tiene funciones multiplataforma, en varios idiomas y extensibles. El mismo tipo utiliza XML y JSON habitualmente, pero tiene un volumen de transmisión más pequeño y más Altas capacidades de codificación y decodificación, especialmente adecuado para almacenamiento de datos, transmisión de datos en red y otros campos que requieren un alto volumen de almacenamiento y rendimiento en tiempo real Ha sido desarrollado para la versión protocol3.

Ventajas: alta eficiencia de espacio, alta eficiencia de tiempo, sensible al tamaño de los datos, alta eficiencia de transmisión

Desventajas: la legibilidad de la estructura del mensaje no es alta y la secuencia de bytes serializados es una secuencia binaria, que no puede simplemente analizarse para determinar su validez

estructura basica


syntax="proto3";					//文件第一行指定使用的protobuf版本,如果不指定,默认使用proto2
package services;					//定义proto包名,可以为.proto文件新增一个可选的package声明符,可选
option go_package = ".;services";	  //声明编译成go代码后的package名称,可选的,默认是proto包名

message ProdRequest{				//messaage可以理解为golang中的结构体,可以嵌套
    int32 prod_id=1;				//变量的定义格式为:[修饰符][数据类型][变量名] = [唯一编号] ,同一个message中变量的编号不能相同
}

message ProdResponse{
    int32 pro_stock=1;
}

service ProdService{									 //定义服务
	rpc GetProdStock (ProdRequest) returns (ProdResponse);	//rpc方法
}

Tipo variable


ProtoBuf Golang
int32 / sint32 / sfixed32 int32
int64 / sint64 / sfixed64 int64
uint32 / fixed32 uint32
uint64 / fixed64 uint64
flotador float32
doble float64
bool bool
cuerda cuerda
bytes []byte
enumeración Matriz o corte
google.protobuf.Timestamp timestamp.Timestamp

Observaciones: la última vez que se debe importar el tipo golang al paquete github.com/golang/protobuf/ptypes/timestamp, que se define de la siguiente manera

t:=timestamp.Timestamp(time.Now().Unix())

Entonces el .protparchivo necesita ser importadogoogle/protobuf/timestamp.proto

Modificador


repetido

Si se repeatedmodifica un campo , significa que es un campo de tipo lista, lo que equivale golanga un segmento en

message SearchRequest {
  repeated string args = 1 // 列表类型
}

reservado

Si desea reservar algunas etiquetas o campos digitales, puede usar el modificador reservado

message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
  string foo = 3 // 编译报错,因为‘foo’已经被标为保留字段
}

Defaults


Tipos de Defaults
cuerda ""
bytes Byte nulo
bool falso
digital 0
enumeración Primer valor
mensaje Relacionado con el lenguaje de programación
repetido Lista vacía

Tipo enumerado


El valor del primer valor de enumeración debe ser 0 y al menos un valor de enumeración. Un valor puede corresponder a varios valores de enumeración. Se debe marcar option allow_alias = true;que no se recomiendan valores negativos

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}


enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}

Importación de archivos


import "myproject/other_protos.proto"; // 这样就可以引用在other_protos.proto文件中定义的message,不能导入不使用的.proto文件

Definir servicio


Especifíquelo en su archivo .proto servicey luego defínalo en serviceél rpc方法. Preste atención a los parámetros especificados y al valor de retorno

service RouteGuide {
   rpc GetFeature(Point) returns (Feature) {}
}

método rpc


gRPC le permite definir 4 tipos de métodos de servicio

Rpc simple

El cliente usa el stub para enviar una solicitud al servidor y esperar a que regrese la respuesta, al igual que una llamada de función normal

service RouteGuide {
   rpc GetFeature(Point) returns (Feature) {}
}

Rpc de transmisión del lado del servidor

Por respuesta se devuelven los parámetros antes de las streampalabras clave de tipo de inserción , especifique un método de servidor de transmisión. El cliente envía una solicitud al servidor y obtiene una secuencia para leer la secuencia de mensajes devueltos. El cliente lee la secuencia devuelta hasta que no hay mensajes en ella.

service RouteGuide {
   rpc ListFeatures(Rectangle) returns (stream Feature) {}
}

Rpc de transmisión de cliente

Por tipo de parámetro de solicitud especificado antes streamde un método de palabra clave de cliente de flujo especificado. El cliente escribe una secuencia de mensajes y la envía al servidor, también usando streams. Una vez que el cliente termina de escribir el mensaje, espera a que el servidor termine de leer y devuelva su respuesta.

service RouteGuide {
   rpc RecordRoute(stream Point) returns (RouteSummary) {}
}

Rpc de transmisión bidireccional

Antes de la solicitud y respuesta agregando streampalabras clave al desarrollo de métodos de tipo. Los dos flujos operan de forma independiente, por lo que el cliente y el servidor pueden leer y escribir en el orden que deseen: por ejemplo, el servidor puede esperar a recibir todos los mensajes del cliente antes de escribir la respuesta, o puede leer y escribir mensajes alternativamente, u otra combinación. de lectura y escritura.

service RouteGuide {
   rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}

Supongo que te gusta

Origin blog.csdn.net/C_jian/article/details/108281015
Recomendado
Clasificación