Drogon源码剖析

文章介绍了Drogon,一个支持多种操作系统且注重性能的C++HTTP应用程序框架,其特点包括非阻塞IO、异步编程、内置session、数据库支持和docker部署。详细讲解了框架结构、搭建过程和关键类的功能。

一、Drogon介绍

Drogon是一个基于C++的跨平台HTTP应用程序框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。项目地址:https://github.com/drogonframework/drogon

它的主要特点如下:

  • 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的非阻塞IO框架,提供高并发、高性能的网络IO。详细请见TFB Tests Results
  • 全异步编程模式;(本项目使用C++20协程实现异步编程;.NET异步编程模式 | Microsoft Learn):网络处理、请求处理、I/O处理、日志处理均是异步。
  • 支持Http1.0/1.1(server端和client端);
  • 基于template实现了简单的反射机制,使主程序框架、控制器(controller)和视图(view)完全解耦;(C++ 反射机制的简单实现 - 旭东的博客 - 博客园 (cnblogs.com)
  • 支持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++协程

二、搭建项目

        在Ubuntu22环境下使用docker搭建drogon。

代码拉取

如已将代码从github clone到了目录/mnt/hgfs/github/下

git clone https://github.com/drogonframework/drogon

06-08
### Drogon C++ Web框架使用说明 Drogon 是一个基于 C++14/17/20 的高性能 HTTP Web 应用框架,旨在通过 C++ 语言轻松构建各种类型的 Web 应用服务器程序[^2]。它支持跨平台开发,并兼容多种操作系统,包括 Linux、macOS、FreeBSD、OpenBSD、HaikuOS 和 Windows 等。 #### 示例代码:基本应用启动 以下是一个简单的 Drogon 框架示例代码,展示如何设置监听端口、添加路由并启动应用程序: ```cpp #include <drogon/drogon.h> int main() { // 设置监听端口 drogon::app().addListener("0.0.0.0", 8080); // 添加路由 drogon::app().registerHandler("/", [](const drogon::HttpRequestPtr& req, std::function<void (const drogon::HttpResponsePtr &)> &&callback) { auto resp = drogon::HttpResponse::newHttpResponse(); resp->setBody("Hello, World!"); callback(resp); }); // 启动应用 drogon::app().run(); return 0; } ``` 上述代码展示了如何创建一个简单的 Web 服务器,监听 `0.0.0.0` 地址的 `8080` 端口,并为根路径 `/` 提供了一个返回 "Hello, World!" 的处理函数[^1]。 #### 使用配置文件简化项目 如果需要进一步简化项目配置,可以通过加载 JSON 配置文件的方式实现。例如: ```cpp #include <drogon/drogon.h> int main() { drogon::app().loadConfigFile("./config.json").run(); } ``` 在该示例中,所有配置项(如监听端口、线程数等)都可以通过 `config.json` 文件进行管理[^3]。 #### 示例代码:用户登录功能 Drogon 提供了对 RESTful API 的原生支持,以下是一个用户登录功能的示例代码: ```cpp #pragma once #include <drogon/HttpController.h> using namespace drogon; namespace china { namespace guangdong { class User : public drogon::HttpController<User> { public: METHOD_LIST_BEGIN METHOD_ADD(User::login, "/token?userId={1}&passwd={2}", Post); METHOD_ADD(User::getInfo, "/{1}/info?token={2}", Get); METHOD_LIST_END void login(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback, std::string&& userId, const std::string& password); void getInfo(const HttpRequestPtr& req, std::function<void(const HttpResponsePtr&)>&& callback, std::string userId, const std::string& token) const; }; } // namespace guangdong } // namespace china ``` 此代码定义了一个 `User` 类,继承自 `drogon::HttpController`,并通过 `METHOD_ADD` 宏注册了两个路由方法:`login` 和 `getInfo`。分别用于用户登录和获取用户信息[^5]。 #### 高级配置选项 在实际项目中,可能需要对日志路径、日志级别、线程数等进行更精细的配置。以下是一个包含高级配置的示例: ```cpp #include <drogon/drogon.h> int main() { drogon::app() .setLogPath("./") .setLogLevel(trantor::Logger::kWarn) .addListener("0.0.0.0", 80) .setThreadNum(16) .enableRunAsDaemon() .run(); } ``` 此代码片段展示了如何设置日志路径、日志级别、监听地址和端口、线程数,并启用守护进程模式运行[^4]。 ### 总结 Drogon 框架提供了简单易用的接口,支持从基础到高级的各种配置选项。无论是简单的 Hello World 示例,还是复杂的用户登录系统,都可以通过 Drogon 快速实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weisonx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值