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中的一些模块细节和作用~

相关文章
|
11月前
|
Java 应用服务中间件 开发工具
小白带你学习Tomcat的基础
小白带你学习Tomcat的基础
78 0
|
6月前
|
Java 关系型数据库 应用服务中间件
Tomcat详解(五)——jforum论坛部署实战
Tomcat详解(五)——jforum论坛部署实战
73 2
|
缓存 负载均衡 安全
Nginx__高级进阶篇
Nginx__高级进阶篇
|
负载均衡 Ubuntu Unix
【Ruby on Rails全栈课程】5.5 项目上线--nginx+unicorn部署项目、域名映射
1、域名映射准备材料 云服务器以及域名(参考5.1 购买服务器、域名) nginx unicorn 2、安装以及设置nginx
763 0
【Ruby on Rails全栈课程】5.5 项目上线--nginx+unicorn部署项目、域名映射
|
Kubernetes Java 应用服务中间件
kubernetes下的Nginx加Tomcat三部曲之二:细说开发
详细说明在kubernetes部署上述网络服务时,需要做哪些具体的工作
162 0
kubernetes下的Nginx加Tomcat三部曲之二:细说开发
|
Kubernetes Java 应用服务中间件
Docker下的OpenResty三部曲之三:OpenResty加Tomcat的服务
前面两章我们实战了OpenResty的lua脚本开发,并且将web服务发布在Docker环境下,本章我们在kubernetes环境下搭建OpenResty加Tomcat的web服务
309 0
Docker下的OpenResty三部曲之三:OpenResty加Tomcat的服务
|
应用服务中间件 Apache nginx
|
负载均衡 前端开发 安全
Nginx从入门到实战,一学就会!
Nginx从入门到实战,一学就会!
139 0
Nginx从入门到实战,一学就会!
|
缓存 负载均衡 前端开发
nginx简介及入门
粗略简单的介绍下nginx相关知识
197 0
|
前端开发 JavaScript 应用服务中间件
从零开始使用nginx系列(1)部署前端项目
安装nginx 在nginx官网下载nginx,下载完毕后将压缩包放入云服务器中。 使用的云服务器环境为CentOS。 安装nginx相关依赖:gcc-c++、pcre-devel、zlib-devel、openssl、openssl-devel。
3937 0
从零开始使用nginx系列(1)部署前端项目