golang使用protobuf

2020年03月26日 06:07:02   [来源:互联网]   [阅读:1801]
字体:【



1 Protobuf简介

Google Protocol Buffer( 简称 Protobuf)是Google公司内部的混合语言数据标准,他们主要用于RPC系统和持续数据存储系统。

2 Protobuf 应用场景

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

简单来说,Protobuf的功能类似于XML,即负责把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议等使用场景。

3 Protobuf 优缺点

优点

  • 性能好/效率高时间维度:XML,JSON格式对数据进行序列化和反序列化时性能差。空间维度:XML,JSON格式为了可读性,必然在进行存储数据时,也会消耗空间。整体而言,Protobuf以高效的二进制方式存储,比XML小3到10倍,快20到100倍。
  • 代码生成机制代码生成机制能够极大解放开发者编写数据协议解析过程的时间,提高工作效率;于开发者维护和迭代。
  • 支持“向后兼容”和“向前兼容”
  • 支持多种编程语言Protobuf不仅仅Google开源的一个数据协议,还有很多种语言的开源项目实现。

缺点

  • 可读性较差为了提高性能,Protobuf采用了二进制格式进行编码。二进制格式编码对于开发者来说,是没办法阅读的。在进行程序调试时,比较困难。对于可读性要求高的数据报文程序就不建议使用。
  • 缺乏自描述Protobuf是通过二进制格式进行数据传输,开发者面对二进制格式的Protobuf,没有办法知道所对应的真实的数据结构,因此在使用Protobuf协议传输时,必须配备对应的proto配置文件。

Protobuf3 语法指南:
https://colobu.com/2017/03/16/Protobuf3-language-guide


4 Go语言中的编程实现

4.1 安装protobuf编译器

使用release版本下载地址:

https://github.com/protocolbuffers/protobuf/releases

方式一:

下载对应平台的二进制文件,配置环境变量即可

image.png

方式二

由于我本机下载二进制文件太慢,这里使用编译安装

Ubuntu 安装(如果是centos直接将apt-get改为yum,如果是alpine将apt-get install 改为apk add)

4.2 安装go插件 protoc-gen-go

  • proto:实现了对编码,解码等,在后面会用到。
  • protoc-gen-go: 编译器插件:生成Go源文件。


# 下载go get  -u -v github.com/golang/protobuf/protoc-gen-go# 安装cd $GOPATH/src/github.com/golang/protobuf/protoc-gen-go/ go install

此时会在$GOPATH/bin/生成二进制文件

ls  $GOPATH/bin/protoc-gen-go/home/jinchunguang/go/bin/protoc-gen-go

5 使用Protobuf的步骤

5.1 编写proto文件

# 创建项目目录mkdir -pv protobuf-app/pbcd protobuf-app#  使用go modgo mod init protobuf-app# 编写协议文件touch pb/person.protovim pb/person.proto

person.proto文件内容

syntax = "proto3";package pb;message Person {    string Name = 1;    int32 Age = 2;    string From = 3;}

5.2 生成协议文件

protoc --proto_path=./pb --go_out=./pb ./pb/person.proto

此时就会发现多了一个person.pb.go,这个就是生成的的协议文件

tree.├── go.mod└── pb    ├── person.pb.go    └── person.proto1 directory, 3 files

5.3 测试


下载编码解码库,也可以不下载,运行时go mod会自动解决依赖.

go get -u -v github.com/golang/protobuf/proto

main.go




执行程序


image.png

6 使用protobuf实现简单的Tcp通讯

6.1 新建proto文件 message.proto

文件内容

syntax = "proto3";package pb;message Message{    string message = 1;    int32 length = 2;}

生成协议文件

protoc --proto_path=./pb --go_out=./pb ./pb/message.proto

6.2 新建立srv目录,添加 client,server 目录并且新建对应的go程序


client.go




server.go




6.3 测试

启动服务:

go run server.go


推荐阅读:叶紫


相关新闻
新闻焦点
近年来,随着中国经济快速发展,化妆品市场呈现出一片红火景象,中国已成为全球化妆品消费第二大国。我国化妆品市场前期虽然起步较晚,但潜力不容小觑,许[更多]
近日,新浪与近20家全国头部地面频道、王牌民生节目、优秀的融媒体平台及自媒体平台签订融媒体深度战略合作协议,并宣布正式启动“温暖70城”活动。合[更多]
最近护肤界掀起了一股“国潮风”,最本人也对一款少女杀手面膜动心了,没管住自己的手入了名膜壹号的梦幻面膜。名膜壹号的面膜一直有不少小红书护肤达人的[更多]
【今年平均每人花44元看电影】截至12月14日,据灯塔专业版数据显示,国内累计电影票房已达609.6亿元,超过了去年全年606.88亿元的票房总[更多]
关于我们 | 联系我们 | XML地图 | 网站地图TXT | 版权声明
版权所有:科技杂谈网未经授权禁止复制或建立镜像
相关作品的原创性、文中陈述文字以及内容数据庞杂本站无法一一核实,如果您发现本网站上有侵犯您的合法权益的内容,请联系我们,本网站将立即予以删除!
中国互联网违法和不良信息举报中心 网络警察报警岗亭