C++异步web框架drogon使用探究
简介Drogon是一个基于C++17/20的Http应用框架,使用Drogon可以方便的使用C++构建各种类型的Web应用服务端程序。Drogon是作者非常喜欢的美剧《权力的游戏》中的一条龙的名字(汉译作卓耿),和龙有关但并不是dragon的误写,为了不至于引起不必要的误会这里说明一下。 Drogon是一个跨平台框架,它支持Linux,也支持macOS、FreeBSD,OpenBSD,HaikuOS,和Windows。它的主要特点如下: 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的非阻塞IO框架,提供高并发、高性能的网络IO。 全异步编程模式; 支持Http1.0/1.1(server端和client端); 基于template实现了简单的反射机制,使主程序框架、控制器(controller)和视图(view)完全解耦; 支持cookies和内建的session; 支持后端渲染,把控制器生成的数据交给视图生成Html页面,视图由CSP模板文件描述,通过CSP标签把C++代码嵌入到Html页面,由drogon的命令行工具在编译阶 ...
v2.6美鹅外卖平台Web框架替换更新
Drogon简介Drogon是一个基于C++17/20的Http应用框架,专门用于构建高效的Web应用和服务端程序 网络层使用基于epoll(macOS/FreeBSD下是kqueue)的非阻塞IO框架,提供高并发、高性能的网络IO。 安装123456789101112#安装依赖(Ubuntu示例)sudo apt install -y gcc g++ cmake libssl-dev libjsoncpp-dev uuid-dev zlib1g-dev#克隆仓库git clone https://github.com/drogonframework/drogon.gitcd drogongit submodule update --init#编译安装(约5-10分钟)mkdir buildcd buildcmake ..make -j$(nproc)sudo make install 引入CMake由于项目越发复杂,再手动编写makefile过于繁琐,因此开始使用CMkae进行项目构建,并且配合makefile进行快速重新构建项目 1234567891011 ...
v2.5美鹅外卖平台延迟瓶颈测试
计时器类为了测量延迟,我们需要使用计时功能,为此我们把相关的功能封装进计时器类内,简化使用 这段代码位于logger.hpp中 12345678910111213141516171819202122232425262728class ScopedTimer{public: ScopedTimer(const std::string&name) :_name(name),_start(std::chrono::high_resolution_clock::now()) { _prev = _start; } int64_t staged() { auto stage = std::chrono::high_resolution_clock::now(); auto ret = stage - _prev; _prev = stage; return (std::chrono::duration_cast<std::chrono:: ...
etcd服务发现功能使用探究
简介安装在宿主机上安装服务12345678sudo apt update -y# 安装sudo apt-get install etcd # 启动sudo systemctl start etcd# 配置开机自启sudo systemctl enable etcd 在Docker中运行etcd容器1234# 从官方镜像仓库拉取git pull gcr.io/etcd-development/etcd:v3.5.19# 从国内镜像源拉取git pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/etcd-development/etcd:v3.5.19
v2.5美鹅外卖平台Redis数据缓存更新
更新要点 在容器编排中引入Redis 7.2.4 将Redis服务作为MySQL缓冲层 修复客户端部分bug,并使用Release模式重新编译 为什么引入Redis缓存根据时间局部性原理,访问过的数据,短时间内大概率会被再次访问,由于服务端的业务处理运行在内存中,而数据库的访问数据会发生硬盘IO,存在巨大的速度差异,导致性能瓶颈,所以我们在数据库与业务层中引入数据缓存,提高数据的访问速率。 创建Redis容器为了更方便地使用Redis服务,我们使用Redis的Docker镜像生成一个容器来提供服务。比如我们使用镜像redis:7.2.4 1docker pull redis:7.2.4 下面是docker-compose.yml的部分代码,特别的,我们的业务层容器依赖于redis容器先启动,所以也要修改server容器的配置 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253services: server: build: ...
内存管理机制探究
什么是计算机的内存我们都知道计算机的实际计算发生在CPU中,但是对于一个程序本身和它所使用的数据来说,CPU的那点寄存器和CPU三级缓存的那点空间远远不够,因此我们需要专门为存储程序和数据开辟一段空间,而这些空间,则是由内存提供。 内存在物理上的是真实存在的,如下图是一根内存条 计算机组成架构主存与CPU,磁盘的交互虚拟内存与物理内存为什么有虚拟内存内存管理内存映射机制内存回收机制Swap分区
Rust自学一周初印象
经过一周对Rust语言圣经的学习和第三方包的使用体验,我成功从纯Rust小白成为了Rust爱好者,已经有了能进行网络编程和数据库交互的基本能力。 概括一下Rust的特点 超高效的运行时效率 大聪明编译器 干费我2核2G服务器的rust analyzer 安全,安全,还是安全! 特征,特征对象,超牛的泛型编程方式 又见堆栈我原本是以C/C++为主语言的,在使用Python或Java这种有GC垃圾回收机制的语言时,对堆栈并不强调,没想到遇上Rust,堆栈的概念再一次被强调了起来,但与C/C++这种对堆栈,尤其是堆区的分配的过于自由的管理相比,Rust对堆栈的管理十分严格,且涉及到Rust是如何在没有GC机制的前提下,既能高效使用内存,又能保证安全。 所有权与借用对于变量的数据,它有一个所有权规则,没错,变量和数据之间的联系更为松散,存在通过所有权转移导致数据还在,但变量已经失效的情况 以上是一点,而还有一点就是当变量拥有分配在堆上的数据的所有权时,变量一旦带着所有权被释放时,堆上的数据会一并被自动回收,这样就不用担心内存泄漏的问题了,也不用手动释放内存。 不想转移所有权?,那就试试使用克 ...
Rust框架入门之Axum+Sea-ORM实现MySQL增删查改
框架介绍Axum一款基于tokio的web框架TODO Sea_ORM一款提供对象关系映射服务的项目 环境准备 编程环境: 安装好rust 编码环境:vscode + rust analyzer插件 数据库:安装好本机上的MySQL Server 开始上手数据库准备虽然Sea-ORM提供数据库的建库和建表操作,但是为了简化项目难度,这次我们就手动创建了 这里给出初始化的sql语句 123456789DROP DATABASE if EXISTS RustMysql;CREATE DATABASE RustMysql DEFAULT CHARACTER SET utf8mb4;use RustMysql;create table account( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `name` varchar(16) not null unique)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 安装swa-orm-cli客户端这是一个专门用于自动生成sea-o ...
v2.4美鹅外卖平台压力测试
日志查阅在2.4出现后台服务器挂掉的情况后,我立即去查看了容器的日志信息,获得了如下日志: 12345678910111213141516171819202122[default-logger][06:16:43][9][info ][HTTPServer.cpp:415] [消费者获取菜品详情]成功,dish id:D7d33e8b47dda[default-logger][06:16:43][9][trace ][HTTPServer.cpp:416] { "dish" : "{\n \"base_price\" : 11.0,\n \"description\" : \"11\",\n \"icon_path\" : \"https://ts3.cn.mm.bing.net/th?id=ORMS.800de0e05f326302bea15ba2e5ff707d&pid=Wdp&w=26 ...
v2.4美鹅外卖平台反向代理更新
更新内容 架构上添加代理层,升级为应用服务集群架构 容器编排上,后端服务程序数量提升为两个 采用反向代理负载均衡技术,后端服务器均衡承载负载 什么是应用服务集群架构当单台应用服务器出现了性能瓶颈之后,可以有如下两种扩展解决方案: 垂直扩展/纵向扩展ScaleUp。通过购买性能更优、价格更⾼的应⽤服务器来应对更多的流量。这种⽅案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增⻓关系是⾮线性的,意味着选择性能2倍的硬件可能需要花费超过4倍的价格,其次硬件性能提升是有明显上限的。 ⽔平扩展/横向扩展ScaleOut。通过调整软件架构,增加应⽤层硬件,将⽤⼾流量分担到不同的应⽤层服务器上,来提升系统的承载能⼒。这种⽅案的优势在于成本相对较低,并且提升的上限空间也很⼤。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验 这里我们决定使用水平扩展,调整软件架构的方式提高服务法并发量。 但这需要引⼊⼀个新的组件⸺负载均衡:为了解决⽤⼾流量向哪台应⽤服务器分发的问题,需要⼀个专⻔的系统组件做流量分发。 关于流量分发的策略,有以下几种常见的策 ...
C++复习小短篇】访问基类的私有函数
题目内容该问题考察对虚函数表的理解,虚函数表就是是一个类存储虚函数地址的指针列表,每一个声明的虚函数(不论是新建还是重写)都会写入虚函数表的对应位置。 虚函数表的地址在vc编译器下存储在每个对象内存空间的最前面,通过解引用可以访问虚函数表的首地址,接下来我们可以通过遍历等方式访问里面存的函数地址。 代码如下 12345678910111213141516171819202122232425262728293031323334353637383940414243#include <iostream>using namespace std;class A{public: virtual void g() { cout << "A::g" << endl; }private: virtual void f() { cout << "A::f"<<endl; }};class B :public A{public: vir ...
初阶】初识Redis与指令学习
认识RedisRedis 是⼀种基于键值对(key-value)的NoSQL数据库,同时它也是一款高性能的内存数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满⾜很多的应⽤场景,⽽且因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。 Redis的八大特性Redis有着八大令人青睐的特性 1. 速度快Redis最突出的特点就是速度快,官⽅给出的读写性能可以高达10万/秒,而保证它能有如此之高性能的基础,主要有如下四点: 基于内存:相比于传统数据库基于外存上存储的数据库文件,Redis所有的数据都是存放在内存中的,由于内存和外存的读写速率差异是以数量级论的,所以Redis相比之下速度特别快 C语言实现:C语言本身就具有高性能的特点 单线程数据处理: 单线程的处理方式避免了锁竞争造成的性能损耗 高性能的代码实现 2. 基于键值对的数据结构服 ...
Postman服务端HTTP接口测试工具
Postman是一款强大的API开发协作工具,它的功能十分丰富,但是在这里我们仅选取要运用的接口测试相关的功能。 安装Postman点我去下载页面🔗https://www.postman.com/downloads/ 这里作者是Windows环境,所以下载的是Windows版本的安装包。其实它还提供了vscode 插件、命令行工具等不同的安装形式 认识Postman界面首先是认识左侧选项卡和底边选项卡 然后我们着重认识一下集合管理和创建接口测试 开始准备测试创建集合集合类似于文件夹,可以把一组相关的请求接口放在同一个集合里。 为了创建集合,我们点击图中的加号,创建一个空集合,然后右键集合再重命名为testForBlog 创建请求接口 如图,我们创建了一个请求接口,把它重命名为test1,调用的API默认为GET,然后输入了baidu.com的URL,发送之后我们就获得了响应报文。 这样就完成了一次接口的单次测试 使用其它请求接口如图,Postman提供了多种接口 \ 编写请求报文和测试脚本如图,这里使用了我一个项目的一个查询接口,它使用POST接口,报文是JSON格式,响应也是 ...
v2.3美鹅外卖平台数据库守护线程更新
更新要点 为DatabaseClient配置了一个负责重连的异步守护线程 完成了DatabaseClient和HTTPServer的解耦合 为每一个数据库客户端接口的异常处理处加入了被动检测连接状态 异步线程循环中加入了计数器,能够定时自动触发连接状态检测 解决了查询订单列表时导致客户端崩溃的问题 为什么引入守护线程原先的数据库连接更多的偏向于能用就行的实验性功能,这导致了一个很严重的问题: 数据库连接不稳定,以及只连接一次数据库,导致断连之后只能通过重启整个容器的方式重新连接,运维成本过高 因此我们引入守护线程,专门异步地负责数据库的重连。这样就能大大提高数据库连接的健壮性。 代码结构解耦合原先嵌入在HTTPServer内的initDB()接口暴露了DatabaseClient内的init()接口参数,导致这两个类的耦合度过高,一旦修改init()接口的参数,initDB也要跟着修改,这已经是非常明显的因为耦合度过高所造成的问题了,为此要通过修改代码的方式实现二者的解耦合 这里我们采用最简单的方法解耦合: 将原先的DatabaseClient db改为智能指针类型std::sha ...
使用perf和perl工具进行C++性能分析和生成火焰图
简介安装perf安装perf指令位于linux-tools通用包内,因此要安装适配当前运行内核的包 123apt update -y# 安装 linux-tools 通用包(适配当前运行的内核)apt install -y linux-tools-generic linux-tools-$(uname -r) 获取火焰图生成工具1git clone https://github.com/brendangregg/FlameGraph.git 开始性能分析perf采样perf采样可以有多种方式 运行并采样 123456sudo perf record -F 99 -g ./cmd --sleep 60# 参数说明:# -F 99 : 每秒采样 99 次(平衡精度与开销)# -a : 监控所有 CPU# -g : 记录调用栈(stack trace)# -- sleep : 采样持续时间 采样特定pid的进程 123456789# 获取待采样的进程的pidps aux | grep <进程名># 根据pid采样进程,假设pid为 <P ...
v2.1~V2.2美鹅外卖平台更新内容
v2.1 命令行参数更新1. gflags库引入戳我去gflags的介绍博客 gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析。gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 有了gflags后,我们可以统一地使用命令行参数或者统一的配置文件方便地配置服务端的相关参数 2. 删除JSON配置文件相比于命令行参数的配置文件,JSON文件写起来相对繁琐,且不够灵活,因此删除了JSON文件,全面使用命令行参数替代 3. 在main.cpp中定义命令行参数因为如果要解析命令行参数,就必须使用google::ParseCommandLineFlags(&argc, &argv, true);解析main函数的传参,所以直接把命令行参数的定义写在main.cpp的全局区中 main.cpp 1234567891011121314#include <gflags/gflags.h>DEFINE_string(host,"0.0.0.0&qu ...
C++测试】美鹅外卖v2.3~v2.4版本性能测试
在本版本中,整个服务端的基本功能已经完成,包括稳定性提升和日志标准化输出,因此为了进一步优化服务器的性能,提高其并发性和准确率,我们将使用测试工具Postman、perf、perl和火焰图开源项目进行测试、绘制火焰图和分析性能瓶颈 戳我去Postman介绍博客🔗 戳我去火焰图绘制介绍博客🔗 v2.3第一次测试测试信息 key value 项目版本 v2.3 当前架构 逻辑上应用数据分离架构,物理上单机架构(只有一台云服务器) 服务端信息 阿里云服务器Ubuntu 22.04 , 2核2G,Docker 容器资源分配默认配置 测试端信息 Postman客户端 修改 docker-compose.yml经过初次进入容器尝试使用perf,会发现权限不足,原因是Docker对容器的权限做了限制,即使使用root用户,获得的权限也是受限的,所以我们要修改docker-compose.yml修改容器的启动参数,来获得全部权限。注:获得权限的参数理应只在测试时使用 获得权限的方式就是加上privileged: true参数即可 展示的部分代码如下 123456789 ...
redis-plus-plus适用于C++的Redis API库使用探究
Redis简介Redis是一款开源的内存型键值数据库,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),提供持久化、原子操作及高达10万+/秒的读写性能。主要应用于缓存、消息队列、会话存储、实时排行榜等场景。采用单线程模型保障操作原子性,同时支持主从复制、集群部署和高可用方案。 为了能在程序中调用Redis服务,我们使用redis-plus-plus库编写Redis的C++客户端 redis-plus-plus安装这里仅介绍Ubuntu安装 1234567891011121314sudo apt update# 安装前置依赖(C语言的库sudo apt install -y libhiredis-dev # 安装redis-plus-plus只能源码编译了git clone https://github.com/sewenew/redis-plus-plus.gitcd ./redis-plus-plus/mkdir buildcd ./build/cmake ..make sudo make installldconfig 特别的,最后要再执行一下ldconfig指 ...
spdlog高速C++日志库使用探究
spdlog介绍spdlog 是一个高性能、超快速、零配置的C++日志库,它旨在提供简洁的API和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录 为什么用spdlog它有如下优点 高性能:spdlog 专为速度而设计,即使在高负载情况下也能保持良好的性能。 零配置:无需复杂的配置,只需包含头文件即可在项目中使用。 异步日志:支持异步日志记录,减少对主线程的影响。 格式化:支持自定义日志消息的格式化,包括时间戳、线程 ID、日志级别等。 多平台:跨平台兼容,支持 Windows、Linux、macOS 等操作系统。 丰富的 API:提供丰富的日志级别和操作符重载,方便记录各种类型的日志。 spdlog安装前置依赖库安装spdlog依赖fmt库,如果没有,需要提前安装 123sudo apt update -ysudo apt install -y libfmt-dev 同时编译的时候要加上选项 -lfmt apt安装12sudo apt updatesudo apt install -y libspdlog-dev 源码安 ...
gflags命令行参数解析库使用探究
gflags库介绍gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析。gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 为什么用gflags它有如下优点: 易于使用: flags提供了一套简单直观的API来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数。 自动帮助和文档:gflags可以自动生成每个标志的帮助信息和文档(内容由开发者填充),这有助于用户理解如何使用程序及其参数。 类型安全:gflags支持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型检查和转换。 多平台支持:gflags 可以在多种操作系统上使用,包括Windows、Linux和macOS 可扩展性:gflags允许开发者自定义标志的注册和解析逻辑,提供了强大的扩展性。 官方文档: https://gflags.github.io/gflags/代码仓库: https://github.com/gflags/gflags.git gflags安装目前只介绍Ubunt ...
计算机网络复习题-答案-第一章
来自计算机科学丛书:《计算机网络:自顶向下方法》的每章复习题,我们给出每个题目的文字答案并选择合适的题目配上图解 1.1节 R1 “主机”和“端系统”之间有什么不同?列举几种不同类型的端系统。Web服务器是一种端系统吗? (1)没有区别。在本书中“主机”和“终端系统”是交换使用的。 (2)端系统包括PC、工作站、网络服务器、邮件服务器、智能手机 (3)显然Web服务器是一种端系统 R2 协议一次常被用于外交关系,维基百科是怎样描述外交协议的? 来自维基百科:外交协议常用于描述一系列国家来往规则。这些构建完备和经过时间检验的规则可以使国家和人民生活和工作更简单。协议规则以人民准则为基础,其中的一部分已经作为现在分级的地位声明。 R3 标准对于协议为什么重要? 标准对于协议来说,可以让人们创建可以相互操作的网络系统和产品 1.2节 R4 列出6种接入技术。将它们分类为住宅接入,公司接入或广域无线网接入 通过电话线的拨号调制解调器: 住宅接入 通过电话线的DSL: 住宅或小办公室 混合光纤同轴电缆: 住宅 100M交换以太网: 公司接入 无线网: 住宅接入或公司接入 3 ...
高级IO】④Reactor事件驱动模型探究
Reactor模型是相对与传统的阻塞式I/O模型提出来的,节约线程资源和提升业务处理并发量的IO模型,它主要基于I/O多路复用配合线程池的思想来实现。不过实际上Reactor模式依然是一种同步I/O模型 对比参照-传统阻塞式I/O模型 可以看到当并发规模增大时,这一模型有着显著的性能问题: 线程资源消耗大: 每一个客户端链接都需要唯一的线程维护链接和处理业务,开销迅速上升 线程利用率低: 当出现连接数很高而实时活跃连接数较低时,大部分线程处于阻塞状态,浪费了大部分线程的处理性能。 Reactor模型的提出基于传统阻塞式I/O的两大痛点,Reactor模型使用了两大思想对应解决: I/O多路复用: 多个连接由同一个对象同时监听,当事件就绪时输出所有就绪的链接(在C++中则是文件描述符)。这样维护链接的任务就可以统一交给实现I/O多路复用的对象中,而不用分散给每一个线程。 线程池: 当有任务就绪时,则将其分配给线程池中的线程,而但任务完成后,就将空闲的线程还给线程池,这样可以解决线程利用率低的问题。当然相应地它也引出了动态扩容和负载均 ...
MySQL关键字专题
ER图关系模型->数据表数据模型方法一 实体集 == 表 1->n , 主键->外键 n->m, 新表,主键=(外键1 + 外键2) 1-1 , 选2或3 表名称 属性 person driver_id(PK), address,name car license(PK) , model, year accident report-number(PK), location, date owns owner_driver_id(PK,FK),car_license(PK,FK) participated driver_id(PK,FK),license(PK,FK),report_number(PK,FK),damage_amount 表名称 属性 职员表 职员编号(PK),年龄,性别,从属部门(FK) 部门表 部门编号(PK),部门属性码 项目表 项目编号(PK),项目时间,属性码,主管编号(FK) 项目参与表 职员编号(PK,FK),项目编号(PK,FK) 表名称 ...
C++项目】v2.5美鹅外卖-总集介绍博客
项目介绍为客户提供一个C/S架构的外卖平台,使用Qt框架和cpp-httplib 等模块实现其业务功能。能够服务消费者,商家和管理员的使用需求,目前支持的客户端平台为Windows平台。服务端平台只需支持Docker即可 使用的技术点有: QT界面框架 Json序列化与反序列化 cpp-httplib库 MySQL connector/c++ Redis 缓存层 nginx 负载均衡 Docker容器与镜像管理技术 运行环境当前版本v2.5 客户端: windows 11 服务端: 阿里云ECS云服务器 ubuntu 22.04 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角色抽象归纳根据需求的功能点,可以将系统的参与者抽象成两层三类。 用户: 所有具体参与者的总称,更高一级的抽象 商家:提供菜品和处理订单的一类人 消费者:点餐和请求订单的一类人 管理员:有权限查看销售日志的一类人 用例图 功能需求根据 ...
avatar
副驾supdriver
动物界 脊索动物门 哺乳纲 灵长目 人科 人属 智人种
我github还蛮大的
公告
主域名:
supdriver.top
网站资讯
文章数目 :
99
已运行时间 :
本站总字数 :
322.2k
本站总访问量 :
最后更新时间 :