京东技术:Protobuf-3.6.1 安装及 Golang 使用

Posted IT实战联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了京东技术:Protobuf-3.6.1 安装及 Golang 使用相关的知识,希望对你有一定的参考价值。

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


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

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

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

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

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


安装

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

 
   
   
 
  1. wget https://github.com/google/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gz

  2. tar zxvf protobuf-all-3.6.1.tar.gz

  3. cd protobuf-3.6.1

  4. ./configure

  5. make

  6. make install

  7. protoc   -h

  8. protoc --version

遇到的问题及解决方案


[1] libprotoc.so.17: cannot open shared object file: No such file or directory

 
   
   
 
  1. bjlvxin:~/下载/protobuf-3.6.1$ protoc --version

  2. protoc: error while loading shared libraries: libprotoc.so.17: cannot open shared object file: No such file or directory

  3. 解决方案:执行:export LD_LIBRARY_PATH=/usr/local/lib

  4. bjlvxin:~/下载/protobuf-3.6.1$ export LD_LIBRARY_PATH=/usr/local/lib/  

  5. bjlvxin:~/下载/protobuf-3.6.1$ protoc   --version

  6. libprotoc 3.6.1

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 $GOPATH/src/github.com/golang/protobuf/protoc-gen-go


  3. go build


  4. go install


  5. vi ~/.bashrc $GOPATH/bin 加入环境变量:export PATH=$PATH:$GOPATH/bin


  6. source ~/.bashrc

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

 
   
   
 
  1. go get github.com/golang/protobuf/proto

  2. cd $GOPATH/src/github.com/golang/protobuf/proto

  3. go build

  4. go install


使用

本文通过 Golang 对 Protobuf 进行使用。


1、通过 GoLand 创建一个新的 golang 工程:


2、在 example 包中编写 person.proto

 
   
   
 
  1. syntax = "proto3";

  2. package example;

  3. //  person 会生成 Person 命名的结构体

  4. message person {

  5.                    int32 id = 1;

  6.                    string name = 2;

  7. }

  8. //  all_person 会按照驼峰规则自动生成名为AllPerson 的结构体

  9. message all_person {

  10.                        repeated person Per = 1

  11. }


3、进入 protobuf-golang 工程的 proto 目录,使用 protoc 编译 person.proto

 
   
   
 
  1. protoc --go_out=. person.proto

执行完毕后会在 proto 目录下生成对应的 go 文件:person.pb.go

4、编写工程的 main.go 文件:

 
   
   
 
  1. /*

  2. Copyright 2018 JD-Tiger

  3. created by lvxin  at 18-8-13 下午12:03

  4. */

  5. package main

  6. import (

  7.    example "github.com/lvxin1986/protobuf-golang/proto"

  8.    "log"

  9.    "github.com/golang/protobuf/proto"

  10.    "fmt"

  11. )


  12. func main() {

  13.    // 为 AllPerson 填充数据

  14.    //使用protobuf的封装类型定义

  15.    p1 := example.Person{

  16.        Id:*proto.Int32(1),

  17.        Name:*proto.String("lvxin"),

  18.    }

  19.    //使用golang的原始类型定义

  20.    p2 := example.Person{

  21.        Id:2,

  22.        Name:"gopher",

  23.    }


  24.    all_p := example.AllPerson{

  25.        Per:[]*example.Person{&p1, &p2},

  26.    }


  27.    // 对数据进行序列化

  28.    data, err := proto.Marshal(&all_p)

  29.    if err != nil {

  30.        log.Fatalln("Mashal data error:", err)

  31.    }


  32.    // 对已经序列化的数据进行反序列化

  33.    var target example.AllPerson

  34.    err = proto.Unmarshal(data, &target)

  35.    if err != nil{

  36.        log.Fatalln("UnMashal data error:", err)

  37.    }

  38.    for k,v := range target.Per {

  39.        fmt.Println("person[",k,"]:",v.Name)

  40.    }

  41. }

5、开发完毕后直接运行:


6、运行结果如下:

 
   
   
 
  1. GOROOT=/software/servers/go1.10.3

  2. GOPATH=/sourcecode/go/work

  3. /software/servers/go1.10.3/bin/go build -i -o /tmp/___go_build_main_go /sourcecode/go/work/src/github.com/lvxin1986/protobuf-golang/main.go #gosetup

  4. /tmp/___go_build_main_go

  5. person[ 0 ]: lvxin

  6. person[ 1 ]: gopher


  7. Process finished with exit code 0

打完收工。


说明

https://github.com/lvxin1986/protobuf-golang


参考文献

https://www.jianshu.com/p/1a3f1c3031b5

https://segmentfault.com/a/1190000010477733

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

https://www.pythonxyz.com/10038-install-protobuf-in-ubuntu.xyz


---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦



以上是关于京东技术:Protobuf-3.6.1 安装及 Golang 使用的主要内容,如果未能解决你的问题,请参考以下文章

走进京东金融:听过来人谈经验及技术干货

Python爬虫技术干货,教你如何实现抓取京东店铺信息及下载图片

JAVAEE——Solr:安装及配置后台管理索引库 使用SolrJ管理索引库仿京东的电商搜索案例实现

专访京东孙海波:大牛架构师养成记及电商供应链中区块链技术的应用(转)

大促系统全流量压测及稳定性保证——京东交易架构分享(含PPT)

技术服务之道——京东移动端接口测试自动化演进