Protobuf 的介绍与使用(入门级)

背景


在移动互联网时代,手机流量、电量是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。

解决流量过大的基本方法就是使用高度压缩的通信协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源。

当前即时通讯应用中最热门的通信协议无疑就是Google的Protobuf了,基于它的优秀表现,微信和手机QQ这样的主流IM应用也早已在使用它。本文将详细介绍Protobuf的使用、原理等。

Protobuf 介绍


Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API(即时通讯网注:Protobuf官方工程主页上显示的已支持的开发语言多达10种,分别有:C++、Java、Python、Objective-C、C#、JavaNano、JavaScript、Ruby、Go、PHP,基本上主流的语言都已支持,详见工程主页:https://github.com/52im/protobuf)。

或许您和我一样,在第一次看完这些介绍后还是不明白 Protobuf 究竟是什么,那么我想一个简单的例子应该比较有助于理解它。

Protobuf 安装


安装 Protobuf

编译安装 protobuf 的编译器 protoc

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

tar zxvf protobuf-all-3.6.1.tar.gz

cd protobuf-3.6.1


// /usr/local/ 为安装路径
./configure --prefix=/usr/local/

# 要编译很久
sudo make -j`nproc`
sudo make check
sudo make install

// 检查安装结果
protoc --version

安装结果:

注:protobuf 的静态库被安装到了 /usr/local/lib 中,如果在执行 protoc --version 时,报错:protoc: error while loading shared libraries: libprotoc.so.17: cannot open shared object file: No such file or directory;则只需将 /usr/local/lib 添加到环境变量即可!

添加命令如下:

// 该添加只在当前窗口有效
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

安装 protoc-gen-go 插件

使用 Go 的包管理工具 go install 来安装 protobuf 的 Go 插件。这个插件现在是作为一个独立的模块发布的,而不是 google.golang.org/protobuf 包的一部分,因此需单独安装。

从 Go 1.11 开始,Go 引入了模块作为官方的依赖管理工具,并逐渐替代了 GOPATH 模式。在 Go 模块模式下,Go 项目可以有自己独立的依赖管理,不再严格依赖于全局的 GOPATH。

在 Go 模块模式下,可能不会直接操作 $GOBIN 环境变量,因为 go install 命令会自动处理二进制文件的安装位置。但是,如果想要自定义安装位置,可以设置 $GOBIN 环境变量。例如:

// 指定 protoc-gen-go 的安装位置
export GOBIN=/usr/local/go/bin

// 安装 protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

注:把 .proto 文件编译成 .go 文件依赖 protoc-gen-go;

Protobuf 使用


创建 .proto 文件

创建 metadata.proto 文件

syntax = "proto3";
package message;

option go_package = "/data/etcd_test/src/message";
 
message Metadata {
    string Name = 1;
    string DBName = 2;
    string Type = 3;
    int64 ShardMethod = 4;
    string ShardKey = 5;
    int64 ShardCount = 6;
    string Groups = 7;
    string RangeInfo = 8;
}

注:

  • go_package 用于指定生成的GO代码应该使用哪个包名,并且(可选地)指定生成代码的输出目录
  • 字段后面的数字在序列化过程中唯一标识字段,这些标识符在消息定义中是唯一的,并且在整个.proto文件中应该是唯一的

编译.proto 文件

protoc --go_out=. --go_opt=paths=source_relative ./src/message/metadata.proto

注:

  • --go_out=. 告诉 protoc 编译器生成 Go 代码,并将输出放在当前目录(.表示当前目录)
  • --go_opt=paths=source_relative 是一个选项,它告诉 protoc-gen-go 生成代码时使用相对于 .proto 文件的路径,这在 Go 模块中特别有用,因为它可以确保生成的代码与你的模块结构保持一致

 

编译结果:

Json 和 Protobuf 的对比


在当今的软件开发中,数据交换是必不可少的环节。Protobuf和JSON是两种广泛使用的数据交换格式,它们各自具有独特的优势和适用场景。下面将从多个方面对Protobuf和JSON进行对比分析。

1)性能

