天天看點

Golang - 關于 proto 檔案的一點小思考

目錄

  • 前言
  • helloworld.proto
  • 小思考
  • 小結
  • 推薦閱讀

ProtoBuf

是什麼?

ProtoBuf

是一套接口描述語言(IDL),通俗的講是一種資料表達方式,也可以稱為資料交換格式。

我們常用的資料格式有

JSON

XML

,為什麼使用

ProtoBuf

?是因為它的傳輸快,為什麼傳輸快?大家可以找下資料。使用

.proto

檔案進行描述要序列化的資料結構,然後将寫好

.proto

檔案使用

protoc

就可以很容易編譯成衆多計算機語言的接口代碼。

gRPC

gRPC

是開源的

RPC

架構,已支援主流的計算機語言,可以通過

ProtoBuf

進行定義接口,可以基于

ProtoBuf

進行資料傳輸。

兩者雖然是一家,但是分别解決不同的問題,可以配合使用,也可以分開。

看一下的

gRPC

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;
}
           

檔案中定義了一個

service

Greeter 和

rpc

SayHello 方法。

入參:

string

name

出參:

string

message

這些過于簡單,還能不能描述其他資訊?

  1. 定義的

    rpc

    方法能否也同時支援

    HTTP

    調用?例如:SayHello 方法,既支援 gRPC 調用,也支援 HTTP 調用,同時支援

    protoc

    生成代碼時,同時也生成

    Swagger

    接口文檔。
  2. 定義的入參能否支援參數驗證?例如:name 長度不能大于 20 個字元。
  3. service

    Greeter 服務能否支援攔截器?例如:該服務下的所有方法需要進行登入令牌驗證。
  4. rpc

    SayHello 方法能夠支援攔截器?例如:目前方法支援開啟和關閉是否記錄日志。

以上問題還未完全解決,學習 gRPC 感覺有些吃力...

大家有沒有可以推薦的學習資源?目前在看 grpc-gateway 。

  • Go - 使用 sync.WaitGroup 來實作并發操作
  • Go - 使用 sync.Map 解決 map 并發安全問題
  • Go - 基于逃逸分析來提升程式性能
  • Go - 使用 sync.Pool 來減少 GC 壓力
  • Go - 使用 options 設計模式
Golang - 關于 proto 檔案的一點小思考

作者:新亮筆記(關注公衆号,可申請添加微信好友)

出處:https://www.cnblogs.com/xinliangcoder

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。