• Drogon源码剖析


    一、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

    构建docker镜像

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# ls

    Dockerfile

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# vi Dockerfile

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# docker build --tag drogon .

    Sending build context to Docker daemon   2.56kB

    Step 1/10 : FROM ubuntu:20.04

    20.04: Pulling from library/ubuntu

    查看生成的镜像

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# docker images

    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE

    drogon       latest    84006ea67fa9   11 minutes ago   1.19GB

               22fb4b219009   23 minutes ago   72.8MB

    ubuntu       20.04     d5447fc01ae6   5 weeks ago      72.8MB

    运行容器

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# docker run -idt drogon /bin/bash

    84607cd8e44ddc84a9f5449e562cac137fc1b0e24b53b3aa7bcd0f6566e33c2b

    进入容器

    root@weisonxs:/mnt/hgfs/github/drogon/docker/ubuntu# docker attach 84607cd8e44ddc84a9f5449e562cac137fc1b0e24b53b3aa7bcd

    root@84607cd8e44d:/install/drogon# ls0f6566e33c2b

    构建安装drogon

    root@84607cd8e44d:/install/drogon# ./build.sh

    运行实例

    build目录下examples

    虚拟机配置成了静态ip,所用的dns是通用的,所以下载github的东西可能解析地址不了——先切换回dhcp,下载完再切回来

    三、 源码包结构与功能

    cmake

    cmake配置

    docker

    docker配置文件

    drogon_ctl

    drogon命令工具

    examples

    实例

    lib

    drogon库,有关drogon的框架实现源文件和头文件都在这里

    nosql_lib

    非关系型数据库

    ormlib

    ORM(对象关系映射)库

    third_party

    第三方组件

    trantor

    C++高性能网络库

    build.sh

    构建drogon脚本

    CmakeLists.txt

    生成整个项目的cmake文件

    conanfile.txt

    项目依赖项列表

    四、核心类

    基类(抽象类)

    派生的类(实现类)

    功能

    继承的类

    HttpAppFramework

    HttpAppFrameworkImpl

    整个程序框架的入口

    NonCopyable

    HttpClient

    HttpClientImpl

    Http客户,与服务器建立持久的连接

    NonCopyable

    HttpController

    HTTP控制器的反射基类模板

    DrObject<T>,

    HttpControllerBase

    HttpSimpleController

    简单HTTP控制器的反射基类模板

    DrObject<T>,

    HttpControllerBase

    辅助类

    功能

    trantor/

    EventLoop

    运行在某个特定线程上的一个事件循环

    InetAddress

    sockaddr_in的封装器。是一个POD接口类

    Date

    时间点类

    Logger

    实现日志功能

    CacheMap

    缓存映射工具类

    Multipart.h

    (单个请求中)传输多个部分数据处理(上传文件或二进制数据)

    Cookie

    cookie类

    Session

    session类

    IOThreadStorage

    线程存储处理工具类

    UploadFile

    这个类表示一个上传文件,它将通过multipart/form-data格式传输到服务器

    Dbclient

    utils/

    Utilities.h

    各种工具类头文件

    plugins/

    Plugin

    插件的反射基类

    SecureSSLRedirector

    将所有非HTTPS请求重定向到HTTPS请求的插件(除了ssl_redirect_exempt中所定义的URL)

    AccessLogger

    打印所有请求到日志的插件

    RealIpResolver

    从HTTP请求中解析客户真实IP的插件

    管理类

    功能

    StaticFileRouter

    静态文件路由器

    HttpControllersRouter

    Http控制器路由器

    HttpSimpleControllersRouter

    Http简单控制器路由器

    WebsocketControllersRouter

    Websocket控制器路由器

    ListenerManager

    监听管理器

    PluginsManager

    插件管理器

    DbClientManager

    数据库管理器

    RedisClientManager

    Redis客户端管理器

    五、细探trantor 

    六、细探 drogon

  • 相关阅读:
    Android程序设计之学生考勤管理系统
    MAC和PHY的关系
    Nginx -- SSL模块
    Git 小白入门到进阶—(基本概念和常用命令)
    【STM32】标准库的引入
    oracle 自定义函数(非常简单明了)
    竞赛题-6254. 划分技能点相等的团队
    秋招每日一题T10——峰会
    C++ 性能优化指南 KurtGuntheroth 第2章 影响优化的计算机行为
    智安网络|数据库入门秘籍:通俗易懂,轻松掌握与实践
  • 原文地址:https://blog.csdn.net/weison_x/article/details/134271929