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

编写代码边撸猫 2019-01-04 17:22:59 ⋅ 825 阅读

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

打完收工。


说明

本文中所有的代码均已经提交到 Github 上,地址为:

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实战联盟”哦




全部评论: 0

    我有话说:

    京东到家订单中心系统mysql到es的转化之路

    原文:https://www.toutiao.com/i6796507988602389006 京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常

    安全攻防系列一 安全基础概念

      该系列记录学习极客时间–安全攻防技能30讲相关内容 安全的本质 安全的本质就是保护数据被合法地使用。 数据:应用最核心的东西;如用户信息、订单信息等等 合法:大到法律法规、业务

    京东技术:多数据模型数据库 | 应用实例解析

    作 者 简 介吕信,京东商城技术架构部资深架构师,拥有多年数据产品研发架构经验。

    GoLand 2020.3.2 发布,bug 修复版本

    GoLand 2020.3.2 已经发布,主要包含各种 bug 修复。 部分更新内容 支持在带有 M1 芯片的 Mac 上正常使用调试器。 如果之前已配置,则需要升级到 2020.3.2 后就

    京东技术使用JDReact小程序双向转换

    JDReact是京东商城前台产品研发部推出的多端融合开发框架。

    GoLand 2021.1 Beta 发布

    GoLand 2021.1 Beta 已经发布,该版本更新包括支持通过 Docker、SSH 和 WSL 2 远程构建和运行、支持 Go 1.16、支持从 JSON 生成代码以及一些错误

    「尝鲜」SpringBoot 快速整合Swagger 3.0

    第一步:Maven引入Swagger3.0 starter依赖 Maven项目中引入springfox-boot-starter依赖: <dependency> <

    Go语言集成开发环境-GoLand 2020.3稳定版发布

    简介 GoLand 是 JetBrains 公司推出的 Go 语言集成开发环境。GoLand 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系。 GoLand 2020.3

    HashiCorp开源Boundary:安全访问动态主机服务

    HashiCorp 宣布开源 Boundary,此项目可帮助运维人员从业者通过细粒度的授权安全地访问动态主机和服务,无需管理凭据或公开网络。 Boundary 旨在使用最小特权原则 (POLP

    SourceTree里GitFlow的使用

    使用,比较担心的是管理工作稍微繁琐一点。操作倒不复...

    京东技术京东风格的移动端Vue组件库NutUI2.0来啦

    移动端 Vue 组件库 NutUI 自发布以来受到了广泛的关注。据不完全统计,目前至少有30多个京东的 web 项目正在使用 NutUI 。

    Spring Framework 5.3.6 & 5.2.14 发布

    Spring Framework 5.3.6 和 5.2.14 现已发布,分别包含 19 项与 11 项修复和改进。 主要更新内容 5.3.6

    Kooteam 0.1.3 发布,重构系统日志模块,简化安装流程

    Kooteam是一款轻量级的在线团队协作工具,提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发等工具,并接入了微信小程序,钉钉开放平台,使用便捷高效。

    CrateDB 4.3.1 发布,分布式 SQL 数据库

    CrateDB 4.3.1 预发布。Crate 是一个开源的大规模的可伸缩的数据存储系统,无需任何系统管理需求。提供强大的搜索功能。用于存储各种表格数据、非结构化数据和二进制对象。并可通过 SQL

    Python 3.8.6 发布

    Python 3.8.6 发布了,它是 Python 3.8 的第六个维护版本。 3.8 系列的维护版本将每两个月定期更新一次,3.8.7 计划于 2020 年 11 月中旬发布。 随着维护版本的

    京东技术使用京东Taro重构小程序

    >>>>  Taro 简介 Taro 是一个基于 React 语法规范的多端统一开发框架,大家可以通过 taro.aotu.io 进一步了解。而前段时间...

    YuebonCore 1.0.1 发布,权限管理快速开发框架

    YuebonCore是基于.Net5.0开发的权限管理快速开发框架,整合应用最新技术包括Asp.NetCore MVC、Dapper、AutoFac、WebAPI、Swagger、EF、Vue等

    京东技术京东系统架构师如何让笨重的架构变得灵巧

    京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。

    【开源推荐】基于 Go 语言的轻量级高性能日志库 logit使用测评

    logit 是一个简单易用并且是基于级别控制的日志库,可以应用于所有的 GoLang 应用程序中。