webserver如何从零开始?

简介: webserver如何从零开始?

       我们要做一个项目,过程是怎么样的呢?git clone ...部署,测试,然后开始写么,这样你大概率会“猪脑过载”,对一个项目的每个部分都没有清晰认识,能写出什么来?写之前当然需要测试每个功能,然后理清项目的框架,整个项目大概有哪几个模块组成(最好画个图),这几个模块具体功能是什么,模块之前的嵌套关系是怎么样的。这样理清后,那写细节的时候就会有总体的方向,每一个函数都是下一个函数的输入或者输出。


       整个大致流程,以项⽬qinguoyi/TinyWebServer: Linux下C++轻量级WebServer服务器 (github.com) 为例,下面是原作者的框架图。

       将代码克隆本地

git init ## 将本地仓库初始化
git clone <url> ## 将需要的项⽬从 github 上克隆下来,url为项⽬地址
  • 服务器测试环境
  • Ubuntu版本16.04
  • MySQL版本5.7.29
  • 浏览器测试环境
  • Windows、Linux均可
  • Chrome
  • FireFox
  • 其他浏览器暂无测试

测试前确认已安装MySQL数据库

// 建立yourdb库
create database yourdb;
 
// 创建user表
USE yourdb;
CREATE TABLE user(
    username char(50) NULL,
    passwd char(50) NULL
)ENGINE=InnoDB;
 
// 添加数据
INSERT INTO user(username, passwd) VALUES('name', 'passwd');

修改main.cpp中的数据库初始化信息

//数据库登录名,密码,库名
string user = "root";
string passwd = "root";
string databasename = "yourdb";
  • build
sh ./build.sh
  • 启动server
./server
  • 浏览器端
ip:9006

       按照上诉方法部署后,浏览器输入localhost:9006就能打开了 。接下来就是功能测试,

然后根据上面的图,从图中我们可以看到,项⽬中搭建了⼀个半同步/反应堆线程池,在其中维护了⼀个请求队列,线程池中的主线程通过 epoll 来监听 socket,并且将请求队列中的任务分配给线程池中的⼯作线程,其中⼯作线程能够处理的任务分 为⽇志输出、定时器处理⾮活动连接以及处理 HTTP 请求三种。


(整个的框架图自己再数理一遍,下图来源见水印)

       ⾸先,许多 client 在访问 WebServer 时,并不是每个 client 都由⼀个服务端的线程 / 进程进⾏业务处理,这样在⾼ 并发(多个 client 同时访问服务端)的场景中,服务端的响应速度,并且服务端本身可以建⽴的线程 / 进程数也是 有限的,这样的⽅式也很容易导致服务端的崩溃。

       因此,muduo 使⽤⾮阻塞的 poll/epoll ( IO multiplexing 多路复⽤)轮训监听 (Reactor) 有 SOCKET 读写 IO 事 件, 将IO 事件的处理回调函数分发到线程池中,实现异步返回结果。在多线程编程模型中采⽤了 "one loop per thread + thread pool" 的形式。⼀个线程中有且仅有⼀个 EventLoop (也就是说每⼀个核的线程负责循环监听⼀组 ⽂件描述符的集合),这个线程称之为IO 线程。如果⻓时间没有事件发⽣, IO 线程将处于空闲状态,这时可以利 ⽤IO 线程来执⾏⼀些额外的任务(利⽤定时器任务队列来处理超时连接),这就要求⾮阻塞的 poll/epoll 能够在⽆IO事件但有任务到来时能够被唤醒。

       这里的muduo库是陈硕个人开发的TCP网路编程库, 最核⼼的部分就是 EventLoop 、

Channel 以及 Poller 三个类,其中 EventLoop 可以看作是对业务线程的封装,⽽ Channel 可以看作是对每个已经建⽴连接的封装(即 accept(3) 返回的⽂件描述符)。

 

       下一篇分享muduo中的一些模块细节和作用~

相关文章
|
1月前
|
应用服务中间件 PHP 开发工具
Nginx解析环境搭建及实战
Nginx解析环境搭建及实战
32 0
|
10月前
|
前端开发 应用服务中间件 nginx
前端学习笔记202305学习笔记第二十三天-nginx项目部署500情况
前端学习笔记202305学习笔记第二十三天-nginx项目部署500情况
51 0
|
9月前
|
缓存 负载均衡 安全
Nginx__高级进阶篇
Nginx__高级进阶篇
|
tengine 应用服务中间件 网络安全
nginx学习(核心配置详解)
nginx学习(核心配置详解)
143 0
|
应用服务中间件 网络安全 Apache
Nginx网站服务配置文件实操看这篇就够了(一)
Nginx网站服务配置文件实操看这篇就够了(一)
244 0
Nginx网站服务配置文件实操看这篇就够了(一)
|
域名解析 应用服务中间件 nginx
Nginx网站服务配置文件实操看这篇就够了(三)
Nginx网站服务配置文件实操看这篇就够了(三)
137 0
Nginx网站服务配置文件实操看这篇就够了(三)
|
缓存 负载均衡 监控
Nginx网站服务配置文件实操看这篇就够了(二)
Nginx网站服务配置文件实操看这篇就够了(二)
979 0
Nginx网站服务配置文件实操看这篇就够了(二)
|
Kubernetes Java 应用服务中间件
kubernetes下的Nginx加Tomcat三部曲之二:细说开发
详细说明在kubernetes部署上述网络服务时,需要做哪些具体的工作
126 0
kubernetes下的Nginx加Tomcat三部曲之二:细说开发
|
负载均衡 前端开发 安全
Nginx从入门到实战,一学就会!
Nginx从入门到实战,一学就会!
124 0
Nginx从入门到实战,一学就会!
|
缓存 负载均衡 前端开发
nginx简介及入门
粗略简单的介绍下nginx相关知识
184 0