Golang版protobuf的安装与使用

秒速五厘米 2022-04-22 21:20 367阅读 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

  1. wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gztar zxvf protobuf-2.6.1.tar.gz
  2. cd protobuf-2.6.1./configure
  3. make
  4. make install
  5. protoc -h

Bash

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

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

  1. go get github.com/golang/protobuf/protoc-gen-go
  2. cd github.com/golang/protobuf/protoc-gen-go
  3. go build
  4. go install
  5. vi /etc/profile $GOPATH/bin 加入环境变量
  6. source profile

Bash

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

  1. go get github.com/golang/protobuf/proto
  2. cd github.com/golang/protobuf/proto
  3. go build
  4. go install

Bash

使用 go protobuf

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

  1. syntax = "proto2";
  2. package packet;
  3. message Header{
  4. required string messageId = 1;
  5. required string topic = 2;
  6. }
  7. message BytesMessage{
  8. required Header header= 1;
  9. required bytes body = 2;
  10. }
  11. message StringMessage{
  12. required Header header = 1;
  13. required string body = 2;
  14. }

Proto

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

  1. protoc --go_out=. *.proto

Bash

  1. 注:若在编译过程中出现以下的报错
  2. packet.proto:1:1: Expected top-level statement (e.g. "message").
  3. 可能起因: 实际上是由于在简体操作系统下,默认的proto文件,其实就是文本文件,的"被读取编码"GB2312,如果proto文件不是使用该编码编写的,而是utf-8等其他格式,文件头会有乱码,即在message前会有1位乱码,导致protoc程序无法识别到messge开头的标识,导致了异常,
  4. 解决: 修改GB2312编码保存后,继续编译成功.

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

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

  1. package main
  2. import (
  3. // 辅助库
  4. "github.com/golang/protobuf/proto"
  5. // test.pb.go 的路径
  6. "./packet"
  7. )
  8. func main() {
  9. bodyData := "shenzhen/nanshan/tencent/company"
  10. p := &packet.StringMessage{
  11. Body: proto.String(bodyData),
  12. Header: &packet.Header{
  13. MessageId: proto.String("1234567890"),
  14. Topic: proto.String("golang"),
  15. },
  16. }
  17. pData, err := proto.Marshal(p)
  18. if err != nil {
  19. println(err.Error())
  20. }
  21. println(string(pData))
  22. p2 := &packet.StringMessage{}
  23. proto.Unmarshal(pData, p2)
  24. println(p2.GetHeader().GetTopic())
  25. }

Go

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

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

参考文献:

https://lihaoquan.me/2017/6/29/how-to-use-protobuf.html

发表评论

表情:
评论列表 (有 0 条评论,367人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang使用protobuf简易教程

    golang使用protobuf简易教程 google公司发布的一套开源编码规则,基于二进制流的序列化传输,可以转换成多种编程语言,几乎涵盖了市面上所有的主流编程语言,当