저자 : 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) {}
}