Go - 如何編寫 ProtoBuf 插件 -一- ?
文章目錄:
-
前言
-
自定義選項
-
需求場景
-
推薦閱讀
前言
我們要知道 proto3
和 proto2
的語法,並不是完全兼容的。
具體可查閱官方文檔:
-
Overview[1]
-
Language Guide (proto2)[2]
-
Language Guide (proto3)[3]
如果上述鏈接無法打開,可以訪問這個文檔:Overview - 語雀 [4] 。
自定義選項
在 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 {
...
}
大家有實現的思路嗎?歡迎留言評論 ~
參考資料
[1]
Overview: https://developers.google.com/protocol-buffers/docs/overview
[2]
Language Guide (proto2): https://developers.google.com/protocol-buffers/docs/proto
[3]
Language Guide (proto3): https://developers.google.com/protocol-buffers/docs/proto3
[4]
Overview - 語雀: https://www.yuque.com/xinliangnote/blog/mumt7v
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/yeqeMNsD0W1aOzK7RZcSIw