Protobuf是一种高效的二进制序列化格式,它在数据传输和存储方面的性能优于JSON。由于Protobuf采用二进制编码,因此在相同数据量的情况下,序列化和反序列化的速度更快,且数据体积更小。相比之下,JSON是一种文本格式,其编码较为冗长,且解析速度相对较慢。因此,在处理大量数据或对性能要求较高的场景下,Protobuf更具优势。

2)可读性

JSON的优点在于其易于阅读和编写。JSON数据的结构清晰,语法简单,使得开发人员能够轻松地读写和理解数据。而Protobuf的二进制编码方式则较为复杂,不易于直接阅读。因此,在需要易于阅读和调试的场景下,JSON更为合适。

3)可扩展性

Protobuf具有更好的可扩展性。它支持自定义消息类型和字段标签,允许用户根据需要定义复杂的数据结构。此外,Protobuf还支持多种编程语言的实现,使得在不同语言间进行数据交换更加方便。相比之下,JSON虽然也可以表示复杂的数据结构,但其扩展性相对较差,且不支持自定义标签等高级功能。因此,在需要定义复杂数据结构或跨语言数据交换的场景下,Protobuf更具优势。

4)安全

Protobuf和JSON在安全性方面各有千秋。Protobuf采用加密传输的方式保证数据的安全性,而JSON则可以通过适当的加密算法对数据进行加密处理。另外,由于Protobuf采用二进制编码,相对于JSON的文本格式更难以被直接查看和修改,从而提高了数据的安全性。然而,在实际应用中,为了确保数据的安全性,无论使用Protobuf还是JSON都需要采取相应的安全措施,如加密传输、校验数据完整性等。因此,在安全性方面没有绝对的优劣之分。

5)流行度与生态系统

JSON在互联网领域的应用非常广泛,已经成为RESTful API的标准数据格式之一。许多常用的编程语言和框架都支持JSON的处理和解析,这使得JSON在开发社区中拥有庞大的生态系统。而Protobuf虽然也得到了许多公司和项目的采用,但其流行度和生态系统相对较小。因此,在选择数据交换格式时,需要考虑项目需求和开发团队的技能背景。

