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
相关文章:
Drogon源码剖析
一、Drogon介绍 Drogon是一个基于C的跨平台HTTP应用程序框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。项目地址:https://github.com/drogonframework/drogon。 它的主要特点如下&a…...
maven 上传本地jar包到nexus
maven上传命令 mvn deploy:deploy-file -DgroupIdcom.microsoft.sqlserver -DartifactIdsqljdbc4 -Dversion4.0 -Dpackagingjar -DfileC:\java\top-sdk-java-1.0.1-lib\lib\bcprov-jdk16-1.46.jar -Durlhttp://ip:port/repository/maven-releases/ -DrepositoryIdsnapshot…...
聊一聊,今年参加软考高级的一些总结
先上结论,系统架构设计师考题难度不高,总之多读书,多刷题,多写博客,多总结,有一定工作经验的基本上都非常容易过。但是我估计自己考不过,主要是论文这块没写好,思路不清晰࿰…...
【寒武纪(4)】图像处理硬件加速,基于CNCVE
基本概念 1、handle 句柄标识不同任务 2、对于调用上,支持阻塞和非阻塞。使用bInstant标识。 3、查询query可以确认调用是否完成 4、及时刷新cache。CNCVE 硬件的唯一数据来源是DDR,防止CPU访问导致cache内存干扰,需要调用cnsysMacheOperate…...
有关python库
官方库 #1、导入某模块 import os #2、导入OS模块中的system方法 from os import system #3、导入某模块中的孙子模块中的xx方法,并重命名 from module.xx.xx import xx as rename #4、导入OS中的所有模块 #不用进行OS.method(),直接method(࿰…...
java项目之电影网站(ssm框架)
项目简介 电影网站实现了以下功能: 登录模块用例中用户包括用户和管理员和二种角色,分别可以进行其对应的身份登录或取消登录,关闭系统。用户模块主要包括首页,电影信息,电影商城,社区交流,电…...
技术分享 | app自动化测试(Android)--触屏操作自动化
导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java 版本 import io.appium.java_client.TouchAction; 常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作: press 按下 release 释放 …...
Java连接数据库并查询表中的全部数据
1、导入相关jar包 这里创建简单的maven项目,我们导入相关的jar包 相关依赖: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…...
STM32存储左右互搏 SPI总线读写FLASH W25QXX
STM32存储左右互搏 SPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元,W25QXX系列Flash有不同容量的型号,如W25Q64的容量为64Mbit,也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库操作W25Q各型号FLASH的例程。 W25QXX介绍 W25QX…...
【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)
第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024) 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)将于2024年2月…...
解决pip 安装 pyhash错误
1 pip 安装 pyhash错误 Collecting pyhash (from Calvin0.0.1) Using cached https://pypi.tuna.tsinghua.edu.cn/packages/f0/bf/4db9bed05d10824a17697f65063de19892ca2171a31a9c6854f9bbf55c02/pyhash-0.9.3.tar.gz (602 kB) Preparing metadata (setup.py) … error error:…...
解决 win11 vmware 中centos 网络不能访问外网
解决 win11 vmware 中centos 网络不能访问外网 1、进入win11 高级设置,找到centos 虚拟机使用的网卡 2、看网卡的其他属性 3、按照红圈部分,配置成一样的就行 4、进入到虚拟机配置中,配置成如图一样的NAT模式 5、再进入编辑 -》虚拟网络编辑…...
Flutter vs 前端 杂谈:SliverAppBar、手动实现Appbar、前端Html+JS怎么实现滚动变化型Appbar - 比较
Flutter vs 前端 杂谈 SliverAppBar的弹性背景的显隐效果使用HtmlJS怎么实现 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550…...
Qt 二维码生成与识别
1.简介 QZXing是一个基于Qt框架的二维码解码库,它是对ZXing(Zebra Crossing)开源项目的一个Qt封装。ZXing是一个功能强大的开源二维码解码库,支持多种类型的码,包括QR码、DataMatrix码、Aztec码等。 QZXing提供了一个…...
jacoco和sonar
目录 jacoco 引入依赖 构建配置修改 单元测试 生成报告 查看报告 报告说明 1. Instructions 2. Branches 3. Cyclomatic Complexity 4. Lines 5. Methods 6. Classes sonar7.7 基础环境 需要下载软件 解压文件并配置 运行启动 jacoco 引入依赖 <dep…...
Django系列之Serializer的source参数使用、自定义序列化方法
数据准备 models.py from django.contrib.auth.models import AbstractUser from django.db import modelsclass Publish(models.Model):name models.CharField(max_length32)city models.CharField(max_length8)email models.CharField(max_length32)def __str__(self):r…...
Java从入门到精通
Java从入门到精通 1. Java概述1.1 Java是什么1.2 为什么用Java1.3 Java能做什么1.4 Java技术体系平台2. Java快速入门2.1 Java开发环境的准备:JDK简介、安装、常用命令如何使用JavaJDK产品的发展史获取JDK如何验证能用javac和java其他常用命令行命令2.2 Java入门程序-HelloWor…...
电路布线问题动态规划详解(做题思路)
对于电路布线问题,想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导 线(i,π(i))将上端接线柱与下端接线柱相…...
webpack 的 Loader 和 Plugin 的区别,常见的 loader 和 plugin 有哪些?
结论先行: 1、 Loader 和 Plugin 的区别 Loader 也叫做就是“加载器”,因为 webpack 原生只能解析 js 文件,而对于其他类型文件,则需要借助 loader。所以 loader 的作用就是实现对不同格式文件的解析和处理,例如把 E…...
云计算实战项目之---学之思在线考试系统
简介: 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机和手机等设备。 支持多种部署方式:集成部署、前后端分离部署、docker部…...
马年市场快报分析:欧美组合式一氧化碳及可燃气体报警器指南
马年市场快报分析:欧美组合式一氧化碳及可燃气体报警器指南根据您提供的快报内容,我将从专业角度逐步分析欧美组合式一氧化碳(CO)及可燃气体报警器的关键信息,包括安全标准、风险因素、探测器区别、安装建议以及相关产…...
Windows11状态栏图标失效?手把手教你修复注册表关联(附一键脚本)
Windows 11状态栏图标失效的终极修复指南:从原理到实战 Windows 11以其现代化的界面设计吸引了不少用户,但系统自定义过程中难免会遇到各种"小脾气"。最近不少用户反馈,在尝试去除桌面图标小箭头后,状态栏的应用程序图标…...
基于pyqt的规则匹配的恶意代码检测系统
当前的恶意代码检测研究中,尽管传统特征匹配(signature-based detection)仍然广泛应用,但面对快速更新且具有混淆、加壳、动态加载、自变异(polymorphism/metamorphism)等能力的新型恶意代码&am…...
开源 ESP32 网络收音机:OLED 界面与编码器交互全解析
1. ESP32网络收音机项目概述 第一次接触ESP32网络收音机项目时,我被这个小小的开发板展现出的强大功能震撼到了。想象一下,一个火柴盒大小的设备,不仅能连接WiFi播放全球各地的网络电台,还能通过OLED屏幕和编码器实现媲美商业产品…...
如何快速解决AMD Ryzen系统调试问题:SMUDebugTool完整使用指南
如何快速解决AMD Ryzen系统调试问题:SMUDebugTool完整使用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...
告别重复造轮子:用快马AI一键生成蓝桥杯单片机高效开发模块库
告别重复造轮子:用快马AI一键生成蓝桥杯单片机高效开发模块库 参加蓝桥杯单片机比赛的同学都知道,备赛过程中最耗时的往往不是算法设计,而是各种底层模块的调试。从矩阵键盘的消抖处理到温度传感器的数据读取,这些看似简单的功能…...
手把手教你用UML用例图梳理业务流程(附真实项目案例)
实战指南:用UML用例图重构电商订单系统业务流程 1. 为什么用例图是需求分析的基石 在软件开发的混沌初期,当产品经理、开发者和业务方还在用各自的语言描述需求时,UML用例图就像一盏明灯,它能跨越专业术语的鸿沟,用可视…...
Qwen3.5-2B图文理解实战:上传建筑平面图,自动标注房间功能与面积
Qwen3.5-2B图文理解实战:上传建筑平面图,自动标注房间功能与面积 1. 引言:当AI遇见建筑设计 想象一下这样的场景:你刚拿到一张复杂的建筑平面图,需要快速标注每个房间的功能和面积。传统方法可能需要花费数小时手动测…...
Plumbum管道与重定向完全教程:构建复杂Shell命令链
Plumbum管道与重定向完全教程:构建复杂Shell命令链 【免费下载链接】plumbum Plumbum: Shell Combinators 项目地址: https://gitcode.com/gh_mirrors/pl/plumbum Plumbum是一个强大的Python库,它让您在Python中编写shell脚本般简洁的代码&#x…...
Qwen3.5-9B Java面试宝典生成器:动态定制八股文与场景题
Qwen3.5-9B Java面试宝典生成器:动态定制八股文与场景题 1. 为什么需要智能面试助手 Java开发者求职路上,最头疼的莫过于海量面试题的整理和记忆。传统方式要么依赖网上零散的八股文合集,要么自己手动整理知识点,效率低下且难以…...
