服务器之家

服务器之家 > 正文

Drogon - 真正现代化的 C++ 网络服务框架

时间:2021-03-19 01:13     来源/作者:今日头条

C++ 是最重要的编程语言之一。它既可以进行、过程化程序设计,又可以进行使用抽象数据类型的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

然而,由于标准库和社区生态的种种问题,C++ 在 Web 服务端的发展并不如人意。同时,C++ 的服务端框架与其他语言相比,往往更为原始,对各种高级功能的支持更繁琐。C++ 14/17 为这门语言提供了更多优秀的特性,使得实现一个更为现代化的 Web 框架成为可能。

简介

 

Drogon,是 an-tao 在 Github 上开源的基于 C++ 14/17 的 Http 应用框架,目前版本为 v1.4.1。

Drogon是一个跨平台框架,可以方便地使用 C++ 构建各种类型的 Web 应用服务端程序。其网络层使用基于 epoll,使用全异步编程模式;实现了简单的反射机制,支持后端渲染,支持运行期的视图页面动态加载;支持过滤器链,支持 websocket,支持pipelining,······

使用

 

Drogon 依赖 trantor,一个非阻塞的 IO 库,以及 jsoncpp、libuuid 和 zlib 等。Drogon 使用 CMake + Make 编译安装:

cd $WORK_PATH 

git clone https://github.com/an-tao/drogon 

cd drogon 

git submodule update --init 

mkdir build 

cd build 

cmake .. 

make && sudo make install 

也可以在项目中直接使用 Drogon 源码,在项目的 cmake 文件中添加:

add_subdirectory(third_party/drogon) 

arget_link_libraries(${PROJECT_NAME} PRIVATE drogon) 

安装完成后,就可以开始用 Drogon 来编写 Web 服务应用了。我们来看一个简单的主程序:

#include <drogon/drogon.h> 

 

using namespace drogon; 

 

int main() 

    app().setLogPath("./"

         .setLogLevel(trantor::Logger::kWarn) 

         .addListener("0.0.0.0", 80) 

         .setThreadNum(16) 

         .enableRunAsDaemon() 

         .run(); 

通过链式配置生成一个应用实例,设置日志路径和级别,监听 0.0.0.0:80,使用 16 个线程,并在后台运行。编译运行,我们就能得到一个 HTTP 服务了。

Drogon 使用配置化的思想,可以通过直接加载配置文件来完成服务器的配置:

app().loadConfigFile("./config.json").run(); 

有了 HTTP 服务,我们就要编写处理函数来进行逻辑处理。我们编写一个简单的控制器:

#include <drogon/HttpSimpleController.h> 

using namespace drogon; 

class TestCtrl : public drogon::HttpSimpleController<TestCtrl> 

public

    virtual void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override; 

    PATH_LIST_BEGIN 

    PATH_ADD("/test",Get); 

    PATH_LIST_END 

}; 

这个控制器继承了 HttpSimpleController,提供了 asyncHandleHttpRequest 来实现处理逻辑,并注册到路径 /test 上。然后,我们实现这个处理函数:

void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr& req, 

                                      std::function<void (const HttpResponsePtr &)> &&callback) 

    //write your application logic here 

    auto resp = HttpResponse::newHttpResponse(); 

    resp->setBody("<p>Hello, world!</p>"); 

    resp->setExpiredTime(0); 

    callback(resp); 

这个处理函数新建了一个响应,设置内容为 Hello World 的 HTML,并设置过期时间。最后,使用回调返回 HTTP 响应。这样,我们就得到了一个简单的 Hello World 服务。

我们还可以很简单地实现一个 RESTful API 的例子:

class User : public drogon::HttpController<User

  public

    METHOD_LIST_BEGIN 

    //use METHOD_ADD to add your custom processing function here; 

    METHOD_ADD(User::getInfo, "/{id}", Get);                  //path is /api/v1/User/{arg1} 

    METHOD_ADD(User::getDetailInfo, "/{id}/detailinfo", Get);  //path is /api/v1/User/{arg1}/detailinfo 

    METHOD_ADD(User::newUser, "/{name}", Post);                 //path is /api/v1/User/{arg1} 

    METHOD_LIST_END 

    ... 

总结

 

Drogon 功能强大,把大量的底层实现进行了封装和抽象,使得开发者能够十分方便地调用各种功能,集中于业务逻辑的实现。

Drogon 的设计,对齐的是其他高级语言的现代的 Web 框架,把配置化、动态化、自动化和解耦的思想充分应用其中,还提供了轻量级的 ORM、模板引擎和命令行工具,可以说是一个十分全面的 Web 框架。

原文地址:https://www.toutiao.com/a6939871010456175140/

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部

1150
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40