适合嵌入式的C++开源项目-Workflow

在来腾讯之前,我是没有真正用C++开发过一个完整的项目的,然后,赶鸭子上架,鹅厂的人特别喜欢用C++,而且用的特别好。我这次推荐一个开源的C++项目,希望喜欢C++,或者想往C++方向发展的同学可以看看。

面向过程一定是偏向底层的,面向对象一定是偏向应用的,别杠!

下面介绍下这个C++开源项目

项目名称: Workflow

项目地址:https://github.com/sogou/workflow

这个项目适合用于什么场景

这个项目是搜狗的服务器引擎,几乎搜狗所有的后端C++服务和其他几十家公司都在使用这个引擎,每日处理超百亿请求。

不仅如此,该项目绝对也非常适合在嵌入式应用上实现网络的框架设计,框架设计是一个项目成功与否非常重要的环节,而网络在AIOT、智能家居、智能硬件上尤其重要。

比如我们在项目中需要使用http,Workflow在设计上可以通过Cmake配置支持windows 或者 Linux 或 MacOS 等多个平台上的多个项目编译,而且,在不同平台上保持相同的接口。

如果你新增一个嵌入式设备,比如ESP32,在服务器和客户端,你只需要维护一套代码,就可以完成自己的应用需求。

真正做到把云端的技术移植到嵌入式设备上运行。

适用于嵌入式几大特点

1. ⽀持多平台、多体系结构

多平台是⼀个⾮常重要的特性,多平台的代码说明在配置和耦合上考虑了很多设计上的细节。⽬前Workflow除了Linux、Windows、MacOS、Android以外,还可以愉快地在树莓派、国产⻰芯处理器等不同体系结构上运⾏。

2. 编译快

Workflow除OpenSSL以外不依赖其他库,⽽且在接⼝层是没有模版的,因此编译速度⾮常快,不到⼀分钟即可编出⼀个可⽤的lib。

3. 体积⼩、⽀持编译裁剪

Workflow的Kafka协议默认是不编译的,除此之外,还可以裁剪掉其他不常⽤的模块。

⽐如:

make REDIS=n MYSQL=n UPSTREAM=n

并且可以通过strip命令去掉符号链接,即可让库⽂件缩⼩到400k左右。

4. 运⾏时内存⼩、调度快

作为⼀个异步调度的库,Workflow调度性能⼀直是⾮常好的。另外运⾏时内存占⽤也⾮常的⼩。

在默认配置下,tutorial 下的 helloworld server 服务占用内存大小测试

运行服务

查找进程号

查看内存占用,物理内存占用在3824kb

5. ⾃定义协议⾮常⽅便

另外,社区活跃以及项目负责人积极回复问题我觉得也是一个亮点,如果在框架搭建和移植上出现问题,在社区上提问都会得到快速响应。

细说编译与自定义协议

开源应该是我推荐最主要的原因,还有一个原因是,这个项目非常适合在一些大型的嵌入式项目中使用。

我之前创业,在通讯协议上花了很长的时间,如果当时发现这个项目,我觉得套用这个框架,可能会轻松很多。这个项目使用Cmakefile来配置,之前发的Cmakefile文档我觉得也是对大家有用的。

嵌入式杂谈之makefile补充

Cmake确实应该用到的时候再学

我当时创业的项目就是存在很多客户端,然后嵌入式客户端会和服务器进行交互数据。因为这个原因,我们就自己定义协议,并在我们自己的协议上做了很多规避措施,当然,这些措施都没有经过时间的捶打。

但Workflow的这个⾃定义协议的例⼦,直接在教程⾥就给出了,感兴趣的朋友可以下载完后

通过以下命令,即可编译出⼀个⾃定义协议的server和client:

make
cd tutorial
make
./tutorial-10-user_defined_protocol/server

另⼀个窗⼝执⾏client,即可通信:

./tutorial-10-user_defined_protocol/client

执行过程:

移植到嵌入式设备的开源支持

据悉⽬前已经有许多⽤户⽤到了嵌⼊式上了。我到github上翻阅发现,遇到问题的时候,官方还特别耐心的解释,真的很不错,这才是做技术该有的样子嘛~

项目的例程

官方给的实例比较多,新手的同学建议都看看,从这些东西入手会让自己更快进入状态。

一个简单的Client 和 Server 端的代码

服务端:

#include <stdio.h>
#include "workflow/WFHttpServer.h"int main() {WFHttpServer server([](WFHttpTask *task) {task->get_resp()->append_output_body("Hello World!");});if (server.start(8888) == 0) { // start server on port 8888getchar(); // press "Enter" to end.server.stop();}return 0;
}

