Protocol Buffer 是 Google 搞的 RPC 服务的中间层数据协议。其实 RPC 服务之间可以用各种数据格式,例如 JSON、XML 等。但考虑编解码效率和传输效率的话,Protobuf 性能更好。

此外,Protobuf 还包含了一个编译器,可以把 proto 文件编译成各种语言对应的代码。

安装

下载源码

git clone https://github.com/protocolbuffers/protobuf.git

安装依赖库

Protocol Buffer 是 C++ 编写的,主要是安装 g++ 编译器:

sudo apt-get install autoconf automake libtool curl make g++ unzip

编译安装并更新共享库

cd protobuf/
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

测试

protoc -h

安装 Golang 的 proto API

如果下载不了,可能需要配置代理,参考:https://blog.csdn.net/kikajack/article/details/105746603

每种语言在使用 Protobuf 时,通过调用现成的库来实现转换。Go 语言的 API 库安装方式:

// go get -v -u github.com/golang/protobuf/proto
// 已废弃,用下面的地址
go get -v -u  https://github.com/protocolbuffers/protobuf-go

因为 protocolbuffers 官方已经支持 Golang,所以此项目已经作废,请用官方的:https://github.com/protocolbuffers/protobuf-go

安装 Protobuf 的 protoc-get-go 插件

Protobuf 官方不支持自动生成 Go 代码,需要安装一个插件。从 github 下载后,编译为可执行文件,放到 /bin 目录下即可:

# 安装
// go get -v -u github.com/golang/protobuf/protoc-gen-go
// 已废弃,用下面的地址

迁移了,protocolbuffers 官方新地址在 protocolbuffers 项目下:

go get -v -u github.com/protocolbuffers/protobuf-go
# 编译
cd $GOPATH/src/github/golang/protobuf/protoc-gen-go
go build
# 放到 /bin 下
sudo cp protoc-gen-go /bin/

编译 proto 文件

假设当前目录下的 proto 文件名是 first.proto,执行下面命令:

protoc --go_out=. first.proto

得到 golang 代码 first.pb.go。proto 会在这个文件里自动创建 Go 语言的 struct,在项目中引入即可使用。

Protoc 基本语法

可以参考: https://colobu.com/2019/10/03/protobuf-ultimate-tutorial-in-go/

Protobuf 的使用流程:

  1. 编写 proto 文件
  2. 编译 proto 文件,得到各个语言的代码

推荐使用 proto3 语法,必须明确声明。如果没有声明,默认使用 proto2 语法。

消息 message

proto 文件由一个个具体的消息构成,包括请求消息和响应消息。每个消息则包含了各种类型的字段。

消息的每个字段包含前置的类型、字段名、Tag 标签。

每个字段前,可以加 repeated 关键字,表示该字段是数组。

syntax = "proto3";// hello 请求
message HelloRequest {string name = 1;         // 姓名int32 age = 2;                // 年龄repeated string job = 3;  // 工作
}message HelloResponse {int32 no = 1;
}

Tag

Tag 标签从 1 开始,定义后不可修改。[1-15]内的标识在编码时占用一个字节,包含标识和字段类型,对于常用字段最好放在前 15 个字段。

[19000-19999]之间的标识符是 proto 预留的,不可使用。

protoc 的编译结果

  • Go: 生成一个.pb.go文件,每个消息类型对应一个结构体
  • C++: 每个.proto文件生成一个.h文件和一个.cc文件,每个消息类型对应一个类
  • Java: 生成一个.java文件,同样每个消息对应一个类,同时还有一个特殊的Builder类用于创建消息接口

引入其他 proto 文件

import  "other.proto";

指定包名 package

项目太大时,难免有命名冲突。可以通过定义 proto 的包名避免 message 类型之间的名字冲突。

package foo.bar;

普通字段

保留字段和标签

可以使用 reserved 关键字指定保留字段名和标签。

message Foo {reserved 2, 15, 9 to 11;reserved "foo", "bar";
}

数据类型

除了基本数据类型外,proto 还支持复合数据类型,包括:枚举、map、数组、其它message。

.proto Go
double float64
float float32
int32 int32
int64 int64
uint32 uint32
uint64 uint64
sint32 int32
sint64 int64
fixed32 uint32
fixed64 uint64
sfixed32 int32
sfixed64 int64
bool bool
string string
bytes []byte

Oneof

使用 Oneof 定义的一组字段,最多允许这组字段中的一个出现。

syntax = "proto3";
package abc;
message OneofMessage {oneof test_oneof {string name = 4;int64 value = 9;}
}

oneof 字段不能同时使用repeated。

map类型

proto3 的 map 语法为 map<key, value> map_name = fieldNumber,例如:

map<int64,string> m_name = 1;

枚举类型

