美文网首页
Golang版protobuf的安装与使用

Golang版protobuf的安装与使用

作者: Aedan | 来源:发表于2017-11-28 15:10 被阅读0次

Protobuf 介绍

序列化库在网络传输,RPC,数据库访问等环境中经常用到,它的性能的好坏直接影响着整个产品的性能, 所以我们有必要对一些优秀的序列化库进一步的学习与掌握.

protobuf是Google开发的一种数据描述语言语言,能够将结构化的数据序列化,可用于数据存储,通信协议等方面,官方版本支持 Go, C++, Java, Python,社区版本支持更多语言.

相对于JSON和XML具有以下优点:

简洁

体积小:消息大小只需要XML的1/10 ~1⁄3

速度快:解析速度比XML快20 ~ 100倍

使用Protobuf的编译器,可以生成更容易在编程中使用的数据访问代码

更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容

本文主要以Go语言的方式来具体讲述如何使用Pb进行数据的定义与传输

Protobuf 使用

安装

1.从https://github.com/google/protobuf/releases获取 Protobuf 编译器 protoc

wgethttps://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gztar zxvf protobuf-2.6.1.tar.gzcdprotobuf-2.6.1./configuremakemakeinstallprotoc-h

2.获取 goprotobuf 提供的 Protobuf 插件 protoc-gen-go(被放置于 $GOPATH/bin 下,$GOPATH/bin 应该被加入 PATH 环境变量,以便 protoc 能够找到 protoc-gen-go)

此插件被 protoc 使用,用于编译 .proto 文件为 Golang 源文件,通过此源文件可以使用定义在 .proto 文件中的消息。

go get github.com/golang/protobuf/protoc-gen-gocdgithub.com/golang/protobuf/protoc-gen-go go build goinstallvi/etc/profile 将$GOPATH/bin 加入环境变量sourceprofile

3.获取 goprotobuf 提供的支持库,包含诸如编码(marshaling)、解码(unmarshaling)等功能

go get github.com/golang/protobuf/protocdgithub.com/golang/protobuf/protogo buildgoinstall

使用 go protobuf

接着, 我们进行数据格式的定义, 写一个简单的例子: 我们在 $GOPATH下新建一个测试项目 pblearn/packet 在 $GOPATH/pblearn/packet 下, 创建一个名为 packet.proto 的文件, 然后编写如下的内容

package packet;message Header{    required string messageId = 1;    required string topic = 2; //topic类型}//byte类消息message BytesMessage{    required Header  header= 1;    required  bytes body = 2;    }//string类型的messagemessage StringMessage{    required Header header = 1;    required string body = 2;}

然后通过 –go_out 来使用 goprotobuf 提供的 Protobuf 插件 protoc-gen-go。这时候我们会生成一个名为 test.pb.go 的源文件, 参考如下

protoc--go_out=.*.proto

命令执行后, pblearn/packet 下会生成一个go的文件 packet.pb.go, 这个就是我们消息操作对象

最后,我们可以编写测试例子, 在 在 $GOPATH/pblearn/ 下,我们编写 main.go

packagemainimport(// 辅助库"github.com/golang/protobuf/proto"// test.pb.go 的路径"pblearn/packet")funcmain(){bodyData:="guangzhou/fangcun/vip/company"p:=&packet.StringMessage{Body:proto.String(bodyData),Header:&packet.Header{MessageId:proto.String("20-05"),Topic:proto.String("golang"),},}pData,err:=proto.Marshal(p)iferr!=nil{println(err.Error())}println(string(pData))p2:=&packet.StringMessage{}proto.Unmarshal(pData,p2)println(p2.GetHeader().GetTopic())}

通过运行例子 go run main.go 可以发现, 我们的数据格式可以正常的序列化和反序列化了.

这样,我们日后可以根据自己的业务需要, 进行高效的数据传输

相关文章

网友评论

      本文标题:Golang版protobuf的安装与使用

      本文链接:https://www.haomeiwen.com/subject/pacrlttx.html