天天看點

protobuf與protocprotobuf定義優勢應用場景文法規則protoc參考

Catalog

  • protobuf定義
  • 優勢
  • 應用場景
  • 文法規則
    • 定義消息類型
    • option
      • 可選的值
    • field number
  • protoc
    • 定義
    • protoc 、工具與插件
    • 定制代碼生成插件
    • 使用
      • 例子
  • 參考

protobuf定義

protocol buffer 是谷歌出品的語言獨立,平台獨立,可擴充的結構化資料序列化的元件就像XML一樣,但是protocol buffer編碼後更小、速度更快、使用更簡單。定義完你的結構化資料後,就可以使用配套工具生成的代碼,使用不同的語言對結構化資料流進行讀取和操作

優勢

  • 簡單
  • 速度更快(相對于JSON、XML)
  • 體積更小(相對于JSON、XML)
  • 語言獨立、平台獨立(amazing)

應用場景

文法規則

定義消息類型

文法
 message <messageName>{
 [field rules] <field type> <field name> =<field number>;
  }
           
message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  optional Corpus corpus = 4 [default = UNIVERSAL];
}
           

option

可選的值

  • optional 字段可選
  • required 字段必須存在
  • repeated 此字段可以被重複任何次數(包含0),相當于數組

field number

  • field number:用來在消息二進制編碼中辨別字段
  • 範圍: 0<n<2^30
  • tips:對于1-15編碼後字段為1個位元組,對于>=16的field number 編碼後為兩個位元組

protoc

定義

  • protoc 是protobuf的編譯器,用于将.proto檔案生成目智語言的代碼。
  • protoc

protoc 、工具與插件

對于--xx_out參數,protoc在運作時會先去找xx工具,如果沒找到會再去找protoc-gen-xx,然後使用對應的工具來生成代碼,這裡生成的代碼不包含service,如何去生成service對應的代碼呢,這裡就需要指定對應語言工具所帶的插件,為什麼要指定插件呢,因為RPC有很多種時間方式,通過指定不同的插件來生成不同RPC實作方式的對應代碼,good

定制代碼生成插件

待填坑

使用

  • terminal on *nix| cmd on windows,直接輸入protoc 即可檢視幫助資訊
protoc
           

例子

# 使用protoc-gen-go工具與它攜帶的grpc插件來生成rpc代碼,輸入檔案為 hello.proto ,輸出的目錄為 .(目前目錄)
protoc --go_out=plugins=grpc: . hello.proto
           

參考

  • DOC protobuffers google官方文檔
  • BOOK go語言進階程式設計