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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 组建安全 AGI 新团队!应对AI“潘多拉魔盒”

夕小瑶科技说 原创 作者 | 小戏 一旦谈及未来 AI&#xff0c;除了天马行空的科幻畅想&#xff0c;不可避免的也有未来 AI 时代的末日预言。从 AI 武器化到 AI 欺骗&#xff0c;从邪恶 AI 到 AI 掌权&#xff0c;人工智能&#xff0c;尤其是通用人工智能的风险始终都清清楚楚的…

Dockerfile + 源码安装httpd 制作镜像

Dockerfile 源码安装httpd 制作镜像 环境&#xff1a; 虚拟机版本ip部署应用centos8192.168.136.142docker [rootlocalhost ~]# ls anaconda-ks.cfg httpd [rootlocalhost httpd]# cat dockerfile FROM centosRUN rm -rf /etc//yum.repos.d/* && \curl -o /etc/y…

Mac电脑录屏软件 Screen Recorder by Omi 中文最新

Screen Recorder by Omi是一款屏幕录制软件&#xff0c;它可以帮助用户轻松地录制屏幕活动&#xff0c;并将其保存为高质量的视频文件。 该软件提供了多种录制选项&#xff0c;包括全屏录制、选择区域录制和单窗口录制等&#xff0c;同时提供了丰富的设置选项&#xff0c;如视…

Pycharm中新建一个文件夹下__init__.py文件有什么用

在PyCharm中新建一个文件夹下的__init__.py文件有以下几个作用&#xff1a; 声明文件夹为一个Python包&#xff1a;__init__.py文件的存在告诉Python解释器该文件夹是一个Python包。当你导入该文件夹下的模块时&#xff0c;Python会将其视为一个包而不是普通的文件夹。这允许你…

为什么要停止在 SpringBoot 中使用字段注,改用构造器注入

停止在 SpringBoot 中使用字段注入&#xff01; 本文为翻译文&#xff0c;同时加入了一些自己的理解&#xff0c;翻译来源&#xff1a;https://medium.com 在 Spring Boot 依赖项注入的上下文中&#xff0c;存在关于注入依赖项最佳实践的争论:字段注入、Setter注入和构造函数…

SparkML

SparkML SparkML_lr_train &#xff1a;读取py处理后的train表用于训练&#xff0c;将训练模型保存好。 SparkML_lr_predict &#xff1a;读取训练好的模型&#xff0c;读取py处理后的test表用于预测。将预测结果写入normal_data中&#xff0c;根据id修改stream_is_normal的值。…

深入理解JVM虚拟机第十六篇:虚拟机栈存储结构和运行原理

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaScript 本文章简介:话不多说,让我们讲清楚虚拟机栈存储结构和运行原理…

LabVIEW实现变风量VAV终端干预PID控制

LabVIEW实现变风量VAV终端干预PID控制 变风量&#xff08;VAV&#xff09;控制方法的研究一直是VAV空调研究的重点。单端PID控制在温差较大时&#xff0c;系统容易出现过冲。针对空调终端单端PID控制的不足&#xff0c;设计一种干预控制与PID控制耦合的控制方法。项目使用LabV…

23个优秀开源免费BI仪表盘

BI也称为商业智能&#xff0c;是收集、分析和展示数据以支持决策者做出明智的业务决策的过程。BI帮助组织将其原始的生产数据转化为有意义的见解或者知识&#xff0c;以推动其业务战略。BI能够为组织改善决策、提高效率和提升资源利用率。 BI仪表盘是BI系统的重要组成部分&…

【计算机网络】数据链路层-MAC和ARP协议

文章目录 1. 认识以太网2. MAC协议MAC帧的格式MAC地址和IP地址的区别MTU 3. 局域网通信原理碰撞检测和避免 4. ARP协议ARP数据报的格式ARP缓存 1. 认识以太网 网络层解决的是跨网络点到点传输的问题&#xff0c;数据链路层解决的是同一网络中的通信。 数据链路层负责在同一局域…

python多进程(二)一些基础属性和方法

import multiprocessing# 定义一个任务函数 def worker(num):print(fWorker {num} started)# 这里可以执行具体的任务逻辑# ...# 创建多个进程 if __name__ __main__:processes []for i in range(5):p multiprocessing.Process(targetworker, args(i,))processes.append(p)p…

Antd Procomponent 之 proForm - 高级表单

本文作者系360奇舞团前端开发工程师 ProForm 在原来的 Form 基础上增加一些语法糖和更多的布局设置&#xff0c;帮助我们快速的开发一个表单。同时添加一些默认行为&#xff0c;让我们的表单默认好用。分步表单&#xff0c;Modal 表单&#xff0c;Drawer 表单&#xff0c;查询表…

Positive Technologies:勒索软件运营商以泄露数据为由勒索受害者

“双重勒索”和“法律勒索”&#xff1a;勒索软件运营商的新手段。 Positive Technologies 专家提交了一份关于 2023 年第三季度当前网络威胁的研究报告。随着解码器的出现&#xff0c;勒索软件的比例正在下降&#xff0c;因为后者正在失去效力。现在&#xff0c;勒索软件团伙…

react:创建项目

一&#xff1a; 使用create-react-app // 默认创建reactjs的webpack打包项目 npm i create-react-app -g create-react-app 项目名// 创建ts项目打包项目 sudo npx create-react-app my-app --template typescript 二&#xff1a; 使用vite npm create vitelatest // 创建react…

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…

设计模式之访问者模式

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概5000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

利用QT画图像的直方图

1.什么是直方图 直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间&#xff0c;统计每个区间内数据所占比例或数量&#xff0c;并用矩形条形图表现出来。直方图可以反映样本数据的分布情况&#xff0c;例如它们的集中趋势、对称性和离散程度等。 …

Java2 - 数据结构

5 数据类型 5.1 整数类型 在Java中&#xff0c;数据类型用于定义变量或表达式可以存储的数据的类型。Java的数据类型可分为两大类&#xff1a;基本数据类型和引用数据类型。 byte&#xff0c;字节 【1字节】表示范围&#xff1a;-128 ~ 127 即&#xff1a;-2^7 ~ 2^7 -1 sho…

基于Kinect 动捕XR直播解决方案 - 硬件篇

Kinect-V2 硬件设备 一、Kinect介绍 1、Kinect for Windows 的开发配置 Kinect V2 操作系统&#xff1a;Windows 10&#xff08;必须&#xff09; Windows Surface Windows Surface 2 开发环境&#xff1a;Visual Studio 2017 .NET Framework 4.5 (.NET Framework 4.5) 硬…

VEX —— Quaternion|Euler Angle

目录 一&#xff0c;四元数相关概念 四元数 欧拉角 常用四元数相关函数 相互转换 二&#xff0c;案例 案例&#xff1a;沿面中心翻转 案例&#xff1a;路径导弹 案例&#xff1a;RBD刚体还原过渡 一&#xff0c;四元数相关概念 四元数 在vex内四元数为&#xff08;&am…