当前位置: 首页 > news >正文

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应用程序框架&#xff0c;它支持Linux&#xff0c;也支持macOS、FreeBSD&#xff0c;OpenBSD&#xff0c;HaikuOS&#xff0c;和Windows。项目地址&#xff1a;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…...

聊一聊,今年参加软考高级的一些总结

先上结论&#xff0c;系统架构设计师考题难度不高&#xff0c;总之多读书&#xff0c;多刷题&#xff0c;多写博客&#xff0c;多总结&#xff0c;有一定工作经验的基本上都非常容易过。但是我估计自己考不过&#xff0c;主要是论文这块没写好&#xff0c;思路不清晰&#xff0…...

【寒武纪(4)】图像处理硬件加速,基于CNCVE

基本概念 1、handle 句柄标识不同任务 2、对于调用上&#xff0c;支持阻塞和非阻塞。使用bInstant标识。 3、查询query可以确认调用是否完成 4、及时刷新cache。CNCVE 硬件的唯一数据来源是DDR&#xff0c;防止CPU访问导致cache内存干扰&#xff0c;需要调用cnsysMacheOperate…...

有关python库

官方库 #1、导入某模块 import os #2、导入OS模块中的system方法 from os import system #3、导入某模块中的孙子模块中的xx方法&#xff0c;并重命名 from module.xx.xx import xx as rename #4、导入OS中的所有模块 #不用进行OS.method(),直接method&#xff08;&#xff0…...

java项目之电影网站(ssm框架)

项目简介 电影网站实现了以下功能&#xff1a; 登录模块用例中用户包括用户和管理员和二种角色&#xff0c;分别可以进行其对应的身份登录或取消登录&#xff0c;关闭系统。用户模块主要包括首页&#xff0c;电影信息&#xff0c;电影商城&#xff0c;社区交流&#xff0c;电…...

技术分享 | app自动化测试(Android)--触屏操作自动化

导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java 版本 import io.appium.java_client.TouchAction; 常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作&#xff1a; press 按下 release 释放 …...

Java连接数据库并查询表中的全部数据

1、导入相关jar包 这里创建简单的maven项目&#xff0c;我们导入相关的jar包 相关依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…...

STM32存储左右互搏 SPI总线读写FLASH W25QXX

STM32存储左右互搏 SPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库操作W25Q各型号FLASH的例程。 W25QXX介绍 W25QX…...

【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09; 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09;将于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 高级设置&#xff0c;找到centos 虚拟机使用的网卡 2、看网卡的其他属性 3、按照红圈部分&#xff0c;配置成一样的就行 4、进入到虚拟机配置中&#xff0c;配置成如图一样的NAT模式 5、再进入编辑 -》虚拟网络编辑…...

Flutter vs 前端 杂谈:SliverAppBar、手动实现Appbar、前端Html+JS怎么实现滚动变化型Appbar - 比较

Flutter vs 前端 杂谈 SliverAppBar的弹性背景的显隐效果使用HtmlJS怎么实现 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550…...

Qt 二维码生成与识别

1.简介 QZXing是一个基于Qt框架的二维码解码库&#xff0c;它是对ZXing&#xff08;Zebra Crossing&#xff09;开源项目的一个Qt封装。ZXing是一个功能强大的开源二维码解码库&#xff0c;支持多种类型的码&#xff0c;包括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…...

电路布线问题动态规划详解(做题思路)

对于电路布线问题&#xff0c;想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计&#xff0c;要求用导 线(i,π(i))将上端接线柱与下端接线柱相…...

webpack 的 Loader 和 Plugin 的区别,常见的 loader 和 plugin 有哪些?

结论先行&#xff1a; 1、 Loader 和 Plugin 的区别 Loader 也叫做就是“加载器”&#xff0c;因为 webpack 原生只能解析 js 文件&#xff0c;而对于其他类型文件&#xff0c;则需要借助 loader。所以 loader 的作用就是实现对不同格式文件的解析和处理&#xff0c;例如把 E…...

云计算实战项目之---学之思在线考试系统

简介&#xff1a; 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序&#xff0c;能覆盖到pc机和手机等设备。 支持多种部署方式&#xff1a;集成部署、前后端分离部署、docker部…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...