002 仿muduo库实现高性能服务器组件_整体框架

ops/2024/10/19 9:44:24/

​🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
🌹关注我💪🏻带你学更多知识

文章目录

  • 前言
  • 项目框架
  • 小结

前言

本文不会包含任何项目模块的代码,旨在向你介绍项目具体分为哪几个模块,考虑到还没有涉及任何模块的学习,因此本文主要是为了让你写此项目的时候有一个初步印象,所以本文也不会涉及对各个模块深度剖析

项目框架

功能模块划分:
基于以上的理解,我们要实现的是⼀个带有协议⽀持的Reactor模型⾼性能服务器,因此将整个项⽬的
实现划分为两个⼤的模块:
• SERVER模块:实现Reactor模型的TCP服务器
• 协议模块:对当前的Reactor模型服务器提供应⽤层协议⽀持
在这里插入图片描述

SERVER模块:

SERVER模块就是对所有的连接以及线程进⾏管理,让它们各司其职,在合适的时候做合适的事,最终
完成⾼性能服务器组件的实现。
⽽具体的管理也分为三个⽅⾯:
• 监听连接管理:对监听连接进⾏管理。
• 通信连接管理:对通信连接进⾏管理。
• 超时连接管理:对超时连接进⾏管理。
基于以上的管理思想,将这个模块进⾏细致的划分⼜可以划分为以下多个⼦模块:

1、Buffer模块:

Buffer模块是⼀个缓冲区模块,⽤于实现通信中⽤⼾态的接收缓冲区和发送缓冲区功能

2、Socket模块:

Socket模块是对套接字操作封装的⼀个模块,使得对于套接字的各项操作更加简便

3、 Channel模块:

Channel模块是对⼀个描述符进行监控事件管理,实现对描述符可读,可写,错误…事件的管理操作,以及Poller模块对描述符进⾏IO事件监控就绪后,根据不同的事件,回调不同的处理函数功能。

4、Connection模块

Connection模块是对Buffer模块,Socket模块,Channel模块的⼀个整体封装,实现了对⼀个通信套接字的整体的管理,每⼀个进⾏数据通信的套接字(也就是accept获取到的新连接)都会使⽤Connection进⾏管理。

5、Acceptor模块:

Acceptor模块是对Socket模块,Channel模块的⼀个整体封装,实现了对⼀个监听套接字的整体的管
理。

6、 TimerQueue模块:

TimerQueue模块是实现固定时间定时任务的模块,可以理解就是要给定时任务管理器,向定时任务管理器中添加⼀个任务,任务将在固定时间后被执⾏,同时也可以通过刷新定时任务来延迟任务的执⾏。

7、Poller模块:

Poller模块是对epoll进⾏封装的⼀个模块,主要实现epoll的IO事件添加,修改,移除,获取活跃连接功能

8、 EventLoop模块:

EventLoop模块可以理解就是我们上边所说的Reactor模块,它是对Poller模块,TimerQueue模块,Socket模块的⼀个整体封装,进⾏所有描述符的事件监控。

9、 TcpServer模块:

这个模块是⼀个整体Tcp服务器模块的封装,内部封装了Acceptor模块,线程池EventLoopThreadPool模块。

HTTP协议模块:

HTTP协议模块⽤于对⾼并发服务器模块进⾏协议⽀持,基于提供的协议⽀持能够更⽅便的完成指定协议服务器的搭建。

1、 Util模块:

这个模块是⼀个⼯具模块,主要提供HTTP协议模块所⽤到的⼀些⼯具函数,⽐如url编解码,⽂件读写…等。

2、 HttpRequest模块:

这个模块是HTTP请求数据模块,⽤于保存HTTP请求数据被解析后的各项请求元素信息。

3、 HttpResponse模块:

这个模块是HTTP响应数据模块,⽤于业务处理后设置并保存HTTP响应数据的的各项元素信息,最终会被按照HTTP协议响应格式组织成为响应信息发送给客⼾端。

