文章目录
-
- 从零手写高并发服务器(一):项目介绍与开发环境搭建
- 一、项目目标:我们要做什么?
-
- [1.1 项目定位](#1.1 项目定位)
- [1.2 什么是HTTP服务器?](#1.2 什么是HTTP服务器?)
- [1.3 Reactor模型分类](#1.3 Reactor模型分类)
-
- [1. 单Reactor单线程](#1. 单Reactor单线程)
- [2. 单Reactor多线程](#2. 单Reactor多线程)
- [3. 多Reactor多线程(主从Reactor)------ 我们要实现的](#3. 多Reactor多线程(主从Reactor)—— 我们要实现的)
- [1.4 模块划分](#1.4 模块划分)
- 二、开发环境搭建
-
- [2.1 我的环境信息](#2.1 我的环境信息)
- [2.2 检查编译环境](#2.2 检查编译环境)
- [2.3 创建项目目录](#2.3 创建项目目录)
- [2.4 初始化Git仓库](#2.4 初始化Git仓库)
- [2.5 VSCode远程连接](#2.5 VSCode远程连接)
- [2.6 修改系统限制(重要!)](#2.6 修改系统限制(重要!))
- 三、本篇总结
从零手写高并发服务器(一):项目介绍与开发环境搭建
💬 开篇 :这个系列我们要从零实现一个仿muduo库的One Thread One Loop式主从Reactor模型高并发服务器。这不是一个玩具项目,而是一个真正能用于生产环境的高性能服务器组件库。通过这个项目,你将彻底掌握Linux网络编程的精髓,理解Nginx、Redis等明星项目的底层架构思想。
👍 点赞、收藏与分享:这是一个完整的实战项目,代码可以直接复制运行。如果你想真正掌握C++服务器开发,这个系列不容错过。
🚀 循序渐进:我们采用敏捷迭代开发,每个模块写完都能测试、看到效果。从环境搭建开始,一步步构建完整的高并发服务器。
一、项目目标:我们要做什么?
1.1 项目定位
我们要实现的是一个高并发服务器组件库,基于这个组件库,可以快速搭建各种高性能服务器。
核心特点:
- 主从Reactor模型:主Reactor负责监听新连接,子Reactor负责处理通信
- One Thread One Loop:每个线程对应一个事件循环,所有操作都在对应线程内完成
- 协议支持:提供HTTP协议组件,方便快速搭建HTTP服务器
要明确的是:我们实现的是一个服务器组件,本身不包含具体业务。就像muduo库一样,它是一个基础设施,业务逻辑由使用者自己实现。
1.2 什么是HTTP服务器?
HTTP(Hyper Text Transfer Protocol)是应用层协议,是一种简单的请求-响应协议。
关键认知:HTTP服务器本质上就是一个TCP服务器,只不过在应用层基于HTTP协议格式进行数据的组织和解析。
实现HTTP服务器的步骤:
- 搭建一个TCP服务器,接收客户端请求
- 以HTTP协议格式解析请求数据,明确客户端目的
- 根据请求提供对应服务
- 将服务结果以HTTP协议格式组织,发送给客户端
实现一个HTTP服务器很简单,但实现一个高性能的服务器并不简单。这就是我们这个项目的价值所在。
1.3 Reactor模型分类
Reactor模式是指通过一个或多个输入同时传递给服务器进行请求处理时的事件驱动处理模式。
简单理解:使用IO多路复用统一监听事件,收到事件后分发给处理进程或线程。
1. 单Reactor单线程
bash
┌─────────────────────────────┐
│ 单Reactor单线程 │
│ │
│ IO多路复用监控所有fd │
│ ↓ │
│ 新连接?→ accept │
│ 数据到来?→ 读取+处理+响应 │
│ │
│ 全部在一个线程中完成 │
└─────────────────────────────┘
优点 :简单,不涉及线程间通信和资源争抢
缺点 :无法利用多核CPU,容易达到性能瓶颈
适用场景:客户端数量少,处理速度快的场景
2. 单Reactor多线程
bash
┌─────────────────────────────┐
│ Reactor线程 │
│ IO多路复用监控所有fd │
│ ↓ │
│ 新连接?→ accept │
│ 数据到来?→ 接收后分发 │
└──────────┬──────────────────┘
│
┌────────────────┼────────────────┐
↓ ↓
[Worker线程1] [Worker线程2] [Worker线程3]
业务处理 业务处理 业务处理
│ │ │
└────────────────┴────────────────┘
↓
响应交给Reactor线程发送
优点 :充分利用多核CPU
缺点:多线程数据共享复杂,单Reactor容易成为瓶颈
3. 多Reactor多线程(主从Reactor)------ 我们要实现的
bash
┌─────────────────────────────┐
│ 主Reactor(主线程) │
│ 只监控监听描述符 │
│ 新连接 → 分发给子Reactor │
└──────────┬──────────────────┘
│ 分发新连接
┌────────────────┼────────────────┐
↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│子Reactor1│ │子Reactor2│ │子Reactor3│
│监控通信fd│ │监控通信fd│
│读写+业务 │ │读写+业务 │ │读写+业务 │
└──────────┘ └──────────┘ └──────────┘
优点:
- 主Reactor专注获取新连接,保证高并发性能
- 子Reactor各司其职,充分利用多核
- One Thread One Loop,线程安全
这就是我们要实现的架构!
1.4 模块划分
整个项目分为两大模块:
SERVER模块:实现Reactor模型的TCP服务器
- Buffer模块:用户态缓冲区
- Socket模块:套接字操作封装
- Channel模块:描述符事件管理
- Poller模块:epoll封装
- TimerWheel模块:定时任务管理(时间轮)
- EventLoop模块:事件循环(Reactor核心)
- Connection模块:通信连接管理
- Acceptor模块:监听连接管理
- TcpServer模块:服务器整体封装
HTTP协议模块:提供HTTP协议支持
- Util模块:工具函数
- HttpRequest模块:请求数据
- HttpResponse模块:响应数据
- HttpContext模块:请求接收上下文
- HttpServer模块:HTTP服务器封装
二、开发环境搭建
2.1 我的环境信息
| 项目 | 配置 |
|---|---|
| 云服务器 | 腾讯云 Ubuntu Server 22.04 LTS 64bit |
| 服务器配置 | 2核4G |
| 本地系统 | Windows |
| 远程连接 | Xshell 8 + VSCode Remote SSH |
| 代码托管 | Gitee |
2.2 检查编译环境
这个项目需要g++ 7.3及以上版本 ,因为我们会用到C++17的std::any特性。
在Xshell中执行:
bash
# 检查g++版本
g++ --version
Ubuntu 22.04自带的g++版本是11.x,完全满足要求:
bash
wsh@VM-16-2-ubuntu:~$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
如果你的版本低于7.3,需要升级(CentOS 7用户注意):
bash
# CentOS 7 升级g++的方法(Ubuntu 22.04不需要)
sudo yum install centos-release-scl-rh centos-release-scl
sudo yum install devtoolset-7-gcc devtoolset-7-gcc-c++
source /opt/rh/devtoolset-7/enable
echo "source /opt/rh/devtoolset-7/enable" >> ~/.bashrc
2.3 创建项目目录
bash
# 进入home目录
cd ~
# 创建项目目录
mkdir -p TcpServer
# 进入项目目录
cd TcpServer
# 查看当前路径
pwd
bash
wsh@VM-16-2-ubuntu:~$ mkdir -p TcpServer
wsh@VM-16-2-ubuntu:~$ cd TcpServer
wsh@VM-16-2-ubuntu:~/TcpServer$ pwd
/home/wsh/TcpServer
2.4 初始化Git仓库
步骤1:在Gitee上创建仓库
-
登录 Gitee
-
点击右上角
+→新建仓库 -
填写信息:
- 仓库名称:
TcpServer - 路径:
TcpServer - 仓库介绍:
仿muduo库One Thread One Loop式主从Reactor模型高并发服务器 - 选择:
公开 - 不要勾选"使用Readme文件初始化这个仓库"
- 仓库名称:
-
点击
创建
步骤2:本地初始化并关联远程仓库
bash
# 确保在项目目录下
cd ~/TcpServer
# 初始化git仓库
git init
# 配置用户信息(如果没配置过)
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
# 关联远程仓库(替换成你自己的仓库地址)
git remote add origin https://gitee.com/你的用户名/TcpServer.git
# 创建.gitignore文件
cat > .gitignore << 'EOF'
# 编译产物
*.o
*.out
*.exe
main
server
client*
# 编辑器临时文件
*.swp
*.swo
*~
.vscode/
# 系统文件
.DS_Store
Thumbs.db
# 日志文件
*.log
EOF
# 创建README.md
cat > README.md << 'EOF'
# TcpServer
仿muduo库One Thread One Loop式主从Reactor模型高并发服务器
## 项目简介
基于C++11/17实现的高性能TCP服务器组件库,支持HTTP协议。
## 功能特性
- 主从Reactor模型
- One Thread One Loop设计
- 支持HTTP协议
- 支持定时器(时间轮)
- 支持非活跃连接超时释放
## 目录结构
TcpServer/
├── source/ # 源代码目录
│ ├── server.hpp # 服务器核心组件
│ ├── http/ # HTTP协议支持
│ └── echo/ # Echo服务器示例
├── test/ # 测试代码
└── example/ # 前置知识示例代码
## 编译环境
- Ubuntu 22.04 LTS
- g++ 11.4.0 (支持C++17)
## 作者
学习项目,仿muduo库实现
EOF
# 查看状态
git status
步骤3:创建项目目录结构
bash
# 创建目录结构
mkdir -p source/http source/echo test example
# 查看目录结构
tree . 2>/dev/null || ls -la
如果没有tree命令,可以安装:
bash
sudo apt install tree -y
bash
wsh@VM-16-2-ubuntu:~/TcpServer$ tree .
.
├── example
├── README.md
├── source
│ ├── echo
│ └── http
└── test
5 directories, 1 file
步骤4:首次提交
bash
# 添加所有文件
git add .
# 提交
git commit -m "初始化项目结构"
# 推送到远程仓库(首次推送需要设置上游分支)
git push -u origin master
如果提示输入用户名密码,输入你的Gitee账号密码即可。
2.5 VSCode远程连接
- 打开VSCode
- 安装插件:
Remote - SSH - 按
F1或Ctrl+Shift+P,输入Remote-SSH: Connect to Host - 输入:
用户名@IP(替换成你的用户名和IP) - 输入密码
- 连接成功后,点击
打开文件夹,选择/home/wsh/TcpServer
现在你可以在VSCode中直接编辑服务器上的代码了!
2.6 修改系统限制(重要!)
高并发服务器需要处理大量连接,需要修改系统的文件描述符和进程数限制。
bash
# 查看当前限制
ulimit -n # 文件描述符数量
ulimit -u # 进程数量
修改配置文件 /etc/security/limits.conf:
bash
sudo vim /etc/security/limits.conf
在文件末尾添加:
bash
# 高并发服务器配置
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
修改 /etc/security/limits.d/ 下的配置(如果存在):
bash
# Ubuntu可能没有这个文件,有的话才需要改
sudo vim /etc/security/limits.d/20-nproc.conf
bash
* soft nproc 65535
root soft nproc unlimited
重新登录后生效:
bash
# 退出当前会话
exit
# 重新连接后验证
ulimit -n
ulimit -u
三、本篇总结
这一篇我们完成了:
- 明确项目目标:仿muduo库的主从Reactor模型高并发服务器
- 理解Reactor模型:单Reactor单线程 → 单Reactor多线程 → 多Reactor多线程
- 搭建开发环境:Ubuntu 22.04 + g++ 11.4
- 初始化Git仓库:创建Gitee仓库,建立项目目录结构
- 配置系统限制:为高并发做准备
当前项目结构:
bash
TcpServer/
├── .git/
├── .gitignore
├── README.md
├── example/ # 前置知识示例代码(下一篇用)
├── source/ # 源代码目录
│ ├── echo/ # Echo服务器
│ └── http/ # HTTP服务器
└── test/ # 测试代码
💬 下一篇预告 :我们将学习项目中用到的前置知识------
std::bind、智能指针、timerfd定时器、时间轮思想。这些是理解后续代码的基础,每个知识点都会有可运行的示例代码。