专栏首页写代码和思考Go 语言中使用 Protocol Buffers

Go 语言中使用 Protocol Buffers

0. 背景

当前流行微服务框架,gRPC和Protocol Buffers 是 Go 的微服务框架常用的框架。

1. Protocol Buffers 介绍

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

总结下特点就是:

  • 它是一种序列化格式,和 JSON,XML 类似。
  • 它是二进制的,压缩比例高,短小。
  • 序列化处理速度很快
  • 非明文传输
  • 它通过一种 proto 语法描述格式,可以通过工具生成多种语言代码
  • 支持多种开发语言,Java,Go,Python,JS等

Github 地址:https://github.com/golang/protobuf

Protocol Buffers 通常用于 RPC (远程过程调用)过程中,比如微服务间通讯。

2. 开始之前

在开始之前,我们需要先安装和配置开发环境。

分两个步骤:

  • 安装 protoc 工具
  • 安装 protoc-gen-go

2.1 安装 protoc 工具

在下面这个网址里找到适合你系统的安装包。 https://github.com/protocolbuffers/protobuf/releases

我的机器是mac ,找到 protoc-3.11.4-osx-x86_64.zip 并下载。解压到文件后,修改环境变量。

解压后的文件里有 bin/protoc ,这个 protoc 命令用于编译和生成代码,后面会用到。

建议将这个文件位置放入到环境变量,以方便使用。比如在 修改 .bash_profile 文件,示例:

# PB 工具
export PB_PATH=/Users/zhangyunfei/chengxu/protoc-3.11.4-osx-x86_64
export PATH=$PATH:$PB_PATH/bin

2.2 安装 protoc-gen-go

protoc-gen-go 是 生成 Go 代码的 protocolbuffers 编译器。可以理解为一个编译器插件,配合 protoc 来使用。 在命令行中执行:

go get -u github.com/golang/protobuf/protoc-gen-go

这个工具用于生成 基于 Protocol Buffers 的代码。

3.开始使用

3.1 概述

使用步骤拆解:

  • (1) 定义.proto文件,它用来描述,定义传输过程中的数据包。
  • (2) 编译.proto文件,生成代码。用来将描述文件编译成指定平台的代码(比如生成GO源代码文件)。
  • (3) 获取特定平台的类库/包,用来在特定平台编码,解码等。

下面分别描述这几个步骤。

3.2 定义.proto文件

创建一个 model.proto 文件,它用来描述 数据包的内容,实体对象的字段等。 示例:

syntax = "proto2";
    package example;

    enum FOO { X = 17; };

    message Test {
      required string label = 1;
      optional int32 type = 2 [default=77];
      repeated int64 reps = 3;
    }

3.3 编译.proto文件

使用 protoc 生成 Go 源代码文件。

protoc --go_out=paths=source_relative:. model.proto

完成后,将生成的 Go 源代码文件放入项目中。

3.4 导入包和使用

导入包

import (
    "fmt"
    "github.com/golang/protobuf/proto"
)

序列化

  • 使用 proto.Marshal 来将 一个Go Struct 序列化成字节。-
  • 字节可以通过HTTP, Socket等网络传输。
  • 使用 proto.Unmarshal 来将 字节反序列化成对象。
package main

import (
    "fmt"
    "github.com/golang/protobuf/proto"
    example "gopbdemo/pb"
    "log"
)

func main() {
    // 一个实体
    obj := &example.Test{
        Label: proto.String("hello"),
        Type:  proto.Int32(17),
        Reps:  []int64{1, 2, 3},
    }
    // 序列化成字节
    data, err := proto.Marshal(obj)
    if err != nil {
        log.Fatal("序列化时发生错误: ", err)
    }
    fmt.Println("完成序列化,长度=", len(data))

    newObj := example.Test{}
    err = proto.Unmarshal(data, &newObj)
    if err != nil {
        log.Fatal("反序列化时发生错误: ", err)
    }
    fmt.Println("结果:", newObj.GetLabel(),newObj.GetType(),newObj.GetReps())

}

4. 参考

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

协议 https://github.com/protocolbuffers/protobuf

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发(38) 账户中心和同步适配器

    在sdk目录下有个示例项目SampleSyncAdapter,演示了 用户授权和同步适配器的一些内容,是个学习的很好范例。我读了很久,很多地方没搞明白,先把理解...

    zhangyunfeiVir
  • Go 学习笔记2 - 构建个简单的 http 服务

    ListenAndServe 方法可以开启一个 HTTP 服务,这个函数接收 一个地址,和一个 handler 。一般情况下,第二个参数 handler 写成 ...

    zhangyunfeiVir
  • React 项目部署在 Nginx

    期望网址是:http://192.168.135.89/bbs_system_h5_dev

    zhangyunfeiVir
  • Gravatar开发者手册

    Gravatar上所有URL都是基于电子邮箱地址的哈希值。图像和个人档都是通过电子邮件的哈希值访问获取的,这是系统识别用户身份的主要方式。为确保哈希值的一致性和...

    Jeff
  • Gravatar开发者手册

    Gravatar上所有URL都是基于电子邮箱地址的哈希值。图像和个人档都是通过电子邮件的哈希值访问获取的,这是系统识别用户身份的主要方式。为确保哈希值的一致性和...

    Jeff
  • 这里有一份Node.js入门指南和实践,请注意查收

    JS 是脚本语言,脚本语言都需要一个解析器才能运行。对于写在 HTML 页面里的 JS,浏览器充当了解析器的角色。而对于需要独立运行的 JS,NodeJS 就是...

    null仔
  • ECCV 2018 | UBC&腾讯AI Lab提出首个模块化GAN架构,搞定任意图像PS组合

    作者:Bo Zhao、Bo Chang、Zequn Jie、Leonid Sigal

    机器之心
  • 学会这10种机器学习算法你才算入门

    可以说,机器学习从业者都是个性迥异的。虽然其中一些人会说“我是X方面的专家,X可以在任何类型的数据上进行训练”,其中,X =某种算法;而其他一些人则是“能够在适...

    IT派
  • 「数据科学家」必备的10种机器学习算法

    可以说,机器学习从业者都是个性迥异的。虽然其中一些人会说“我是X方面的专家,X可以在任何类型的数据上进行训练”,其中,X =某种算法;而其他一些人则是“能够在适...

    朱晓霞
  • 「数据科学家」必备的10种机器学习算法

    编译 | 嗯~是阿童木呀、KABUDA、EVA 可以说,机器学习从业者都是个性迥异的。虽然其中一些人会说“我是X方面的专家,X可以在任何类型的数据上进行训练”,...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券