枚举类型限定字段的值只能取某个特定的值,比如星期类型只能取周一到周日七个值。

枚举类型的定义采用C++ scoping规则,也就是枚举值是枚举类型的兄弟类型,而不是子类型,所以避免在同一个package定义重名的枚举字段。

嵌套类型

可以把 message 类型当做普通字段,嵌套使用。

message SearchResponse {message Result {string url = 1;string title = 2;repeated string snippets = 3;}repeated Result results = 1;
}

Protobuf 在 Ubuntu18 下的安装和使用相关推荐

  1. google protobuf Linux环境下的安装与使用

    google protobuf安装与使用 google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google prot ...

  2. ubuntu18.04下hadoop安装与集群配置

    ubuntu18.04下hadoop安装与集群配置 hadoop安装_单机/伪分布式配置 环境 创建hadoop用户 更新apt 安装SSH.配置SSH无密码登陆 安装Java环境 安装 Hadoop ...

  3. ubuntu18安装oracle11g,在Ubuntu 18.04系统下快速安装Oracle Java 11的方法

    本文介绍在Ubuntu 18.04操作系统下使用PPA快速安装Oracle Java 11的方法,同时也可以用在Ubuntu 18.10.Ubuntu 16.04.Ubuntu 14.04版本中. O ...

  4. ubuntu18.04上安装anaconda-python深度学习环境

    Anaconda是一套Python的发行版,发行版集成了必要的库,使用户可以一次性完成安装.Anaconda是一个侧重于数据分析的发行版,一些有助于数据分析的库,比如Numpy,Matplotlib, ...

  5. 71 mac boook pro 无 gpu 下caffe 安装

    71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...

  6. 在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等

    在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包.录制包等 1 添加密钥和ros2下载 2 更新源和安装ros-eloquent-desktop及其依赖 3 配置环境 3.1 ...

  7. linux 下 pytorch 安装

    我的显卡是gtx 730M,已经安装linux版本的驱动,安装环境centos8,内核版本Linux localhost.localdomain 4.18.0-305.19.1.el8_4.x86_6 ...

  8. Ubuntu18.04 LTS 安装nvidia驱动出现Ignoring CC version mismatch

    问题背景:之前显卡驱动一直正常,突然有一天 使用nvidia-smi报错: NVIDIA-SMI has failed because it couldn't communicate with the ...

  9. Ubuntu18.04 melodic 安装与下载ROS

    Ubuntu18.04 melodic 安装与下载ROS(超详细教程) 4331 0 2020年7月31日 10时24分 一三五 一三五 安装软件源 包安装方法主要有两种:软件源安装和源码编译安装.软 ...

  10. 优麒麟Ubuntu18.04.5安装各种问题

    以下操作的开始日期是:2021-1-3. UbuntuKilin18.04.5安装完毕,系统预装了以下程序: 1)Firefox浏览器 2)Chromium浏览器 3)WPS2019套件 4)微信Ub ...

最新文章

  1. 法国电子与计算机信息学校排名,法国电气与电子工程专业大学排名(2020年上交大)_快飞留学...
  2. 计算机课怎样回归老师控制,职业学校计算机专业课堂回归真学习
  3. Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
  4. figma下载_在Figma上进行原型制作的各种触发选项
  5. Zookeeper--Watcher机制源码剖析一
  6. mr图像翻转的原因_MRI图像常见问题及对策
  7. 上线当天程序员锁死服务器,致公司破产解散
  8. 技术实践丨PostgreSQL开启Huge Page场景分析
  9. Ubuntu下Eclipse中文乱码解决
  10. 2018年10月软件工程自考时间安排
  11. php上传504,nginx+php设置大文件请求上传(502及504问题处理)
  12. Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
  13. 《互联网时代》第二集·浪潮
  14. 裁桨研纳铰撼蕉吞字吞汗屠闯汗芳
  15. k6新一代性能测试工具
  16. 【AAAI2021】Dual-Level Collaborative Transformer for Image Captioning
  17. python中函数的返回值,你了解吗?
  18. Spring BootV03:Spring Boot两种全局配置和两种注解
  19. distribute-list分发列表
  20. gtd android 知乎,(知乎)律师的时间管理能力和GTD.pdf

热门文章

  1. 交会定点(前方交会、测边交会、后方交会)程序C++代码
  2. MATLAB画Correlation plots
  3. 《走出幻觉,走向成熟》--读书笔记1
  4. 清华大学计算机科学学院刘钊,姚 骏-清华大学生命学院
  5. fastboot烧机
  6. uni.navigateTo页面跳转时传对象参数
  7. android的轮播图Banner之本地加载和网络加载图片
  8. vue2 element使用笔记总结
  9. linux系统缺少perl组建中的Data::Dumper模块
  10. Julia学习04——函数