C++异步web框架drogon使用探究
简介
Drogon是一个基于C++17/20的Http应用框架,使用Drogon可以方便的使用C++构建各种类型的Web应用服务端程序。Drogon是作者非常喜欢的美剧《权力的游戏》中的一条龙的名字(汉译作卓耿),和龙有关但并不是dragon的误写,为了不至于引起不必要的误会这里说明一下。
Drogon是一个跨平台框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。它的主要特点如下:
- 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的非阻塞IO框架,提供高并发、高性能的网络IO。
- 全异步编程模式;
- 支持Http1.0/1.1(server端和client端);
- 基于template实现了简单的反射机制,使主程序框架、控制器(controller)和视图(view)完全解耦;
- 支持cookies和内建的session;
- 支持后端渲染,把控制器生成的数据交给视图生成Html页面,视图由CSP模板文件描述,通过CSP标签把C++代码嵌入到Html页面,由drogon的命令行工具在编译阶段自动生成C++代码并编译;
支持运行期的视图页面动态加载(动态编译和加载so文件); - 非常方便灵活的路径(path)到控制器处理函数(handler)的映射方案;
- 支持过滤器(filter)链,方便在控制器之前执行统一的逻辑(如登录验证、Http Method约束验证等);
- 支持https(基于OpenSSL实现);
- 支持websocket(server端和client端);
- 支持Json格式请求和应答, 对Restful API应用开发非常友好;
- 支持文件下载和上传,支持sendfile系统调用;
- 支持gzip/brotli压缩传输;
- 支持pipelining;
- 提供一个轻量的命令行工具drogon_ctl,帮助简化各种类的创建和视图代码的生成过程;
- 基于非阻塞IO实现的异步数据库读写,目前支持PostgreSQL和MySQL(MariaDB)数据库;
- 基于线程池实现sqlite3数据库的异步读写,提供与上文数据库相同的接口;
- 支持Redis异步读写;
- 支持ARM架构;
- 方便的轻量级ORM实现,支持常规的对象到数据库的双向映射操作;
- 支持插件,可通过配置文件在加载期动态拆装;
- 支持内建插入点的AOP
- 支持C++协程
关于子模块
该项目还包含了一个日志子模块,也就是说它把日志也集成进了框架中。
Ubuntu安装
安装方式
为了获取最新的特性,我们使用源码编译的方式安装
依赖库
除了最基本的编译套件,它还依赖于jsoncpp
,ssl
等第三方库
安装命令
1 | 安装依赖 |
简单测试程序
我们可以简单地在main()
函数中注册路由和创建服务器程序
1 |
|
效果如下
但是,这并不适用于复杂的应用,试想假如有数十个或者数百个处理函数要注册进框架,main()函数将膨胀到不可读的程度。显然,让每个包含处理函数的类在自己的定义中完成注册是更好的选择。所以,除非你的应用逻辑非常简单,我们不推荐使用上述接口,更好的实践是,我们可以创建一个HttpSimpleController对象,我们使用命令行工具drogon_ctl命令创建控制器类,这样开发者只需要关心如何填入业务代码即可
认识 drogon_ctl
创建项目
1
2
3
4
5创建新项目(默认创建CMake项目)
drogon_ctl create project 项目名
创建简单项目(无CMake)
drogon_ctl create simple 项目名创建三种控制器
1
2
3
4
5
6
7
8创建HTTP控制器
drogon_ctl create controller 控制器名
创建WebSocket控制器
drogon_ctl create controller -w 控制器名
创建RESTful API控制器
drogon_ctl create controller -r 资源名创建orm模型
1
2从数据库生成ORM模型
drogon_ctl create model 表名 -f 数据库配置.json配置文件示例
1
2
3
4
5
6
7
8
9# 示例数据库配置:
{
"dbname": "test",
"host": "127.0.0.1",
"port": 5432,
"user": "postgres",
"passwd": "123456",
"tables": ["users", "posts"]
}插件管理
1
2
3
4
5创建插件
drogon_ctl create plugin 插件名
安装插件模板
drogon_ctl install 插件名视图模版
1
2
3
4
5创建CSP模板
drogon_ctl create view 模板名.csp
创建Jade模板
drogon_ctl create view -t jade 模板名.jade其它功能
1
2
3
4
5
6
7
8压力测试(需先安装wrk)
drogon_ctl benchmark http://localhost:8080/api -t 10s -c 100
配置文件校验
drogon_ctl config check config.json
生成API文档
drogon_ctl create docs -o ./docs
封装控制器类
因为我们只是简单的测试,所以我们不使用drogon_ctl
创建项目,而是简单的自己编写一个CMakeLists.txt
然后我们使用命令行工具drogon_ctl命令创建控制器类,这样开发者只需要关心如何填入业务代码即可
1 | mkdir controllers |
然后写入业务代码,特别的,我们只需要在SupCtr
内注册路由和业务函数即可
main.cpp
1 |
|
controllers/SupCtr.h
1 |
|
controllers/SupCtr.cpp
1 |
|