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 .protp
archivo necesita ser importadogoogle/protobuf/timestamp.proto
Modificador
repetido
Si se repeated
modifica un campo , significa que es un campo de tipo lista, lo que equivale golang
a 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 service
y 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 stream
palabras 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 stream
de 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 stream
palabras 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) {}
}