1. protocol buffer
구조를 가진 데이터에 대한 표현을 최소화 할 목적으로, 해당 data를 serializing하는 과정을 제공하는 IDL
(IDL is Interface Description Language)
2. 데이터 타입
IDL 정의시 사용할수 있는 데이터 타입은 아래와 같음
1) 기본타입
Protobuf | C++ | Java | Python | Go |
double | double | double | float | *float64 |
int32 | int32 | int | int | *int32 |
int64 | int64 | long | long | *int64 |
uint32 | uint32 | int | int | *uint32 |
uint64 | uint64 | long | long | *uint64 |
sint32 | int32 | int | int | *int32 |
sint64 | int64 | long | long | *int64 |
fixed32 | uint32 | int | int | *uint32 |
fixed64 | uint64 | long | long | *uint64 |
sfixed32 | int32 | int | int | *int32 |
sfixed64 | int64 | long | long | *int64 |
bool | bool | boolean | bool | *bool |
string | string | String | unicode | *string |
bytes | string | ByteString | str | []byte |
2) Nested types
syntax = "proto3";
mesage Car {
message engine {
string name = 1;
int64 cc = 2;
}
string model = 1;
string company = 2;
int64 price = 3;
}
message test {
repeated Car.engine eng = 1;
repeated Car c = 2;
}
3) maps
syntax = "proto3";
message Company {
message Dept {
string description = 1;
string location = 2;
}
map <string, Dept> depts = 1;
}
4) enums
message Car {
enum CarType {
sm3 = 0;
sm5 = 1;
sm7 = 2;
}
CarType ct = 1;
}
3. services
grpc에서 제공하는 rpc 서비스 기술
test.proto
=======================
syntax = "proto3";
service Test {
rpc GetCar(GetCarRequest) returns (GetCarResponse);
}
4. import other file
syntax = "proto3";
message Test {
string t1 = 1;
string t2 = 2;
}
main.proto
========================
syntax = "proto3";
import public "test.proto";
message Main {
repeated Test t1 = 1;
}
5. protobuf compile
1) c++
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/test.proto
2) c
protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/test.proto
3) go
go get golang.org/x/sys/unix
go get -u github.com/golang/protobuf/protoc-gen-go
protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/test.proto
4) java
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/test.proto
5) python
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/test.proto