百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

上手protobuf:一文掌握protobuf的使用

bigegpt 2024-11-24 12:00 3 浏览

简介

在上一篇文章中,我们已经了解了protobuf是什么,还有proto文件该如何编写

如还未阅读,可点击指引前往阅读

在本文中,将着重讲讲protobuf该怎么用

Protobuf使用教程

Protobuf是一种高效数据序列化协议,可支持多种编程语言,不同编程语言使用方法或略有差异、或有多种方法,以下主要介绍大致的、通用的使用方法

安装编译器

使用protobuf前,需先安装其编译器—protoc(下载地址可看文末)

进入项目下载界面,根据自己的系统选择下载合适的版本,如喜欢也可下载源码自行构建

接着将其解压目录中的bin目录配置到系统环境变量内,方便全局使用

配置成功后,可以在命令行窗口(win+R调出)输入protoc --version查看protoc版本,验证是否配置成功

编译Proto

.proto文件并不能直接使用,我们需要将其编译成对应编程语言的序列化工具代码,从而进行使用

这一步,我们需要使用上方安装的protoc.proto文件进行编译,protoc是一个命令行工具,主要使用步骤就是在命令行中通过命令调用protoc对目标进行编译

具体protoc的命令,可在命令行中,通过protoc --help命令,获取其部分命令解释,主要关注如下内容:

  • -IPATH--proto_path可简写为-I,等号后接一个路径,表示模块搜索路径,可以有多个
    • 当你的.proto文件比较庞大,并且在里面有import导入其它proto文件,此时就可以用该命令指定导入文件所在目录,告诉编译器该去哪搜索这些文件
  • --**_out形式的命令参数表示需要生成的目标语言源码,等号后接一个路径,表示生成文件保存的目录,**表示支持生成的编程语言

举个例子

假设我们有个名为example.proto的结构文件,大致如下:

在当前目录打开命令行,输入如下命令:


命令表示将example.proto编译为python代码,输出目录为.(即当前目录)

命令运行完成后,会在当前目录生成一个example_pb2.py的文件,我们可在python程序内使用它对我们的消息进行序列化和反序列化

再举个例子

我们运行protoc --version后,可以看到命令参数里支持生成的语言并没有js,如果我们想生成js文件怎么办

首先,protoc是可以生成js代码的,之所以前面的不支持,是由于一些高版本的protoc把部分编程语言的支持分化出来,单独作为插件存在,需要可自行安装搭配

可以降低protoc的版本,一些较低的版本是支持--js_out的(高版本将其分化出来成插件了)

如果不想降低版本

如果有npm,可全局安装protoc-gen-js

如果无npm,可以到protobuf-javascript项目地址手动下载js的编译器包并解压到本地,然后通过--plugin指定插件名及插件路径使用;如不想使用--plugin指定,也可直接将解压内容整个拖前面protoc的目录下

也可以使用一些第三方工具,如protobufjs-cli、protobufjs

解决js支持后,即可使用下列代码生成js版本的序列化库

上面的命令会将example.proto编译为js内可用的序列化工具代码,风格为commonjs(即使用require导入)

注意:目前尚未实现对ES6样式导入的支持。可以通过使用Browserify、webpack、Closure Compiler 或类似工具来进一步解析以支持浏览器

开始使用

生成好目标环境的编译文件后,我们即可在项目内使用protobuf来提高我们的消息传输效率

Python示例

大致代码如下:

  • 其中,example_pb2为之前example.proto编译后的产物
  • 经过测试,上面的数据stu序列化后的二进制数据大小大概为84字节,而相同数据的json格式大小为210字节

在使用上方生成的example_pb2时,我们会发现,生成的代码基本不可读,使用过程代码也没有丝毫智能提示,需要自己参照proto文件才知道需导入该Student,而具体的序列化函数还得看使用文档

我们打开example_pb2.py文件,如下:

  • 不难看出,代码可读性是比较差的

通过官方的protoc生成的python格式代码可读性是比较差的,可能比较适合一些保密需求高或小型项目,如果我们希望提高代码可读性,可以使用betterproto生成代码

  • 首先,需要安装betterproto,使用pip安装
  • 着使用其重新编译proto文件
  • 命令运行成功后,会在当前目录生成一个example.py文件,内容大致如下:
  • 可以看出,代码可读性变好了很多,并且拥有更好的编写体验,大致使用代码如下:

Nodejs示例

大致代码如下:

以上主要举例了两种使用方法,更多的使用方法可自行探索

protoc下载地址:https://github.com/protocolbuffers/protobuf/releases

protoc编译js文档:https://protobuf.dev/protobuf-javascript/

protoc编译js插件下载地址:https://github.com/protocolbuffers/protobuf-javascript/releases



相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...