webserver如何从零开始?

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

        整个大致流程,以项⽬qinguoyi/TinyWebServer: LinuxC++轻量级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中的一些模块细节和作用~ 

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员行者孙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值