# 代码随想录项目精讲-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),方向比努力更重要,一群人可以走的更远!