Web服务器整体工作流程

项目中主要用到的技术栈有如下几个
技术栈:
  基于多进程网络通信和匿名管道技术的Web bench测试工具;
  基于互斥锁和条件变量等多线程同步技术实现的半同步半反应堆线程池模块,实现将多个任务同时分配给多个线程;
  基于Socket编程和IO复用技术Epoll实现的Reactor模拟的Proactor高并发模型,实现同时监听多个客户端事件;
  基于最小堆结构的定时器模块,实现非活动连接的超时管理;
  基于主从状态机的HTTP/1.1解析和响应模块支持解析GET和POST请求,实现处理Web资源的请求;
//支持分散读和集中写的缓冲区模块,实现缓存数据的合理管理,提高文件数据拷贝效率;
  基于RAII机制实现的MySQL数据库连接池模块,减少数据库连接建立与关闭的开销;
  基于单例模式和阻塞队列的同步/异步日志系统,实现以文件形式按日期记录服务器运行信息;

  整体大致的功能大概如下所示:
在这里插入图片描述
  首先建立了一个半同步/半反应堆的线程池,这个线程池中主线程是同步I/O的部分,负责使用epoll监听socket去和客户端建立连接,建立连接之后,把请求放入了请求队列中,这时通过一个信号量去唤醒所有工作线程(如果线程都被占用,就在请求队列中等待,如果有线程没被占用,空闲的线程就抢占式的去竞争这个任务)。
  拿到任务之后线程开始工作可能去进行日志的记录也可能去解析web服务器中的HTTP请求,先是解析HTTP的请求报文,这里通过主从状态机来实现,解析完请求报文之后会区分出客户的要求是GET(进入欢迎界面),还是POST(跳转到注册页面,跳转到登陆界面,进行登陆校验成功后去资源请求成功界面,登陆校验失败后登陆失败页面,请求图片页面,往KV存储引擎中插入一段语句,往KV存储引擎中去取出数据打印出来)。
  GET请求就直接返回一个登陆界面,POST请求中需要涉及到数据库的操作,这里就使用数据库连接池(建立的过程也是单例模式),建立了一个和数据库的连接,防止经常的销毁和终止,然后当有登陆请求时就通过CGI校验查看用户是否成功登陆,具体过程就是把数据库的user表拷贝到本地服务器的map中,和用户的数据比对区别用户是否登陆成功。
  并且为建立的每一个HTTP连接都创建了定时器,定时器是一个升序排列的链表,每个5ms就发送一个信号,触发信号处理函数看是否长时间无操作,就断开最长的连接。
  此外还是用单例模式创建了一个日志系统,日志支持数据的同步写入和异步写入,区别的条件就是在创建消息队列时设置队列大小为0 就是异步,异步状态下,写入的消息在格式化之后先放入消息队列并创建了一个写线程,线程在空闲时才会去读取消息队列中的数据进行存储,而同步写入日志写入函数与工作线程串行执行。
同时使用Web bench去进行压测,这个的原理。
  基于跳表的KV存储引擎的实现,服务器中的user在存储之后也会在本地存储引擎中进行存储。

HTTP使用状态机来解析收到的报文,几个状态转移变化如下图所示:
在这里插入图片描述
浏览器发送请求报文,到根据状态机处理数据,再到响应报文回发的一个过程。
在这里插入图片描述
对于那些连接,使用定时器去处理一些经常不使用的连接。

除此之外还完成了日志系统的建立,支持同步异步日志
在这里插入图片描述

对于HTTP报文解析之后不同的请求会跳转到不同的界面比如登陆,注册等。

大致流程:
创建服务器
在这里插入图片描述
启动服务器
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值