# 代码随想录项目精讲-webserver

代码随想录知识星球 (opens new window)在23年4月份发布了第一份项目精讲(java 论坛项目)以来,录友们就一直在期待C++项目的文档。

那么正如录友们所期待的,webserver(C++)精讲系列来了

主攻 cpp 的录友肯定都听过 WebServer 这个烂大街的项目,很多录友或多或少都会想过这个问题:

既然 WebServer 都人手一个了,为什么还要做这个项目,都202x年了还没有新的cpp项目出来吗

# 真的没有新的 cpp 项目出来吗?

新的cpp项目当然有,只是这些新项目的前置知识太多、可供参考的文档又不多,还要结合许多开源库使用,对于校招生(或者说对没有具体主攻方向的同学)来说学习成本太高了。

下面列举几个例子::

  • 一款简单、高效的实时视频服务器:https://github.com/ossrs/srs (音视频方向)
  • 轻量级中文 OCR 项目:https://github.com/DayBreak-u/chineseocr_lite (OCR)
  • 游戏《金庸群侠传》的 C++ 复刻版:https://github.com/scarsty/kys-cpp(游戏方向)
  • 在 C++ 上实现类似 Go goroutine 的库:https://github.com/idealvin/coost(工具库)
  • 阿里开源的轻量级 C++ 异步框架:https://github.com/alibaba/async_simple

# 为什么推荐做 WebServer?

1、cpper 能够找到的项目(有详细资料的)确实不多

对于科班 or 有充足实习经历 or 课题组项目丰富的同学来说,自然有许多相关的项目能够写在简历上。

但是对于项目经历贫乏的cpp转码选手来说,在网上能够找到的项目(有较详细资料的),无非就是比较简单的xx管理系统、五子棋等简易游戏、各种工具库、烂大街的WebServer,然后你就可以发现里面最高大上的还是 WebServer(还有个 RPC 框架)。

2、能够将面试所需的基础知识串联起来

WebServer 能够串联绝大部分的面试八股,语言(C/C++全覆盖,可以扩展至C++11/17)+操作系统(含有大量的 I/O 系统调用及其封装。

还有 EPOLL 等多路复用机制)+计算机网络(本身就是一个网络框架,对网络异常的处理)+数据库(注册中心的数据库语句、负载均衡等)。

当你的项目中涵盖了所有面试所需的基础知识后,面试官更倾向结合你的项目去考察知识,而不是东问一个西问一个,这样可以将面试的问题限制在一定的范围中,一定程度上降低了面试准备的难度

3、万物均能集成到 WebServer 中

WebServer 的本质上是一个高性能网络框架,它提供了一个单服务端(当然也可以扩展为多服务端)与多客户端的高效连接框架,但是客户端与服务端连接上以后具体应该做些什么(也就是有哪些业务),这就可以由我们自由发挥了,这就是 WebServer 的功能扩展。

目前大多数的 WebServer 都将从服务端获取 MIME 作为主要功能。

但实际上,之前说到的游戏可以放到上面(是不是就有点像对战平台了),管理系统可以放到上面、存储引擎(卡哥的skipList:https://github.com/youngyangyang04/Skiplist-CPP )等你能想到的都可以部署在 WebServer 上,这样看来,WebServer 本身具备相当的工作量。

# webserver烂大街,那面试官还会问吗?

这个问题其实是看面试官的,有的面试官就喜欢问一些每个候选人都有的东西,然后根据回答的差异(项目的新颖点、熟悉程度等)去进行筛选。

有的面试官则会挑他自己所感兴趣的项目去提问。

如果面试官在你的简历上没有发现特别感兴趣的项目时,他会让你自己挑一个你觉得做得最好的项目来讲,这个时候你就可以把 WebServer 拿出来讲了(此时大概率会是地狱难度,会挖的很细,因为面试官觉得你做的东西他都能看懂)。

但是这样有个问题,要是大伙都讲这个项目的话,我们肯定得有和别人不一样的地方,这也是面试官最看重的地方。至于怎么做到和别人不同,大概可以从性能优化和功能扩展两部分入手,这个我们后面再讲

# 代码随想录知识星球项目精讲

所以知识星球 (opens new window)里整理webserver项目精讲。

这份PDF不仅告诉大家,为什么还可以做webserver,适合哪类人群,还系统讲了webserver所需要的基础知识, 并且把面试官常问问题、项目细节、优化策略以及测试方案,统统系统梳理出来,帮助 CPP录友们克服项目这一难关。

这份PDF有多全,大家看看目录就知道了:

  • 前言
    • 为什么还要做 WebServer?
    • WebServer所需要的基础知识
      • 编程语言
      • 操作系统
      • 计算机网络
      • 数据库
    • 参考书籍
  • 怎么找到一个靠谱的WebServer
  • 拿到源代码先不要急着写
    • 功能测试
    • 框架梳理
  • 终于可以开始写了
    • 并发框架
      • EventLoop
      • Channel
      • Poller
    • 日志系统
    • 内存池
    • 线程池
    • LFU
  • 写好了就完了吗?
    • 部署(没有云服务器的同学可以跳过)
    • 性能测试
  • 面试问题
    • 项目介绍
      • 简单介绍一下你的项目
      • 项目中的难点?
      • 项目中遇到的困难?是如何解决的?
      • 针对项目做了哪些优化?
      • 项目中用到哪些设计模式?
      • 这个web服务器是你自己申请的域名吗
      • C++ 面向对象特性在项目中的体现
  • 项目细节
    • 线程池
      • 你的线程池工作线程处理完一个任务后的状态是什么?
      • 讲一下你项目中线程池的作用?具体是怎么实现的?有参考开源的线程池实现吗?
      • 请你实现一个简单的线程池(现场手撕)
    • 日志系统
    • 缓存机制
    • 内存池
      • 讲一讲为什么要加入内存池?项目中所有的内存申请都走内存池吗?
    • 并发性问题
      • 如果同时1000个客户端进行访问请求,线程数不多,怎么能及时响应处理每一个呢?
      • 如果一个客户请求需要占用线程很久的时间,会不会影响接下来的客户请求呢,有什么好的策略呢?
    • IO多路复用
      • 说一下什么是ET,什么是LT,有什么区别?
      • LT什么时候会触发?ET呢?
      • 为什么ET模式不可以文件描述符阻塞,而LT模式可以呢?
      • 你用了epoll,说一下为什么用epoll,还有其他多路复用方式吗?区别是什么?
    • 并发模型
      • reactor、proactor模型的区别?
      • reactor模式中,各个模式的区别?
    • 跳表 skiplist
    • 测试相关问题
      • 你是如何对项目进行测试的?
  • 星球资料

部分PDF截图如下:

# 下载方式

本PDF文档仅为星球内部专享,大家可以加入知识星球 (opens new window)里获取PDF

这里给出10元代金券,领代金券加入。

如果确实想白嫖文档,知识星球支持三天内全额退款,可以进去领完PDF再退款(大实话了),退款方式在知识星球APP右上角。(全程无套路)

这份PDF就在知识星球置顶一,和星球其他独家资料都放在一起的,大家可以一起下载。 (后面知识星球里的项目文档会越来越全,想学习的录友可以趁早加入)

已经有近2w录友加入了知识星球 (opens new window)方向比努力更重要,一群人可以走的更远!

上次更新:: 11/30/2023, 10:16:49 AM
@2021-2022 代码随想录 版权所有 粤ICP备19156078号