当前位置: 首页 > news >正文

【从零开始学Skynet】高级篇(一):Protobuf数据传输

1、什么是Protobuf

         Protobuf是谷歌发布的一套协议格式,它规定了一系列的编码和解 码方法,比如对于数字,它要求根据数字的大小选择存储空间,小于等于15的数字只用1个字节来表示,大于15的数用2个字节表示,以此类推,这样要求可以尽可能地节省空间。Protobuf协议的一大特点是编码后的数据量很小,可以节省网络带宽。

         上图展示了用pbc模块处理Protobuf协议的流程。我们需要先编写描述文件,描述文件有它特定的格式,再用名为protoc的软件将它转换成.pb格式的文件;最后使用pbc库提供的方法实现编码解码。从上图可以看出,Protobuf的编码长度很短,move协议仅仅占用了6个字节。

 2、安装Protobuf和pbc

(1)安装protobuf

sudo apt-get install protobuf-c-compiler protobuf-compiler

 (2)定位到skynet/3rd/目录下,并下载第三方库pbc的源码

cd skynet/3rd/
git clone https://github.com/cloudwu/pbc.git

 (3)定位到pbc目录下,并编译

cd pbc
make

 (4)编译成功后,打开skynet/3rd/pbc/binding/lua53/Makefile文件,修改里面的lua路径

CC = gccCFLAGS = -O2 -fPIC -WallLUADIR = ../../../lua   #这个路劲就是skynet/3rd/luaTARGET = protobuf.so.PHONY : all cleanall : $(TARGET)$(TARGET) : pbc-lua53.c$(CC) $(CFLAGS) -shared -o $@ -I../.. -I$(LUADIR) -L../../build $^ -lpbcclean :rm -f $(TARGET)

 (5)进入pbc的binding目录,它包含Skynet可用的C库源码

cd ./binding/lua53

(8)开始编译,成功后会在同目录下生成库文件protobuf.so

sudo make

(9)将protobuf.so和protobuf.lua分别放入对应的目录下

cp protobuf.so ../../../../luaclib/  #将protobuf.so复制到存放C模块的lualib目录中    
cp protobuf.lua ../../../../lualib/  #将protobuf.lua复制到存放Lua模块的lualib目录中

 

 3、编译proto文件

 

(1)编写proto文件

        使用Protobuf的第一步是编写描述文件(即.proto文件),新建用于存放协议描述文件的目录 proto,并在里面创建描述文件login.protologin.proto的内容如下代码所示:

package login;
message Login {required int32 id = 1;required string pw = 2; optional int32 result = 3;}
  • 包名为“login”,协议名为“Login”,它包含id、pw、result三个属性;
  • required:如果没有指定值,将采用默认值填充;
  • optional:如果没有指定值,直接为空。

(2)编译proto文件

   进入proto目录,用如下指令编译login.proto:

protoc --descriptor_set_out login.pb login.proto

   编译成功后,将会出现名为login.pb的二进制文件

  

 

4、 编码和解码

         pbc模块常用的API有“register_file”“encode”“decode”。使用pbc编解码之前,需先用register_file注册编译文件(.pb文件),然后用encode方法编码、用decode方法解码。

(1)在skynet/examples目录下创建main_protobuf.lua:

local skynet = require "skynet"
local pb = require "protobuf"--protobuf编码解码
function test4()pb.register_file("./proto/login.pb")--编码local msg = {id = 101,pw = "123456",}local buff = pb.encode("login.Login", msg)print("len:"..string.len(buff))--解码local umsg = pb.decode("login.Login", buff)if umsg thenprint("id:"..umsg.id)print("pw:"..umsg.pw)elseprint("error")end
endskynet.start(function()test4()
end)

  pb.encode带有两个参数:

  • 第一个参数代表协议名,由proto描述文件的包名和协议名组合而成
  • 第二个参数代表协议对象

  pb.decode也带有两个参数:

  • 第一个参数代表协议名,
  • 第二个参数是二进制数据。

如果解码失败,pb.decode会返回nil,如果解码成功,它会返回协议对象。 运行流程如下图所示:

 

(2)在skynet/examples目录下创建config_protobuf: 

include "config.path"thread = 8
logger = nil
logpath = "."
harbor = 1
address = "127.0.0.1:2526"
master = "127.0.0.1:2013"
start = "main_protobuf"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap
standalone = "0.0.0.0:2013"
cpath = root.."cservice/?.so"

 

5、运行代码        

 进入skynet目录,输入如下指令:

./skynet examples/config_protobuf

运行结果如下图所示, 可以看到这里只占10字节。

相关文章:

【从零开始学Skynet】高级篇(一):Protobuf数据传输

