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通用包内,因此要安装适配当前运行内核的包 123sudo apt update -y# 安装 linux-tools 通用包(适配当前运行的内核)sudo apt install -y linux-tools-generic linux-tools-$(uname -r) perl 安装1sudo apt install -y perl 获取火焰图生成工具1git clone https://github.com/brendangregg/FlameGraph.git 开始性能分析perf采样123456sudo perf record -F 99 -g ./cmd --sleep 60# 参数说明:# -F 99 : 每秒采样 99 次(平衡精度与开销)# -a : 监控所有 CPU# -g : 记录调用栈(stack trace)# -- sleep : 采样持续时间 绘制火焰图1234#perf record -g ./cmd sleep10sudo perf script -i pe ...
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.1版本性能测试
圈定测试范围明确性能指标执行测试分析结果
redis-plus-plus适用于C++的Redis API库使用探究
Redis简介redis-plus-plus安装这里仅介绍Ubuntu安装 apt安装1234567891011sudo 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 ..
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.3美鹅外卖-总集介绍博客
项目介绍为客户提供一个C/S架构的外卖平台,使用Qt框架和cpp-httplib 等模块实现其业务功能。能够服务消费者,商家和管理员的使用需求,目前支持的客户端平台为Windows平台。服务端平台只需支持Docker即可 使用的技术点有: QT界面框架 Json序列化与反序列化 cpp-httplib库 MySQL connector/c++ Docker容器与镜像管理技术 运行环境当前版本v2.3 客户端: windows 11 服务端: 阿里云ECS云服务器 ubuntu 22.04 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角色抽象归纳根据需求的功能点,可以将系统的参与者抽象成两层三类。 用户: 所有具体参与者的总称,更高一级的抽象 商家:提供菜品和处理订单的一类人 消费者:点餐和请求订单的一类人 管理员:有权限查看销售日志的一类人 用例图 功能需求根据用户的需求,我们提出更具体,更偏向实现的功 ...
C++项目】v2.0美鹅外卖平台的服务端实现
重大更新平台迁移服务端的开发环境和部署环境均完成了操作系统平台迁移。从Windows 11转移到了Ubuntu 22.04云服务器上。 第三方库依赖更新 完全抛弃QT框架 新增jsoncpp替代QJson 部署升级 引入Dockerfile完成镜像自动构建 使用docker-compose.yml自动完成服务编排和部署启动,使单机开发测试更简单 服务端详细设计版本信息当前版本: v2.0重大更新 当前服务器使用了如下技术栈: MySQL数据库服务:由MySQL 8.0提供数据持久化服务 MySQL API服务: 由MySQL Connector/C++ 7提供原生API,并在开发中封装成数据库对象及其接口 序列化与反序列化服务: 由jsoncpp库提供对象的序列化与反序列化 HTTP短链接通信服务 : 由开源项目cpp-httplib提供的单头文件库提供简单易用的HTTP服务 当前架构图 服务端层次结构 HTTP请求路径约定客户端与服务端的交互对具体函数的调用,取决于HTTP 请求路径的约定,所以要提前约定好 账户相关 Account API 路径 业务 /acco ...
高级IO】③epoll实现IO多路转接
以epoll相关接口构成的高级IO 不仅是名称上类似,epoll与poll的功能也是类似的,但是按man手册的说法,epoll是为处理大批量句柄而做了改进的poll,它几乎具备了之前所介绍的select和poll构成的高级IO的一切优点,因此它被公认为Linux2.6下性能最好的多路I/O就绪通知方法 认识 epoll 系列接口epoll有3个相关的系统调用 来自头文件<sys/epoll.h> epoll_create该接口用于创建epoll实例,它的返回值我们称为epfd 1int epoll_create(int size); 根据man手册,自Linux 2.6.8之后,参数size将会被忽略,但是必须大于0 epoll_ctlepoll的事件注册函数 1int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 这一系统用于增、改、查位于epfd对应的epoll实例内的待监听的文件描述符列表 参数描述 epfd: 由先前的epoll_create产生的epfd op: 操作代码,有如 ...
高级IO】②poll实现IO多路转接
以系统提供的函数poll为核心实现多路转接,即高级网络IO 认识 poll 函数123#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); 特殊的结构体pollfd 12345struct pollfd { int fd; /* 文件描述符 */ short events; /* 请求事件 */ short revents; /* 应答事件 */}; 功能poll也类似于select函数,能够同时监听多个文件描述符的就绪事件 参数解释 fds是pollfd结构体数组的指针/地址,提供待监听文件描述符的列表。其中结构体中的位图提供了每个文件描述符的各种状态的可能性 nfds表示传入数组的长度 timeout表示poll函数的超时时间,单位是毫秒(ms) 其中events和revents都是位图,可以有如下取值 | 事件 | 描述 ...
为什么写博客-540天总结
前言今天是2025年的情人节,我与我的博客小站已经相互陪伴了540天啦~。人对事物的认识总是阶段性的,所以我决定是时候阶段性地回答当初遗留的问题了—-为什么写博客 我们首先回顾一下我们的博客产出经历了怎样的阶段: 建站之初: 其实一开始我只模糊地知道写博客有很多好处,自己折腾建站也主要是因为觉得有自己的博客网站很酷,于是便折腾出了一个博客网站。 难产时期:我原本并没有写文章的习惯,写博客对我来说是全新的尝试,但是根据我学习各种新东西积累下来的经验,我知道刚开始总是产出很低效率很低的。确实,一开始我写博客的效率并不高,质量也不高。但没关系,我知道,它们作为我起步的垫脚石至关重要 配图时期: 早起的博客我很少配图,因为我一直苦于找不到合适的作图软件。后来我还是下定了决心要给我的文章配上示意图,工具我就选择了我本身有一点点基础的ppt,虽然做的不快,但好在易上手,图示清晰。 系列时期: 此时我读到了一些好书,我觉得可以根据书中的内容出一些系列博客。这些书也着实成为了博客的高质量灵感来源 项目时期: 当学习到可以产出比较有规模的代码时,我的博客技术已经发展到可以自信地输出文字,和高效地利用pp ...
面向对象分析与设计(2)--对象模型
对象模型引入面向对象要素建立在很好的工程基础之上。它的要素统称为“开发对象模型”,或者简称为“对象模型”。拆开来讲,它包含如下原则:抽象 封装 模块化 层次结构 类型 并发 持久 就它们本身来说,没有一个原则是创新的。但重要的是,在对象技术中,它将这些要素以一种相互配合的方式结合起来了。面向对象分析和设计在本质上与传统的结构化设计方法提出了一种不同的方式来解决软件问题。 对象模型的演进了解对象模型是如何诞生和一步步走向成熟的,有利于我们理解现代对象模型是如何工作的。 第一代语言主要用于科学和工程应用,因此以数学表达式为主。但它依然标志着高级程序设计语言向着问题空间靠近了一步,向底层计算机远离了一步 第二代语言中,重点是算法抽象。 第三代语言则是演进到了支持数据抽象 后来发展到面向对象语言的兴盛。 之后出现的许多语言活动,新版本和标准化工作,导致了程序设计框架的出现 程序设计语言的拓扑结构演进对于一门语言的拓扑结构,是指这种语言的基本物理构成单元,以及这些部分是如何连接的。比起其它方面,拓扑着重强调连接是如何组织的 第一代和第二代早期此时用这些语言编写的应用展现出相对 ...
C++项目】美鹅外卖-总集介绍博客
项目介绍为客户提供一个C/S架构的外卖平台,使用Qt框架和cpp-httplib 等模块实现其业务功能。能够服务消费者,商家和管理员的使用需求,目前支持的平台为Windows平台。 使用的技术点有: QT界面框架 QT Json处理模块 cpp-httplib库 MySQL connector/c++ 运行环境当前版本v1.0 客户端: windows 11 服务端: windows 11 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角色抽象归纳根据需求的功能点,可以将系统的参与者抽象成两层三类。 用户: 所有具体参与者的总称,更高一级的抽象 商家:提供菜品和处理订单的一类人 消费者:点餐和请求订单的一类人 管理员:有权限查看销售日志的一类人 用例图 功能需求根据用户的需求,我们提出更具体,更偏向实现的功能需求 阅读提示:点击右侧目录可以跳转 用户注册功能用户可以使用唯一的*账号名和手机号和进行账号注册 ...
C++项目】美鹅外卖-客户端实现
客户端详细设计版本信息当前版本: v0.9测试版 当前版本的界面属于类似于毛坯房的只有UI结构和功能而没有美化,且所有的图片显示均尚未处理,均使用了QLabel进行占位 用户界面设计在使用代码工具编写界面前,可以先使用作图工具设计(“画”)一个UI界面出来,这样子有助于将UI设计与代码开发有一定程度的解耦合。降低开发难度 界面流转流程图 注册界面 注册按钮: 点击请求注册 转到用户名登录按钮: 点击转到用户名登录界面 转到手机号登录按钮:点击转到手机号登录 用户名登录界面 登录按钮: 点击请求登录 转到注册按钮: 点击转到注册界面 转到手机号登录按钮:点击转到手机号登录 手机号登录界面 登录按钮: 点击请求登录 转到注册按钮: 点击转到注册界面 转到用户名登录按钮:点击转到用户名登录 账户优惠等级升级界面 升级为VIP按钮:由普通成员升级为VIP 升级为SVIP按钮:由普通成员升级为SVIP 消费者菜品列表界面 导航栏按钮: 点击切换对应界面 菜品样式图: 点击转到菜品详情窗口 菜品名 ...
protobuf实战】网络通讯录
protobuf简介Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤于(数据)通信协议、数据存储等。 Protocol Buffers 类⽐于 XML,是⼀种灵活,⾼效,⾃动化机制的结构数据序列化⽅法,但是⽐XML 更⼩、更快、更为简单。你可以定义数据的结构,然后使⽤特殊⽣成的源代码轻松的在各种数据流中使⽤各种语⾔进⾏编写和读取结构数据。你甚⾄可以更新数据结构,⽽不破坏由旧数据结构编译的已部署程序。 简单来讲, ProtoBuf(全称为 Protocol Buffer)是让结构数据序列化的⽅法,其具有以下特点: 语⾔⽆关、平台⽆关:即 ProtoBuf ⽀持 Java、C++、Python 等多种语⾔,⽀持多个平台。 ⾼效:即⽐ XML 更⼩、更快、更为简单。 扩展性、兼容性好:你可以更新数据结构,⽽不影响和破坏原有的旧程序 使用特点 安装protobuf下载 ProtoBuf 前⼀定要安装依赖库:autoconf automake libtool curl make g++ unzip 安装命令如下 对于Ubunt ...
C++项目】美鹅外卖平台的服务端实现
服务端详细设计版本信息当前版本: v0.9测试版 当前版本的服务器使用了如下技术栈: QT框架: 利用QT的全平台特性,这里的开发环境也使用了QT框架。主要使用了QT里的数据结构 QT Json框架: 本版本对报文的序列化与反序列化技术依然使用了Json格式 cpp-httplib:一个开源的单文件的http库,用于提供简单易操作的短链接HTTP服务 MySQL Connector/C++ Windows平台: MySQL官方提供的Windows平台C++连接数据库的API HTTP请求路径约定客户端与服务端的交互对具体函数的调用,取决于HTTP 请求路径的约定,所以要提前约定好 账户相关 Account API 路径 业务 /account/register 账户注册 /account/login/username 账户使用用户名登录 /account/login/phone 账户使用手机号登录 /account/update/level 消费者账户优惠等级更新 /account/update/nickname 账号更新昵称 消费者相关 Consu ...
高级IO】①select实现IO多路转接
以系统提供的函数select为核心实现多路转接,即高级网络IO 认识select函数1234#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能select系统调用能够同时监测多个文件描述符的状态变化,这个系统调用是阻塞式的,退出阻塞等待的条件是被监视的文件描述符中有一个或多个发生了变化。 参数解释 nfds: 文件描述符数组长度,值为最大的文件描述符值+1。因为文件描述符从0开始 readfds: 本质上是位图,表示待监视的可读文件描述符的集合,返回时标记发生变化的fd writefds: 本质上是位图,表示待监视的可写文件描述符集合,返回时标记发生变化的fd exset: 本质上是位图,表示待监视的异常文件描述符的集合,返回时标记发生变化的fd timeout: 用于设置select()的等待时间 struct timeval 12345678910struc ...
设计模式的C++实现(7)——组合模式Composite
模式名称: 组合模式类型: 结构型问题-使用场景: 可用于构建对象树这样的部分-整体层次结构,使用户对单个对象和组合对象的使用具有一致性解决方案: 使用递归组合的方式构建类效果: 使用户对单个对象和组合对象的使用具有一致性 样例引入如下图,有过QT开发经验的朋友能够看出来,这是QT组件管理里的对象树,它是一种管理组件的数据结构,同时它也很好地体现了组合模式在实际应用中的作用。 实现方式我们可以通过继承和聚合配合使用的方式实现组合模式,就以模拟实现上图的QWidget为例,我们来设计一个自己SWidget使之能够达到类似的效果 我们设计的类图如下 可以看到,在类图中,SObject和SWidget既是继承关系,又有组合关系,这一结构特点使SWidget之间能够构成对象树,而SLabel也是SObject的子类,但由于没有聚合关系,所以SLabel在对象树中仅能作为”叶子节点”存在。 代码实现如下,我们成功构建了一颗三层的对象树。 1234567891011121314151617181920212223242526272829303132333435363738394041424 ...
8086汇编】迭代-手把手教你实现递归求斐波那契数和无符号数字的输出
概述本期的重点在于使用8086汇编语言实现循环迭代,无符号数字输出,使用多位内存储存超长整型,超长整型打印输出 程序框图 模块图 初始化准备我们先把代码段、数据段和栈段准备好相关的数据并完成相关的初始化 声明段我们先声明三个段 1assume cs:codesg,ds:datasg,ss:stacksg 装载数据在数据段我们准备填入如下数据 choose 字符串,用于输出提示信息 result 字符串,用于输出提示信息 enter 字符串,用于输出回车换行,即\n\r pressQ 字符串,用于输出退出程序的提示信息 wrongRange 字符串,用于输出范围错误的提示信息 num1 12字节长整型,表示迭代中的Fib(n-2) num2 12字节长整型,表示迭代中的Fib(n-1),同时最终答案也存在num2中 numlen 单字(2字节)变量,储存输出数字串的长度/栈的深度 tmpcx1 单字变量,辅助暂存cx的值,避免使用栈,防止栈的管理混乱 这里写入num我们使用dw指令写入一个字长(2字节) 而写入字符串必须一个字节一个字节写入,所以使用db指令 特别的, ...
avatar
副驾supdriver
动物界 脊索动物门 哺乳纲 灵长目 人科 人属 智人种
我github还蛮大的
公告
主域名:
supdriver.top
网站资讯
文章数目 :
88
已运行时间 :
本站总字数 :
300.9k
本站总访问量 :
最后更新时间 :