综上所述,Protobuf和JSON各有千秋,需要根据实际需求选择合适的数据交换格式。在处理大量数据或对性能要求较高的场景下,Protobuf更具优势;而在需要易于阅读和调试的场景下,JSON更为合适。另外,如果项目需要定义复杂的数据结构或跨语言数据交换,应优先考虑使用Protobuf;如果项目主要应用于互联网领域,则JSON可能更适合。在选择数据交换格式时,还需要综合考虑安全性、流行度以及生态系统等方面的因素。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随笔】Git -- 解决提交时本地与目标分支不一致导致提交失败(三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

Codeforces Round 935 (Div. 3) (A~G)

1945A - Setting up Camp 题意:三种人安排住宿,a只能跟自己住,b只能三个人住,c能1~3个人,问最终最少房间数 思路:a单独安排,b放一起,不足三个人的用c补,然后c按照3人一房间尽可能分配 void solve() {int a , b , c;cin >> a >>…

一番赏小程序开发,潮玩市场创业新选择!

一番赏是目前非常火爆的抽奖模式,拥有不确定性和超高的惊喜感, 各类隐藏款限量款盲盒商品让年轻消费者欲罢不能。在各种流行趋势下,一番上的市场规模逐渐扩大,吸引着无数人入局。 一番赏在市场上主要是以线下商场门店和线上小程…

某招聘系统0day挖掘(获取4站点报告证书)

前言: 21年的挖的漏洞了 漏洞均已提交且均已修复,这里文章只做技术交流 挖掘过程 对我来说,毕竟喜欢直接黑盒挖0day,一个0day挖到后就可以刷上百分。 如该系统正常找了一个招聘系统用的比较多的 如该通用系统,该通用系统存在一个注册功能 正常的进行注册一个账户进去…

Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中,我们将了解如何将现有数据流&#xff0…

Yolov部署在Windows和Android上

Yolov部署在Windows和Android上 前言主要模块主要流程转换为ONNX 部署代码JAVAC 前言 Yolov是目标检测的利器,工业中运用得很火。尽管网上的Yolov部署资料很多,但是这块内容目前做得还算上成熟。为了将Yolov部署在Android和Windows上费了些功夫&#xff…

‍Java OCR技术全面解析:六大解决方案比较

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

升级你的技能:发现国产操作系统Deepin学习网站的无限可能!

网址:deepin是一款由武汉深之度科技有限公司开发的Linux操作系统。以下是对deepin的详细介绍: 发展历程:deepin最初名为Hiweed Linux,自2004年起开始对外发行。它经历了多次迭代和改进,逐渐发展成为今天广受好评的操作…

语音转文字——sherpa ncnn语音识别离线部署C++实现

简介 Sherpa是一个中文语音识别的项目,使用了PyTorch 进行语音识别模型的训练,然后训练好的模型导出成 torchscript 格式,以便在 C 环境中进行推理。尽管 PyTorch 在 CPU 和 GPU 上有良好的支持,但它可能对资源的要求较高&#x…

面试算法-67-完全二叉树的节点个数

题目 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置…

招聘系统开发招聘软件APP招聘小程序开发对标仿BOSS直聘

项目背景 一、市场前景:求职招聘市场的数字化革新 随着互联网的普及和人们对线上求职的接受度提高,求职招聘市场正经历一场数字化革新。招聘系统、软件APP与小程序等数字化产品不仅提供了便捷的求职和招聘服务,还通过智能算法和数据分析技术…

“美联储才是大多头”!鲍威尔推翻降息疑虑!今年降息三次,比特币直奔6.8万!

北京时间周四(3月21日)凌晨,美联储宣布将基准利率维持在5.25%-5.50%区间,为连续第五次保持利率不变,符合市场预期。 然而,更引人注目的是美联储对未来的降息计划。即使降低通胀的进展已经停滞,美…

创建maven项目

创建空项目 然后配置maven 然后,创建module

多线程实现

1.多线程:并发实现 主线程和子线程并行实现。 一个进程中有多个线程,可以同时进行多个任务。进程是系统分配的,线程的执行是由调度器决定的。 注意:线程开启不一定执行,由Cpu调度执行。 线程创建的三种方式&#xff…

js【详解】深拷贝

什么是深拷贝? 对于引用类型的数据,才有深浅拷贝的说法 浅拷贝 :执行拷贝的变量只复制被拷贝变量内存的引用数据的地址。 被拷贝变量内地址指向的数据发生变化时,执行拷贝的变量也会同步改变 深拷贝: 在堆内存中开…

高效输入关键词,瞬间生成惊艳图片:创意与速度的完美结合!

在数字化时代,图片已经成为我们生活中不可或缺的一部分。无论是社交媒体的分享、广告的创意,还是工作中的报告展示,高质量的图片都能为我们的内容增添不少色彩。但你是否曾遇到过这样的困扰:想要一张符合心意的图片,却…

VScode前端常用插件推荐

Color Highlight—查看css颜色 这个插件可以让我们在vscode中看到代码中的颜色,效果如图所示 Chinese (Simplified) (简体中文) Language Pack for Visual Studi ------ 简体中文语言包 把vscode翻译为中文 Auto Rename Tag—自动修改对应的标签 效果如图所示…

uniapp+uview实现城市选择器

1.效果 2.代码—在components中创建CitySelect组件 <template><view><text class"uni-input" style"background-color: #F8F8F8;display: block;line-height: 76rpx;padding:0 29rpx;" tap"open">{{value}}</text><…

01-java面试题八股文-----java基础——20题

文章目录 <font color"red">1、java语言有哪些特点&#xff1a;<font color"red">2、面向对象和面向过程的区别<font color"red">3、标识符的命名规则。<font color"red">4、八种基本数据类型的大小&#xff…

linux下用docker安装mysql及导入文件

目录 1. 非root用户设置docker权限2. user账号安装mysql2. root账号打开防火墙3. 启动mysql容器3.1 在指定工作目录下建立文件夹3.2 配置文件3.3 开启mysql容器 4. 进入容器4.1 通过容器进入mysql4.1 设置账号4.2 建立数据库4.3 导入文件 5. windows连接数据库参考文件 1. 非ro…