在来腾讯之前,我是没有真正用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,不要白嫖哈,对项目团队来说也是一种认可和鼓励。

适合嵌入式的C++开源项目-Workflow相关推荐

  1. 如何打造规范的开源项目workflow

    前言 一般开源项目正常的开发流程是: 初始阶段 创建仓库 git clone repository 到本地 添加修改代码 提交commit message push到 github 仓库 迭代阶段 切 ...

  2. 适合初学者的安卓开源项目_开源世界中初学者的颠簸之旅

    适合初学者的安卓开源项目 by Shubheksha 通过Shubheksha 开源世界中初学者的颠簸之旅 (A Beginner's Very Bumpy Journey Through The W ...

  3. 适合初学者的安卓开源项目_开源初学者的6个起点

    适合初学者的安卓开源项目 Opensource.com几个月前问读者: 参与开源的最大障碍是什么? 来自56%的民意测验者的回答是他们不确定从哪里开始. 而且,有13%的人表示不愿意加入. 如果您有相 ...

  4. 适合初学者的安卓开源项目_开源系列的初学者将从下周开始

    适合初学者的安卓开源项目 下周,Opensource.com将开始发布有关"从入门到开源"的系列文章. 这一系列文章将作为一种资源存在 ,任何人都可以随时访问以了解更多关于在任何位 ...

  5. 适合初学者的安卓开源项目_开源周初学者

    适合初学者的安卓开源项目 Opensource.com将发布文章,重点介绍从2月17日至28日对于初学者可以从开源开始的地方. 这些故事将包括在开源公司工作,在开源软件上工作以及构建开源应用程序的初次 ...

  6. python3项目源代码下载_GitHub 上适合新手的 Python 开源项目

    剧照:<隐秘而伟大> 作者:卤蛋 来源:HelloGithub 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那 ...

  7. java web开源项目源码_适合Java新手的开源项目集合——在 GitHub 学编程

    作者:HelloGitHub-老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是瘦 ...

  8. [转]Git,SVN的优缺点及适合的范围,开源项目?公司项目?

    使用git不久,粗浅理解: 1)适用对象不同.Git适用于参与开源项目的开发者.他们由于水平高,更在乎的是效率而不是易用性.Svn则不同,它适合普通的公司开发团队.使用起来更加容易. 2)使用的场合不 ...

  9. 搜狗开源项目workflow 综述

    2021SC@SDUSC 项目分工 我负责了解workflow如何实现服务寻址,远程过程调用中包含三个角色的节点分别是服务调用方.服务提供方.注册中心,可靠的服务寻址方式主要是为了提供服务的发现,是R ...

最新文章

  1. 【 MATLAB 】DFS 和 DTFT 之间的关系
  2. Gartner:大数据投资增长,但计划投资的组织机构却在减少
  3. 与老外交谈的常用句子
  4. JAVA之获取JavaSwing复选框JCheckBox选中的值(内容)
  5. Tensorflow官方文档---起步 MNIST示例
  6. Nancy跨平台开发总结(三)发布到Jexus Web服务器
  7. ios更改UITabBarController背景以及选中背景图片的方法
  8. 【Python3网络爬虫开发实战】3.1.2-处理异常
  9. 为什么5G标准制定,非得“你死我活”?
  10. Oracle数据库中文乱码问题解决
  11. java io流不关闭_Java IO流关闭问题的深入研究
  12. Sublime Text 使用记录汇总
  13. paip.终端服务器超出了最大允许连接数的解决
  14. 图像入门——2. 数字图像发展历史与图像处理概述
  15. CSkin相当优秀的C#/.Net Winform界面库
  16. Tplink路由器配置页面IP地址_tplogin.cn页面IP地址_TpLink易展版LAN口地址获取_如何获得tplogin.cn的IP地址_获取易展版TPLinkWIFI6路由器的配置地址方法
  17. 康师傅被“水和面”糊住了眼睛?
  18. select苹果手机样式设置
  19. 错误:安装autocad2012的时候提示Command line option syntax error.Type Command/?for help.
  20. 托福高频真词List08 // 附托福TPO阅读真题

热门文章

  1. 服务器国产自研芯片,国产自研芯片新期间 龙芯A4000评测
  2. FFMPEG在Windows下使用Movie滤镜读取文件失败问题
  3. ironpython2.7.9_ironpython下载-ironpython软件v2.7.9 免费版下载-6188手游网
  4. python统计英文文章中单词出现的次数并排序_python,_关于统计某一个 单词 在 文本中 出现的次数,python - phpStudy...
  5. c++初级-卡牌游戏 IV
  6. 【JavaScript面试专题】经典JS面试题详解!
  7. 每次打开office都需要自动配置怎么办?
  8. 大模型:深度学习领域的“巨无霸”
  9. 1678 GG's Single Day
  10. ERP BI和报表的区别