1、什么是Protobuf Protobuf是谷歌发布的一套协议格式,它规定了一系列的编码和解 码方法,比如对于数字,它要求根据数字的大小选择存储空间,小于等于15的数字只用1个字节来表示,大于15的数用2个字节表示,以此…...

快速入门Lombok

Lombok是一个Java库,可以通过注解的方式来简化Java代码,它可以自动生成Getter、Setter、构造函数等代码,从而减少重复的模板代码。下面是Lombok的使用详情: 1. 添加Lombok依赖 在使用Lombok之前,我们需要先添加Lombo…...

Linux 常见命令与常见问题解决思路

Linux 常见命令 Linux 基础命令目录相关查看文件(日志)查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…...

用GPT-4 写2022年天津高考作文能得多少分?

正文共 792 字,阅读大约需要 3 分钟 学生必备技巧,您将在3分钟后获得以下超能力: 积累作文素材 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lexica …...

Django如何把SQLite数据库转换为Mysql数据库

大部分新手刚学Django开发的时候默认用的都是SQLite数据库,上线部署的时候,大多用的却是Mysql。那么我们应该如何把数据库从SQLite迁移转换成Mysql呢? 之前我们默认使用的是SQLite数据库,我们开发完成之后,里面有许多数…...

使用apisix代理静态文件

前言 最近公司考虑用apisix作为公司网关并且部署到k8s上,我这边收到一个小任务:使用apisix代理静态文件 通过apisix官网了解到它构建于 NGINX ngx_lua 的技术基础之上,所以按理应该和nginx代理静态资源是一样的。因为是通过docker容器部署…...

[元带你学NVMe协议] NVMe1.4 多路径(Multipathing)

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 全文9100字, 主要内容 目录 前言 1 多路径(Multipathing)概念...

Elasticsearch:如何使用自定义的证书安装 Elastic Stack 8.x

在我之前的文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch”,我详细描述了如何在各个平台中安装 Elastic Stack 8.x。在其中的文章中,我们大多采用默认的证书来安装 Elasticsearch。在今天的文章中,我们用自己创…...

HADOOP--yarn ,, git

Yarn架构体系 主从架构 也是采用 master(Resource Manager)- slave (Node Manager)架构,Resource Manager 整个集群只有一个,一个可靠的节点。 1、 每个节点上可以负责该节点上的资源管理以及任务调度&am…...

IOS开发指南之UITableView控件使用

1.创建一个IOS单页应用 2.双击Main.storyboard然后拖放UITableView到视图中 3.添加TableViewCell 成功添加Table View Cell 4.修改Table View Cell属性 选中Table View Cell 在右边的Image栏输入default.png回车 到此布局设计完成,现在运行还是显示 空白,要在代码中做相关的实…...

C语言中的数据类型

目录 一、数据类型 1.基本类型 2.sizeof运算符 3.signed和unsigned 二、基本数据类型的取值范围 1.比特位 2.字节 3.符号位 4.补码 5.基本数据类型的取值范围 一、数据类型 1.基本类型 (1)整数类型 short intintlong intlong long int &…...

什么是微服务中的熔断器设计模式?

在本文中,我将解释什么是熔断器设计模式以及它解决了什么问题。 我们将仔细研究熔断器设计模式,并探讨如何使用Spring Cloud Netflix Hystrix在Java中实现它。到本文结束时,您将更好地了解如何使用熔断器设计模式提高微服务架构的弹性。 熔断…...

Ubuntu查看系统日志的几种方法

在 Ubuntu 22.10 中,你可以查看系统日志来排查错误。以下是几种查看日志的方法: 一、Journalctl 命令: 使用 journalctl 命令可以查看系统日志信息,包括引起闪退的错误信息。你可以运行以下命令来查看最新的系统日志:…...

【ubuntu】安装ZIP

【ubuntu】安装ZIP 输入如下命令安装zip $ sudo apt-get install zip 输出信息如下: Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: unzip The follo…...

DiffDock源码解析

DiffDock源码解析 数据预处理 数据输入方式 df pd.read_csv(args.protein_ligand_csv), 使用的是csv的方式输入, 格式: 不管受体还是配体, 输入可以是序列或者3维结构的文件 如果蛋白输入的是序列,需要计算蛋白的三维结构&am…...

1099 Build A Binary Search Tree(超详细注解+38行代码)

分数 30 全屏浏览题目 作者 CHEN, Yue 单位 浙江大学 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree…...

[刷题]贪心入门

文章目录 贪心区间问题区间选点区间合并区间覆盖 哈夫曼树(堆)合并果子 排序不等式排队打水 绝对值不等式货仓选址 推出来的不等式耍杂技的牛 以前的题 贪心 贪心:每一步行动总是按某种指标选取最优的操作来进行, 该指标只看眼前&…...

项目集战略一致性

