protobuf与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

 option allow_alias = true;//允许将同一个field number赋值给多个枚举变量

可选的值

  • optional 字段可选
  • required 字段必须存在
  • repeated 此字段可以被重复任何次数(包含0),相当于数组

field number

  • field number:用来在消息二进制编码中标识字段
  • 范围: 0
  • 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语言高级编程

你可能感兴趣的:(rpc,protoc,proto,protobuf)