ProtoBuf æ¯ä»ä¹
Protocol Buffers æ¯ä¸ç§è½»ä¾¿é«æçç»æåæ°æ®å卿 ¼å¼ï¼å¯ä»¥ç¨äºç»æåæ°æ®åºååï¼å¾éååæ°æ®å卿 RPC æ°æ®äº¤æ¢æ ¼å¼ãå®å¯ç¨äºé讯åè®®ãæ°æ®åå¨çé¢åçè¯è¨æ å ³ã平尿 å ³ã坿©å±çåºååç»ææ°æ®æ ¼å¼
ProtoBuf ä¸é¨ç¨æ¥æè¿°å®¢æ·ç«¯ä¸æå¡ä¹é´äº¤äºçæ°æ®æ ¼å¼ä»¥åæ¶æ¯çè§£æååºååï¼å¼å ¥ä¹åæä»¥ä¸å 个ä¼ç¹ï¼
// çæ¬å®ä¹ï¼ææ°ç主è¦ç¨ proto3
syntax = "proto3";
// 常è§ç¨æ³
import "google/protobuf/any.proto";
// éè¿ public å¼å
¥ç¬¬ä¸æ¹çprotoæä»¶ï¼é£ä¹å¼å
¥ä½ è¿ä¸ªæä»¶åæ¶ä¹ä¼å¼å
¥ç¬¬ä¸æ¹çproto
import public "other2.proto";
// å®ä¹protoçå
åï¼å
åå¯ä»¥é¿å
对message ç±»åä¹é´çååå²çª
package foo.bar;
// optionçå®ä¹æ ¼å¼æ¯ "option" optionName "=" constant ";"
option java_package = "com.example.foo";
message OneofMessage {
// Reserved å¯ä»¥éè¿å段ç¼å·èå´æè
åæ®µåç§°æå®ä¿ççåæ®µ, è¿äºå段ä¼è¢«å¿½ç¥
reserved 2, 4 to 6;
reserved "field14", "field11";
double field1 = 1;
// float field2 = 2;
int32 field3 = 3;
// int64 field4 = 4;
// uint32 field5 = 5;
// uint64 field6 = 6;
sint32 field7 = 7;
sint64 field8 = 8;
fixed32 field9 = 9;
fixed64 field10 = 10;
// sfixed32 field11 = 11;
sfixed64 field12 = 12;
bool field13 = 13;
// string field14 = 14;
bytes field15 = 15;
// ä¸ç»å段ï¼åæ¶æå¤å
许è¿ä¸ç»ä¸çä¸ä¸ªå段
oneof test_oneof {
string name = 16;
int64 value = 17;
// map åæ®µä¸è½åæ¶ä½¿ç¨ repeated
map<int64, string> values = 18;
// æ¶æ¯å¯ä»¥ç´æ¥å
嵿䏾
enum Corpus {
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
Corpus corpus = 19;
// repeated 表示æ¯ä¸ªå表ï¼å¯ä»¥ç´æ¥å
¶å®ç±»å
repeated Result results = 1;
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
// æä¸¾ç常éå¿
é¡»æ¯ä¸ä¸ª32æ¯ç¹çæ´æ°ï¼ä»æççè§åº¦èèï¼ä¸æ¨èéç¨è´æ°
// 第ä¸ä¸ªæä¸¾å¼å¿
é¡»æ¯0ï¼èä¸å¿
é¡»å®ä¹
enum EnumAllowingAlias {
// 设置 allow_aliasï¼å
è®¸åæ®µç¼å·éå¤ï¼RUNNING æ¯ STARTED çå«å
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
çæ¬è¿ä»£æ³¨æäºé¡¹
ä¸è¦æ¹åå·²æå段çåæ®µç¼å·
å½ä½ å¢å ä¸ä¸ªæ°çåæ®µçæ¶åï¼èç³»ç»åºåååçæ°æ®ä¾ç¶å¯ä»¥è¢«ä½ çæ°çæ ¼å¼æè§£æï¼åªä¸è¿ä½ éè¦å¤çæ°å åæ®µç缺çå¼ã èç³»ç»ä¹è½è§£æä½ ä¿¡æ¯çå¼ï¼æ°å åæ®µåªä¸è¿è¢«ä¸¢å¼äº
åæ®µä¹å¯ä»¥è¢«ç§»é¤ï¼ä½æ¯å»ºè®®ä½ Reservedè¿ä¸ªå段ï¼é¿å
å°æ¥ä¼ä½¿ç¨è¿ä¸ªå段
int32, uint32, int64, uint64 å boolç±»å齿¯å
¼å®¹ç
sint32 å sint64å
¼å®¹ï¼ä½æ¯ä¸åå
¶å®æ´æ°ç±»åå
¼å®¹
string å byteså
¼å®¹ï¼å¦æ bytes æ¯åæ³çUTF-8 bytesçè¯
åµå
¥ç±»ååbyteså
¼å®¹ï¼å¦æbyteså
å«ä¸ä¸ªæ¶æ¯çç¼ç çæ¬çè¯
fixed32åsfixed32, fixed64åsfixed64
enumåint32, uint32, int64, uint64æ ¼å¼å
¼å®¹
æåä¸ä¸ä¸ªå¼æ¹åæä¸ä¸ªæ°çoneofç±»åçä¸ä¸ªæåæ¯å®å
¨åäºè¿å¶å
¼å®¹çãæä¸ç»å段åæä¸ä¸ªæ°çoneofåæ®µä¹æ¯å®å
¨çï¼å¦æä½ ç¡®ä¿è¿ä¸ç»å段æå¤åªä¼è®¾ç½®ä¸ä¸ªãæä¸ä¸ªå段移å¨å°ä¸ä¸ªå·²åå¨çoneofåæ®µæ¯ä¸å®å
¨ç
kratos ä¸çåºç¨
ä½¿ç¨ kratos èææ¶æ°å»ºé¡¹ç®ä¹åï¼proto æä»¶é½æ¯è¢«æ´ç卿 ¹ç®å½ä¸ç api ç®å½ä¸ï¼æä»¬å¨api ä¸å建ä¸ä¸ª v1 ç®å½æ¾ç½®ç¬¬ä¸çæ¬çææçæ¥å£å®ä¹ï¼ç®å½ç»æå¦ä¸ï¼
âââ api
  âââ v1
  âââ user.proto
ç¶åç¼å user.proto æä»¶
syntax = "proto3";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
import "google/protobuf/empty.proto";
package user.v1;
option go_package = "v1";
option (gogoproto.goproto_getters_all) = false;
service user {
rpc mine_info(GetMineInfoReq) returns (GetMineInfoResp);
message GetMineInfoReq {
// ç¨æ·çid
int64 uid = 1 [(gogoproto.moretags) = 'form:"uid" validate:"required"'];
message GetMineInfoResp {
// ç¨æ·çè´¦å·
string account = 1 [(gogoproto.jsontag) = 'account'];
// æ¯å¦å®æå°bè´¦æ·è®¤è¯
bool auth = 2 [(gogoproto.jsontag) = 'auth'];
// ç¨æ·å¤´å
string avatar = 3 [(gogoproto.jsontag) = 'avatar'];
// ç¨æ·å
string name = 4 [(gogoproto.jsontag) = 'name'];
ç¼å宿åå¨ v1 ç®å½ä¸ä½¿ç¨å½ä»¤ kratos tool protoc user.proto æ¥é»è®¤æ§è¡ææç±»åæä»¶ççæï¼æ¯å¦ï¼api.pb.go/api.bm.go/api.swagger.json/api.ecode.go çå¯¹åºæä»¶
使¯å¨æ§è¡çæ¶åæ¥éï¼è¯´æ å ä¸ªåºæ²¡æå®ä¹ï¼è¿äºé½æ¯ä¸äºç¬¬ä¸æ¹çåºï¼å¨æå°ç第ä¸è¡å¯ä»¥çå° protoc å½ä»¤æ§è¡çåå§å½ä»¤ï¼å¯ä»¥çå°å¼å
¥çå 个åºçç®å½éé¢ç¡®å®æ²¡æ google/protobuf/descriptor.proto è¿ä¸ªåº
[16:50:26] jeff:v1 $ kratos tool protoc user.proto
2020/11/19 16:50:35 protoc --proto_path=/Users/jeff/go/src --proto_path=/Users/jeff/go/pkg/mod/github.com/go-kratos/kratos@v0.5.1-0.20201019061239-217cc8e5e918/third_party --proto_path=/Users/jeff/Desktop/workspace/others/kratos-test/user-service/api/v1 --bm_out=:. user.proto
google/protobuf/descriptor.proto: File not found.
github.com/gogo/protobuf/gogoproto/gogo.proto:32:1: Import "google/protobuf/descriptor.proto" was not found or had errors.
github.com/gogo/protobuf/gogoproto/gogo.proto:38:8: "google.protobuf.EnumOptions" is not defined.
github.com/gogo/protobuf/gogoproto/gogo.proto: "google.protobuf.EnumOptions" is not defined.
... æ¤å¤å¿½ç¥ ...
github.com/gogo/protobuf/gogoproto/gogo.proto: "google.protobuf.FieldOptions" is not defined.
google/protobuf/empty.proto: File not found.
user.proto:3:1: Import "github.com/gogo/protobuf/gogoproto/gogo.proto" was not found or had errors.
user.proto:4:1: Import "google/protobuf/empty.proto" was not found or had errors.
exit status 1
exit status 1
è£
äº protobuf çåºä¹åæ¯å¨ /usr/local/include/ è¿ä¸ªç®å½ä¸æè¿ä¸ªåº
[17:20:14] jeff:v1 $ ll /usr/local/include | grep google
lrwxr-xr-x 1 jeff admin 39B Sep 9 2019 google -> ../Cellar/protobuf/3.7.1/include/google
[17:20:14] jeff:v1 $
[17:20:45] jeff:v1 $ kratos tool protoc user.proto --proto_path=/usr/local/include/
2020/11/19 17:20:47 protoc --proto_path=/Users/jeff/go/src --proto_path=/Users/jeff/go/pkg/mod/github.com/go-kratos/kratos@v0.5.1-0.20201019061239-217cc8e5e918/third_party --proto_path=/Users/jeff/Desktop/workspace/others/kratos-test/user-service/api/v1 --bm_out=:. user.proto --proto_path=/usr/local/include/
user.proto:4:1: warning: Import google/protobuf/empty.proto is unused.
2020/11/19 17:20:47 protoc --proto_path=/Users/jeff/go/src --proto_path=/Users/jeff/go/pkg/mod/github.com/go-kratos/kratos@v0.5.1-0.20201019061239-217cc8e5e918/third_party --proto_path=/Users/jeff/Desktop/workspace/others/kratos-test/user-service/api/v1 --gofast_out=plugins=grpc:. user.proto --proto_path=/usr/local/include/
user.proto:4:1: warning: Import google/protobuf/empty.proto is unused.
2020/11/19 17:20:47 protoc --proto_path=/Users/jeff/go/src --proto_path=/Users/jeff/go/pkg/mod/github.com/go-kratos/kratos@v0.5.1-0.20201019061239-217cc8e5e918/third_party --proto_path=/Users/jeff/Desktop/workspace/others/kratos-test/user-service/api/v1 --bswagger_out=:. user.proto --proto_path=/usr/local/include/
user.proto:4:1: warning: Import google/protobuf/empty.proto is unused.
2020/11/19 17:20:47 protoc --proto_path=/Users/jeff/go/src --proto_path=/Users/jeff/go/pkg/mod/github.com/go-kratos/kratos@v0.5.1-0.20201019061239-217cc8e5e918/third_party --proto_path=/Users/jeff/Desktop/workspace/others/kratos-test/user-service/api/v1 --ecode_out=:. user.proto --proto_path=/usr/local/include/
user.proto:4:1: warning: Import google/protobuf/empty.proto is unused.
2020/11/19 17:20:47 generate user.proto --proto_path=/usr/local/include/ success.
gogoprotobuf
go ä¸ä½¿ç¨ protobuf è¿æä¸ä¸ªéæ©å°±æ¯ gogoprotobufï¼gogoprotobuf é¤äºå
¼å®¹ protobuf ä¹å¤ï¼å¢å äºå¾å¤ optionï¼æä»¥å¯ä»¥æä¾æ´ä½é¢ç²åº¦çæ§å¶ï¼çæä»£ç æ´é«æä¹æ´åçï¼æ¯å¦etcdãk8sãdgraphãdocker swarmkité½ä½¿ç¨å®ï¼è kratos 使ç¨ç乿¯è¿ä¸ªåº
gogoprotobuf å¢å äºå¾å¤çä¸åå±çº§ç optionï¼è¯¦ç»å¯ä»¥åè gogoproto extensions
option name option æè¿° gogoproto.goproto_enum_prefix Enum é项为falseæ¶ï¼åçæç代ç ä¸ä¸å "E_" gogoproto.goproto_getters Message é项为falseæ¶ï¼åä¸ä¼ä¸ºmessageçæ¯ä¸ªfieldçæä¸ä¸ªGet彿° gogoproto.face Message é项为trueæ¶ï¼ä¼ä¸ºmessageçæç¸åºçinterface gogoproto.nullable Field é项为falseæ¶ï¼messageåºååçæ¶åï¼gogoä¼ä¸ºmessageçæ¯ä¸ªfield设置ä¸ä¸ªå¼ gogoproto.goproto_stringer Message é项为falseæ¶ï¼gogoä¸å为message对ä¸ä¸ªçstructçæString()æ¹æ³
goland ä½¿ç¨ Protobuf Support æ¶ï¼å¼å
¥ç¬¬ä¸æ¹åºæ¾ä¸å°çé®é¢
goland å®è£
æä»¶ Protobuf Support ä¹åï¼å¼å
¥æ¯å¦ gogo çåºï¼ä¼äº§çæ¥éï¼æç¤º File not foundï¼å¯¹äºä½¿ç¨å
¶å®æ²¡ä»ä¹å½±åï¼å°±æ¯åçæ¶å䏿¯å¾ç¾è§ï¼å¦å¤å¯¹äº option æ¯å¦ææ¼åé误ä¹å¤±å»äºéææ£æ¥
è¿ä¸ªé®é¢ä¸»è¦æ¯å 为æä»¶çåºéé¢å¹¶æ²¡ææä»¬éè¦çç¬¬ä¸æ¹çåºï¼æä»¥æä¼æ¾ä¸å°ï¼è google/protobuf/empty.proto è¿ä¸ªåºä¸æ¥éå°±æ¯å 为æä»¶éé¢éæäºè¿ä¸ªåºï¼æç command é®å¯ä»¥çå°ï¼è¿ä¸ªåºçå°åæ¯å¨ /Users/jeff/Library/Application Support/JetBrains/GoLand2020.2/plugins/protobuf-jetbrains-plugin/lib/protobuf-java-3.6.1-sources.jar ç®å½ä¸
è¿åé¢å
¶å®å°±å¾ç®åäºï¼å©ç¨ unzip 以å jar å½ä»¤å¯ä»¥å®æ jarå
çè§£å
è·æå
ï¼æ gogoprotobuf åºç¸å
³ç齿¾å°éé¢å»ï¼ç¶åæ¿æ¢ä¹åçåºç jar å
å³å¯
æ¿æ¢ä¹åæ¥éä¼ç´æ¥æ¶å¤±ï¼å¹¶ä¸å¯ä»¥éè¿ command é®è¿½æº¯å°åºæºç
