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

<none>       <none>    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值