Tasty是使用Modern C++(11/14/17)
开发的网络服务框架,脱胎于TinyAndPretty,它秉持简单、易用、可扩展易开发的原则,帮助你快速构建可靠的C++
后台服务。
别急,正在维护....
TAP主体采用微核架构(microkernel architecture)
,又称为"插件架构"(plug-in architecture)
。TAP Center Manager(TAP中枢管理员)会负责系统整体的初始化、子管理员(plugins)的协调与调度,主要功能和业务逻辑都通过插件实现。
- 良好的功能延伸性
(extensibility)
,需要什么功能,开发一个插件即可. - 功能之间是隔离的,插件可以独立的加载和卸载,使得它比较容易部署.
- 可定制性高,适应不同的开发需要
- 可以渐进式地开发,逐步增加功能
移植了Kconfig
系统,在纯命令行环境下也有对人类友好的配置体验,可视化界面充分展示系统的所有参数细节。
依托Linux
系统高效的Epoll
功能和C++17
强大的泛型支持,本框架中的Event Pool
支持了事件管道级别的抽象,将数据挂载和文件描述符监听结合起来,同时配合timer fd
完成了纳米级定时事件的处理。
这一模型中,TAP Center Manager
充当了总线功能,通过对插件的预设模块魔数进行判断完成调度。Timer Manager
也被纳入这一框架中,通过TimeLine
这一数据结构完成虚拟时间和现实时间的转换,省去了线程轮询的过程极大提高了CPU使用率。
本框架支持了HTTP
GET、POST、multipart/form-data、Static Resource等常见请求形式,并在此基础上实现了COMET
长连接服务的支持,使得在懂得都懂的情况下的服务器获得了主动向客户端推送广播的能力。
同时基于Modern C++
的现代语言功能,框架推荐支持std::filesystem
和 std::chrono
等在内的现代库,充分使用std::tuple
、std::initialize_list
和结构化绑定联动的方式,简化了大量的操作流程,配置HTTP
服务变得人性化,这一点在实际的线上项目开发中得到了检验。
同时HTTP
响应服务支持了字符串类型的HttpResponse
、经由sendfile()
优化过的FileResponse
、自主开发的JsonResponse
。充分考虑多种常见实际业务情况。
本项目在启动初期就把超好用的并发服务的作为重要目标之一。为此移植了简洁好用的Thread Pool
,同时使用了RAII
风格的std::unique_lock
/std::shared_lock
操作std::shared_mutex
等锁。整体高效可食用。
多半咕咕,没有未来- 分布式支持
Linux
下自有网络协议栈WebSocket
和HTTP/2
的支持- 协程方向的优化
- 完成日志库的开发
BUG FREE
在项目文件夹根目录下使用如下指令,可快速使用相应功能。
- i . 编译全部工程.
$ make
- ii . 编译并运行。
$ make run
- iii . 清除
build
编译文件夹。disrclean
可清除menuconfig
生成的配置文件。
$ make (dist)?clean
- iv . 启动菜单配置,调整程序运行参数
$ make menuconfig
- v . 添加参数
MODS
可仅使选择的模块编译到工程中。
$ make MODS="module1 module2" (run)?
- vi. 添加参数
MAINARGS
可添加运行时命令行参数到main()
函数中。
$ make MAINARGS="sql.db" run
- vii. 多线程编译,加快编译速度。如
-j2
双线程编译
$ make -j(\d*)
src/
目录下的每一个文件夹为一个独立的模块,脚本将自动检测该目录下 的子文件夹并进行编译链接。
- i . 请在
include
文件夹下创建$(MODULE_NAME)
子目录,用于存放该模块的头文件(即接口) - ii . 在该文件夹下定义
interface.h
文件,标识为该模块的调用接口。如若对该模块进行调用,请在代码中进行如下引用
#include <$(MODULE_NAME)/interface.h>
- iii . 在
include/router.conf
中配置路由信息 - iii . 创建
src/$(MODULE_NAME)
子目录,并再次实现模块功能。 - vi . 在
scripts
文件夹下存放对应的文档(可选)。