Protobuf 在 Ubuntu18 下的安装和使用
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 的使用流程:
- 编写 proto 文件
- 编译 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 下的安装和使用相关推荐
- google protobuf Linux环境下的安装与使用
google protobuf安装与使用 google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google prot ...
- ubuntu18.04下hadoop安装与集群配置
ubuntu18.04下hadoop安装与集群配置 hadoop安装_单机/伪分布式配置 环境 创建hadoop用户 更新apt 安装SSH.配置SSH无密码登陆 安装Java环境 安装 Hadoop ...
- 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 ...
- ubuntu18.04上安装anaconda-python深度学习环境
Anaconda是一套Python的发行版,发行版集成了必要的库,使用户可以一次性完成安装.Anaconda是一个侧重于数据分析的发行版,一些有助于数据分析的库,比如Numpy,Matplotlib, ...
- 71 mac boook pro 无 gpu 下caffe 安装
71 mac boook pro 无 gpu 下caffe 安装 1.首先安装homebrew工具,相当于Mac下的yum或apt ruby -e "$(curl -fsSL https:/ ...
- 在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包.录制包等 1 添加密钥和ros2下载 2 更新源和安装ros-eloquent-desktop及其依赖 3 配置环境 3.1 ...
- linux 下 pytorch 安装
我的显卡是gtx 730M,已经安装linux版本的驱动,安装环境centos8,内核版本Linux localhost.localdomain 4.18.0-305.19.1.el8_4.x86_6 ...
- Ubuntu18.04 LTS 安装nvidia驱动出现Ignoring CC version mismatch
问题背景:之前显卡驱动一直正常,突然有一天 使用nvidia-smi报错: NVIDIA-SMI has failed because it couldn't communicate with the ...
- Ubuntu18.04 melodic 安装与下载ROS
Ubuntu18.04 melodic 安装与下载ROS(超详细教程) 4331 0 2020年7月31日 10时24分 一三五 一三五 安装软件源 包安装方法主要有两种:软件源安装和源码编译安装.软 ...
- 优麒麟Ubuntu18.04.5安装各种问题
以下操作的开始日期是:2021-1-3. UbuntuKilin18.04.5安装完毕,系统预装了以下程序: 1)Firefox浏览器 2)Chromium浏览器 3)WPS2019套件 4)微信Ub ...
最新文章
- 法国电子与计算机信息学校排名,法国电气与电子工程专业大学排名(2020年上交大)_快飞留学...
- 计算机课怎样回归老师控制,职业学校计算机专业课堂回归真学习
- Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
- figma下载_在Figma上进行原型制作的各种触发选项
- Zookeeper--Watcher机制源码剖析一
- mr图像翻转的原因_MRI图像常见问题及对策
- 上线当天程序员锁死服务器,致公司破产解散
- 技术实践丨PostgreSQL开启Huge Page场景分析
- Ubuntu下Eclipse中文乱码解决
- 2018年10月软件工程自考时间安排
- php上传504,nginx+php设置大文件请求上传(502及504问题处理)
- Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
- 《互联网时代》第二集·浪潮
- 裁桨研纳铰撼蕉吞字吞汗屠闯汗芳
- k6新一代性能测试工具
- 【AAAI2021】Dual-Level Collaborative Transformer for Image Captioning
- python中函数的返回值,你了解吗?
- Spring BootV03:Spring Boot两种全局配置和两种注解
- distribute-list分发列表
- gtd android 知乎,(知乎)律师的时间管理能力和GTD.pdf