客户端:

int main(int argc, char *argv[]) {WFMySQLTask *task = WFTaskFactory::create_mysql_task(url, RETRY_MAX, mysql_callback);task->get_req()->set_query("SHOW TABLES;");task->start();
}

任务流框架设计

在作者的设计理念中,一切业务逻辑皆是任务,多个任务会组成任务流,任务流可组成图,这个图可能是串联图,可能是并联图,也有可能是串并联图,类似于这种:

也有可能是这种复杂的DAG图:

当然图的层次结构可由用户自定义,个人认为框架最牛逼的一点就是支持动态创建任务流。

这个项目大概就介绍到这里

再说下这个项目的资料汇总

参考资料:

https://zhuanlan.zhihu.com/p/358869362

https://zhuanlan.zhihu.com/p/165638263

项目地址如下:


https://github.com/sogou/workflow 也可以点击阅读原文直达。

在访问GitHub遇到困难时,可使用他们的Gitee官方仓库:

https://gitee.com/sogou/workflow

感觉这个项目值得学习的话就给人家个star,不要白嫖哈,对项目团队来说也是一种认可和鼓励。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几段失败的代码

1、下面一段代码将注释和代码混在了一起&#xff0c;不认真看还真不知道。高亮显示后&#xff1a;2、看到这种多层嵌套恶心到头大。3、据说某俄国特工经过九死一生偷到了NASA的太空火箭发射程序的源代码的最后一页&#xff0c;代码是&#xff1a;)))))))))))))))))))))))))))))…

java 发送邮件添加附件_java邮件自动发送时添加网络附件

查了很多资料都是使用本地资源作为附件发送。但是数据和程序分开时&#xff0c;还需要先下载数据&#xff0c;保存到本地再发送邮件。查了很多资料后&#xff0c;发现apach提供了很好的一个commons-mail.jar包&#xff0c;做了很好的封装&#xff0c;简单易用。下载地址是http:…

Excel 取消Internet及网络路径自动替换为超链接

Excel 取消Internet及网络路径自动替换为超链接&#xff1a; 1.文件 》选项 》校对 点击自动更正选项 2. 自动更正 配置修改 点击“键入时自动套用格式”tab页&#xff0c;取消勾选 internet及网络路径替换为超链接 转载于:https://www.cnblogs.com/byronliu029/p/9408468.htm…

那些喝吐的酒~

酒逢知己千杯少我喝不了酒&#xff0c;但是高兴的时候也能喝两杯。入职腾讯&#xff0c;参加了两次部门聚会&#xff0c;都离不开喝酒&#xff0c;吃饭喝酒这事&#xff0c;大家都很开心&#xff0c;那种眼前朦胧&#xff0c;胆子很肥的感觉特别好。领导们也很给面子&#xff0…

实时内核(Core)和实时操作系统(RTOS)有何不同?

大家都知道什么是实时操作系统&#xff0c;但是&#xff0c;大家熟知的实时操作系统&#xff0c;站在更广的角度来看&#xff0c;其实它就是一个实时内核。一、实时内核和实时操作系统一个实时内核是管理微处理器&#xff08;MPU&#xff09;、微控制器&#xff08;MCU&#xf…

linux java远程调试_idea远程linux代码调试

如果线上代码出现问题&#xff0c;如何用本地idea排查问题查找问题&#xff1f;第一步&#xff1a;保证本地代码与线上代码一致&#xff1b;第二步&#xff1a;在线上tomcat文件中/tomcat/bin/catalina.sh文件中添加如下配置找到下面一行信息#----- Execute The Requested Comm…

[文档]. Xilinx - 编写有效的Testbenches

This application note is written for logic designers who are new to HDL verification flows, and who do not have extensive testbench-writing experience. 下载

mysql inner join where_详解mysql 使用left join添加where条件的问题分析

当前需求&#xff1a;有group和factor两张表&#xff0c;一个group对应多个factor&#xff0c;现在想查询有效的group和对应的有效的factor&#xff0c;两个表都有isDel逻辑删除标志。最开始的错误写法一&#xff1a;SELECT g.*,f.* FROM groups g LEFT JOIN factor f ON f.gro…

误打误撞的模板字符串

前情回顾&#xff1a;之所以用到模板字符串呢&#xff0c;是在这样一个场景中用到一个类似微信发朋友圈时选择图片时的一个场景&#xff0c;如图所示 当时脑抽是怎么想的呢&#xff0c;其实也很简单&#xff0c;当时想的就是新建div嘛&#xff0c;然后append到父容器就ok啦&…