4、 HttpContext模块:

这个模块是⼀个HTTP请求接收的上下⽂模块,主要是为了防⽌在⼀次接收的数据中,不是⼀个完整的HTTP请求,则解析过程并未完成,⽆法进⾏完整的请求处理,需要在下次接收到新数据后继续根据上下⽂进⾏解析,最终得到⼀个HttpRequest请求信息对象,因此在请求数据的接收以及解析部分需要⼀
个上下⽂来进⾏控制接收和处理节奏

5、 HttpServer模块:

这个模块是最终给组件使⽤者提供的HTTP服务器模块了,⽤于以简单的接⼝实现HTTP服务器的搭建。
HttpServer模块内部包含有⼀个TcpServer对象:TcpServer对象实现服务器的搭建
HttpServer模块内部包含有两个提供给TcpServer对象的接⼝:连接建⽴成功设置上下⽂接⼝,数据处理接⼝。
HttpServer模块内部包含有⼀个hash-map表存储请求与处理函数的映射表:组件使⽤者向HttpServer设置哪些请求应该使⽤哪些函数进⾏处理,等TcpServer收到对应的请求就会使⽤对应的函数进⾏处理。

小结

项目的模块比较多且复杂,希望看此文的你能够将注意力先放在一个模块上,然后逐个攻破,后续我将会出一篇将所有模块联系在一起的文章


http://www.ppmy.cn/ops/42801.html

相关文章

5.25机器人基础-空间描述和变换1

参考资料:《机器人学导论》John.J.Craig 彻底搞懂“旋转矩阵/欧拉角/四元数”,让你体会三维旋转之美_欧拉角判断动作-CSDN博客 机器人操作的定义是指通过某种机构使零件和工具在空间运动。因此,对于坐标系的定义显得尤为重要,相…

贪心算法4(c++)

过河的最短时间 题目描述 输入 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过,如果…

webpack构建流程

对webpack的理解: webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具 可以使用webpack管理模块 因为在webpack看来,项目中的所有资源皆为模块,通过分析模块间的依赖关系,在其内部构建出一个依赖图,最终编…

Go 和 Delphi 定义可变参数函数的对比

使用可变参数函数具有灵活性、重用性、简化调用等优点,各个语言有各自定义可变参数函数的方法,也有通用的处理方法,比如使用数组、定义参数结构体、使用泛型等。 这里总结记录一下 go、delphi 的常用的定义可变参数函数的方式! 一…

mysql常用日期处理

今天 SELECT DATE_FORMAT(NOW(),%Y-%m-%d 00:00:00) AS 今天开始; SELECT DATE_FORMAT(NOW(),%Y-%m-%d 23:59:59) AS 今天结束; 昨天 SELECT DATE_FORMAT( DATE_SUB(CURDATE(), INTERVAL 1 DAY), %Y-%m-%d 00:00:00) AS 昨天开始; SELECT DATE_FORMAT( DATE_SUB(CURDATE(),…

docker创建的rabbitmq,启动容器时报:Failed to create thread: Operation not permitted (1)

原因:docker内的用户权限受限 启动docker时加上参数 --privilegedtrue docker run --privilegedtrue -d --name rabbitmq --restartalways -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 15671:15671 -p 25672:25672 -v /home/rabbitmq/data/:/var/rabbitm…

Backend - postgresSQL DB 存储过程(数据库存储过程)

目录 一、存储过程的特性 (一)作用 (二)特点 (三)编码结构的区别 二、定时执行存储过程 三、2种编码结构 (一)函数结构 1. SQL代码 2. 举例 (1)例1-循…

Flutter 中的 Scrollbar 小部件:全面指南

Flutter 中的 Scrollbar 小部件:全面指南 在Flutter中,滚动条(Scrollbar)是一种常见的UI组件,用于提供对滚动内容的快速访问和控制。Scrollbar 小部件可以附加到任何可滚动的widget上,如ListView、GridVie…