protobuf3 기본 구문

저자 : Chen Jinjian
개인 블로그 : HTTPS : //jian1098.github.io
CSDN 블로그 : https : //blog.csdn.net/c_jian
Jane 책 : https : //www.jianshu.com/u/8ba9ac5706b6
연락처 : jian1098 @ qq.com

소개


ProtoBuf (Google Protocol Buffer)는 데이터 교환을 위해 Google에서 사용하는 직렬 구조화 된 데이터 형식입니다. 교차 플랫폼, 교차 언어 및 확장 가능한 기능이 있습니다. 동일한 유형은 일반적으로 XML과 JSON을 사용하지만 전송 볼륨이 더 적고 more 높은 코딩 및 디코딩 기능, 특히 데이터 저장, 네트워크 데이터 전송 및 높은 저장 용량과 실시간 성능을 필요로하는 기타 분야에 적합하며 protoc3 버전으로 개발되었습니다.

장점 : 높은 공간 효율성, 높은 시간 효율성, 데이터 크기에 민감, 높은 전송 효율성

단점 : 메시지 구조의 가독성이 높지 않고 직렬화 된 바이트 시퀀스가 ​​이진 시퀀스이므로 유효성을 간단히 분석 할 수 없습니다.

기본 구조


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方法
}

가변형


ProtoBuf 골랑
int32 / sint32 / sfixed32 int32
int64 / sint64 / sfixed64 int64
uint32 / fixed32 uint32
uint64 / fixed64 uint64
흙손 float32
더블 float64
부울 부울
바이트 []바이트
열거 형 배열 또는 슬라이스
google.protobuf.Timestamp timestamp.Timestamp

비고 : 마지막으로 유형 golang을 패키지로 가져와야 할 때 github.com/golang/protobuf/ptypes/timestamp다음과 같이 정의됩니다.

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

그런 다음 .protp파일을 가져와야합니다.google/protobuf/timestamp.proto

수정 자


반복

필드가되면 repeated수정 그것이 해당하는리스트 타입 필드임을 의미 golang슬라이스의 행

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

예약석

일부 디지털 레이블 또는 필드를 예약하려면 예약 된 수정자를 사용할 수 있습니다.

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

기본값


유형 기본값
""
바이트 널 바이트
부울 그릇된
디지털 0
열거 형 첫 번째 가치
메시지 프로그래밍 언어 관련
반복 빈 목록

열거 형


첫 번째 열거 값의 값은 0이고 적어도 하나의 열거 값이어야합니다. 값은 여러 열거 값에 해당 할 수 있습니다. option allow_alias = true;음수 값은 권장되지 않음을 표시해야합니다.

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;
}

파일 가져 오기


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

서비스 정의


당신의 .proto 파일을 지정 service하고 service정의 에서 그것을 그것 rpc方法.에주의를 지정된 매개 변수와 반환 값에

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

rpc 방법


gRPC를 사용하면 4 가지 유형의 서비스 방법을 정의 할 수 있습니다.

단순 rpc

클라이언트는 스텁을 사용하여 일반 함수 호출과 마찬가지로 서버에 요청을 보내고 응답이 반환 될 때까지 기다립니다.

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

서버 측 스트리밍 rpc

삽입 유형 키워드 전에 응답이 반환되는 매개 변수에 의해 stream스트리밍 서버의 방법을 지정합니다. 클라이언트는 서버에 요청을 보내고 반환 된 메시지 시퀀스를 읽기위한 스트림을 가져옵니다. 클라이언트는 메시지가 없을 때까지 반환 된 스트림을 읽습니다.

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

클라이언트 스트리밍 RPC

지정된 스트림 클라이언트 키워드 메소드 이전 요청 매개 변수 지정된 유형에 의해 stream. 클라이언트는 일련의 메시지를 작성하고 스트림을 사용하여 서버로 보냅니다. 클라이언트가 메시지 쓰기를 마치면 서버가 읽기를 마치고 응답을 반환 할 때까지 기다립니다.

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

양방향 스트리밍 RPC

요청 및 응답 전에 stream유형 메소드의 개발에 키워드를 추가 합니다. 두 스트림은 독립적으로 작동하므로 클라이언트와 서버는 원하는 순서대로 읽고 쓸 수 있습니다. 예를 들어, 서버는 응답을 쓰기 전에 모든 클라이언트 메시지를 수신 할 때까지 기다리거나 메시지를 번갈아 읽고 쓸 수 있습니다. 읽기와 쓰기의.

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

추천

출처blog.csdn.net/C_jian/article/details/108281015