项目集战略一致性是识别项目集输出和成果,以便与组织的目标和目的保持一致的绩效领域。 本章内容包括: 1 项目集商业论证 2 项目集章程 3 项目集路线图 4 环境评估 5 项目集风险管理战略 项目集应与组织战略保持一致,并促进组织效益的实现。为…...

Linux学习 Day3

目录 1. 时间相关的指令 2. cal指令 3. find指令:(灰常重要) -name 4. grep指令 5. zip/unzip指令 6. tar指令(重要):打包/解包,不打开它,直接看内容 7. bc指令 8. uname –…...

前端开发推荐vscode安装什么插件?

前言 可以参考一下下面我推荐的插件,注意:插件的目的是用于提高开发的效率,节约开发的时间,像类似检查一些bug、拼写错误等这些可以使用插件快速的识别,避免在查找错误上浪费过多的时间,但切记不要过度依赖…...

毕业设计实战:基于SSM的学生宿舍设备报修管理系统设计与实现全攻略

毕业设计实战:基于SSM的学生宿舍设备报修管理系统设计与实现全攻略 在开发“学生宿舍设备报修管理系统”这套毕设时,我曾因“故障上报与维修派单流程脱节”踩过一个关键坑。初期设计时,我将“学生报修”和“维修人员接单”视为两个独立的模块…...

Crypto-JS实战指南:如何构建可靠的浏览器端加密验证体系

Crypto-JS实战指南:如何构建可靠的浏览器端加密验证体系 【免费下载链接】crypto-js JavaScript library of crypto standards. 项目地址: https://gitcode.com/gh_mirrors/cr/crypto-js 在Web应用开发中,加密功能的正确性直接关系到用户数据安全…...

3大维度解析BGE向量技术:从原理到检索增强实践

3大维度解析BGE向量技术:从原理到检索增强实践 【免费下载链接】FlagEmbedding Dense Retrieval and Retrieval-augmented LLMs 项目地址: https://gitcode.com/GitHub_Trending/fl/FlagEmbedding 文本嵌入技术是现代AI系统的核心组件,而检索增强…...

三相三电平Vienna整流器:SPWM与SVPWM调制仿真及控制策略对比分析

三相三电平vienna整流器SPWM和SVPWM调制仿真 基于plecs搭建 温度场分析 双PI控制 锁相环控制 中点电压平衡控制 功率因数为1 SPWM和SVPWM调制对比 谐波畸变率对比分析 电压利用率对比分析 电压平衡和不平衡控制对比 图1 仿真模型 图2 温度场分析 图3 交流电压电流三电平…...

深度学习基石:从卷积神经网络理解 Stable Yogi 的图像生成能力

深度学习基石:从卷积神经网络理解 Stable Yogi 的图像生成能力 你是不是也好奇,像 Stable Yogi 这样能“凭空”画出精美图片的模型,它的“眼睛”和“大脑”究竟是怎么工作的?为什么给它一段文字描述,它就能理解并生成…...

Qt QFile与QTextStream高效文本处理实战指南

1. Qt文件处理基础与QFile核心用法 在Qt开发中,文件操作是每个开发者必须掌握的基础技能。无论是处理配置文件、记录日志还是数据持久化,都离不开对文件的读写操作。QFile作为Qt框架中专门用于文件操作的类,提供了跨平台的文件处理能力&…...

10个libxev实战技巧:从定时器到TCP服务器的完整实现

10个libxev实战技巧:从定时器到TCP服务器的完整实现 【免费下载链接】libxev libxev is a cross-platform, high-performance event loop that provides abstractions for non-blocking IO, timers, events, and more and works on Linux (io_uring or epoll), macO…...

Hasklig 可变字体终极指南:单一文件实现多字重支持的完整教程

Hasklig 可变字体终极指南:单一文件实现多字重支持的完整教程 【免费下载链接】Hasklig Hasklig - a code font with monospaced ligatures 项目地址: https://gitcode.com/gh_mirrors/ha/Hasklig Hasklig 是一款专为程序员设计的开源代码字体,以…...

Java 25记录模式深度实战:手把手带你用模式匹配解构嵌套记录,效率提升47%(JVM实测数据)

第一章:Java 25记录模式的演进脉络与核心突破记录模式(Record Patterns)作为 Java 21 首次以预览特性引入、并在 Java 22 进一步增强、最终于 Java 25 正式成为标准特性的关键语言机制,标志着 Java 在模式匹配演进道路上完成从“解…...

【分箱进阶篇】分箱的工程细节:从训练到部署的完整模式

基础篇参考:【分箱基础篇】pandas 分箱双子星:pd.cut 与 pd.qcut ​ 我们在基础篇讲了 pd.cut 和 pd.qcut 各自怎么用。但在实际项目里,分箱不是调一次函数就完事的。通常来说,训练集上算出来的切分点要保存下来,测试集…...