前言
我們要知道 proto3
和 proto2
的語法,並不是完全相容的。
具體可查閱官方文件:
如果上述連結無法開啟,可以訪問這個文件:Overview - 語雀 。
自定義選項
在 proto3
中,常見的實現外掛的方式是使用 自定義選項
,也就是 extend
標籤,其中支援的 extend Options
有:
MethodOptions
ServiceOptions
EnumOptions
EnumValueOptions
MessageOptions
FieldOptions
FileOptions
OneofOptions
ExtensionRangeOptions
具體寫法可參考:
import "google/protobuf/descriptor.proto";
extend google.protobuf.MessageOptions {
optional string my_option = 51234;
}
message MyMessage {
option (my_option) = "Hello world!";
}
需求場景
假設,我們的需求場景是這樣的:
我們有很多的攔截器,其中不同的 service
可能會使用一個或多個攔截器,不同的 method
也可能會使用一個或多個攔截器,在 helloworld.proto
中
service Greeter{}
支援登入令牌驗證rpc SayHello1()
支援IP
白名單限制和記錄日誌rpc SayHello2()
支援禁止記錄日誌
// helloworld.proto
service Greeter {
rpc SayHello1 (HelloRequest) returns (HelloReply) {}
rpc SayHello2 (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
我們需要在 proto
檔案中,定義出 service
使用了哪些攔截器?定義出 method
使用了哪些攔截器?這樣 proto
檔案就會更加語義化,更加清晰明確,當大家看到定義的檔案時,對使用的攔截器一目瞭然。
如何實現這個功能?
這時,我們就需要用到 MethodOptions
和 ServiceOptions
選項,透過名字大概也能猜到 MethodOptions
是定義方法選項的,ServiceOptions
是定義服務選項的。
extend google.protobuf.MethodOptions {
...
}
extend google.protobuf.ServiceOptions {
...
}
大家有實現的思路嗎?歡迎留言評論 ~
推薦閱讀
- Go - 關於 protoc 工具的小疑惑
- Go - 關於 .proto 檔案的小思考
- Go - 使用 sync.WaitGroup 來實現併發操作
- Go - 使用 sync.Map 解決 map 併發安全問題
- Go - 基於逃逸分析來提升程式效能
本作品採用《CC 協議》,轉載必須註明作者和本文連結