java类型转换方法_Java中基本数据类型转换的方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼一、自动类型转换(隐式类型转换)整型、实型(常量)、字符型数据可以混合运算。运算中&#xff0c;不同类型的数据先转化为同一类型&#xff0c;然后进行运算。转换从低级到高级。自动转换有以下规律&#xff1a;小的类型自动转化为大…

你知道GNU C 对C语言的扩展吗?

为了方便使用&#xff0c;GNU C在标准C语言的基础上进行了部分方便开发的扩展。这里讲解一些开发中可能会用到的&#xff0c;或者使用频率比较高的内容。零长度数组和变量长度数组GNU C 允许使用零长度数组&#xff0c;比如&#xff1a;char data[0];GNU C 允许使用一个变量定义…

java 反射 内存_Java内存到反射入门

Java内存到反射入门(一)初识Java内存平常我们最常提到的的JAVA分区是这三个分区其中方法区是一个特殊的堆&#xff0c;功能如图上所示。初识反射&#xff1a;框架设计的灵魂反射的功能&#xff1a;将类的各个组成部分封装为对象&#xff0c;并在程序运行的过程中可以调用它们。…

stopping hbasecat: /tmp/hbase-elastic-master.pid: 没有那个文件或目录

stop-hbase.sh 挂了。。。 原因其实也简单&#xff0c;默认情况下hbase的pid文件保存在/tmp目录下&#xff0c;/tmp目录下的文件很容易丢失&#xff0c;不知道为什么他不会自动创建一个非临时目录&#xff0c;大概是因为权限不好控制&#xff0c;需要手动来&#xff1f; 修改为…

服务容错模式

0.背景 随着服务框架和服务治理体系的逐步成熟&#xff0c;服务化已成为系统设计的趋势。随着业务复杂度的增加&#xff0c;依赖的服务也逐步增加&#xff0c;出现了不少由于服务调用出现异常问题而导致的重大事故&#xff0c;如&#xff1a; 1&#xff09;系统依赖的某个服务发…

从大学到结婚,我和小云的这13年

看了龙哥的文章&#xff0c;感触很深&#xff0c;我有好几次想写一篇我和小云的文章&#xff0c;记录下自己和小云这些年一起经历的很多事情&#xff0c;但是每每都停下来去做了觉得更重要的其他事情&#xff0c;这次真的决定要写了。我和小云是大学同学&#xff0c;我们大一认…

xshell如何运行java_利用Xshell往应用服务器上部署项目

1.首先查询中间件的进程Idps -ef|grep ./startapusic2.然后杀掉进程kill -9 16833.再次查询进程&#xff0c;查看是否关闭成功&#xff0c;如果没有/bin目录下的东西了说明关闭成功4.利用ls查看当前路径下的文件5.启动中间件./startapusic6.如果显示地址已在使用&#xff0c;则…

详解Linux内核在arm上的启动过程

Linux内核加载过程通常&#xff0c;Linux内核都是经过gzip加载过之后的映像文件。bootloader复制压缩内核到内存空间。内核自解压。运行内核。编译完成的Linux内核存放在哪里&#xff1f;./vmlinux elf格式未压缩内核。arch/arm/boot/compressed/vmlinux 压缩以后的elf格…

java 数据库 properties_原生Java读取properties连接数据库

将数据库的驱动、url、用户名、密码等信息以键值对的形式存放在properties文件中&#xff0c;工具类初始化时从配置文件中读取所要连接数据库的信息。当需要更改连接的数据库时&#xff0c;只需要更改配置文件即可&#xff0c;而不必改写工具类的代码。1.在项目中创建一个prope…

【谱聚类算法总结】

前言&#xff1a;以前只是调用过谱聚类算法&#xff0c;我也不懂为什么各家公司都问我一做文字检测的这个算法具体咋整的&#xff0c;没整明白还给我挂了哇擦嘞&#xff1f;讯飞还以这个理由刷本宝&#xff0c;今天一怒把它给整吧清楚了&#xff0c;下次谁再问来&#xff01;说…

嵌入式的汉字原来是这样显示的?

摘要&#xff1a;LCD是嵌入式常见设备&#xff0c;如何在LCD上显示汉字和英文&#xff1f;矢量字体和点阵字体有何不同&#xff1f;同一个字符为何有多种编码&#xff1f;GB2312、GB18030指什么&#xff1f;他们之间有关系吗&#xff1f;嵌入式设备如何支持多国语言&#xff1f…