Go - 關(guān)于 proto 文件的一點(diǎn)小思考?
文章目錄:
前言
helloworld.proto
小思考
小結(jié)
推薦閱讀
前言
ProtoBuf 是什么?
ProtoBuf 是一套接口描述語言(IDL),通俗的講是一種數(shù)據(jù)表達(dá)方式,也可以稱為數(shù)據(jù)交換格式。
我們常用的數(shù)據(jù)格式有 JSON 和 XML,為什么使用 ProtoBuf ?是因?yàn)樗膫鬏斂?,為什么傳輸快?大家可以找下資料。使用 .proto 文件進(jìn)行描述要序列化的數(shù)據(jù)結(jié)構(gòu),然后將寫好 .proto 文件使用 protoc 就可以很容易編譯成眾多計(jì)算機(jī)語言的接口代碼。
gRPC 是什么?
gRPC 是開源的 RPC 框架,已支持主流的計(jì)算機(jī)語言,可以通過 ProtoBuf 進(jìn)行定義接口,可以基于 ProtoBuf 進(jìn)行數(shù)據(jù)傳輸。
兩者雖然是一家,但是分別解決不同的問題,可以配合使用,也可以分開。
看一下的 gRPC helloworld 的 proto 文件是如何定義的?
helloworld.proto
syntax?=?"proto3";
package?helloworld;
option?go_package?=?"./;helloworld";
//?The?greeting?service?definition.
service?Greeter?{
??//?Sends?a?greeting
??rpc?SayHello?(HelloRequest)?returns?(HelloReply)?{}
}
//?The?request?message?containing?the?user's?name.
message?HelloRequest?{
??string?name?=?1;
}
//?The?response?message?containing?the?greetings
message?HelloReply?{
??string?message?=?1;
}
文件中定義了一個(gè) service Greeter 和 rpc SayHello 方法。
入?yún)ⅲ?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">string name
出參:string message
這些過于簡單,還能不能描述其他信息?
小思考
定義的
rpc方法能否也同時(shí)支持HTTP調(diào)用?例如:SayHello 方法,既支持 gRPC 調(diào)用,也支持 HTTP 調(diào)用,同時(shí)支持protoc生成代碼時(shí),同時(shí)也生成Swagger接口文檔。定義的入?yún)⒛芊裰С謪?shù)驗(yàn)證?例如:name 長度不能大于 20 個(gè)字符。
定義的
serviceGreeter 服務(wù)能否支持?jǐn)r截器?例如:該服務(wù)下的所有方法需要進(jìn)行登錄令牌驗(yàn)證。定義的
rpcSayHello 方法能夠支持?jǐn)r截器?例如:當(dāng)前方法支持開啟和關(guān)閉是否記錄日志。
小結(jié)
以上問題還未完全解決,學(xué)習(xí) gRPC 感覺有些吃力...?
大家有沒有可以推薦的學(xué)習(xí)資源?目前在看 grpc-gateway[1] 。
推薦閱讀
Go - 使用 sync.WaitGroup 來實(shí)現(xiàn)并發(fā)操作 Go - 使用 sync.Map 解決 map 并發(fā)安全問題 Go - 基于逃逸分析來提升程序性能 Go - 使用 sync.Pool 來減少 GC 壓力 Go - 使用 options 設(shè)計(jì)模式
參考資料
grpc-gateway: https://github.com/grpc-ecosystem/grpc-gateway
推薦閱讀
