目录
[1. 必须掌握的核心(Core)](#1. 必须掌握的核心(Core))
[2. 强烈建议掌握的进阶(Advanced)](#2. 强烈建议掌握的进阶(Advanced))
[3. 加分项 / 进阶方向(Optional)](#3. 加分项 / 进阶方向(Optional))
[阶段 0:环境 + 现代 C++ 基础巩固](#阶段 0:环境 + 现代 C++ 基础巩固)
[阶段 1:从零写出一个「多客户端 echo 服务器」](#阶段 1:从零写出一个「多客户端 echo 服务器」)
[阶段 2:引入多线程 + 聊天室项目](#阶段 2:引入多线程 + 聊天室项目)
[阶段 3:二进制协议 + Protobuf + 简易"业务服务"](#阶段 3:二进制协议 + Protobuf + 简易“业务服务”)
[阶段 4:HTTP + 数据库 + RESTful API](#阶段 4:HTTP + 数据库 + RESTful API)
[阶段 5(进阶):迷你 RPC 框架雏形(可选但非常推荐)](#阶段 5(进阶):迷你 RPC 框架雏形(可选但非常推荐))
[三、一个可以直接照着打勾的 Checklist](#三、一个可以直接照着打勾的 Checklist)
-
网络后端 / 高性能 C++ 服务端:最关键技术栈一览(按优先级)
-
项目驱动的学习路线(一步步做小项目把知识串起来)
-
最后给你一个可以照着打勾的 checklist
一、最关键技术栈(按优先级)
1. 必须掌握的核心(Core)
① 现代 C++(以 C++11/14/17 为主)
-
内存 & 资源管理:RAII、智能指针(
unique_ptr/shared_ptr)、对象生命周期 -
值类别:左值/右值、移动语义(
std::move、移动构造/赋值) -
STL:
vector/map/unordered_map/string/chrono等常用容器和工具 -
语言特性:
auto、range-based for、lambda、constexpr、enum class -
并发库:
std::thread、mutex、lock_guard、unique_lock、condition_variable、atomic
② Linux 基础 + C++ 开发环境
-
常用命令:
ls、cd、ps、top、netstat/ss、strace -
进程 / 线程 概念:PID,fork,退出码,信号(
SIGINT、SIGTERM) -
文件描述符:打开/关闭、阻塞/非阻塞
-
构建 & 调试:
g++、cmake、gdb基本用法、valgrind查内存问题
③ 网络编程(重点!)
-
TCP / UDP 基础(连接、三次握手、半关闭、粘包/拆包概念)
-
socket API:
socket/bind/listen/accept/connect/send/recv -
阻塞与非阻塞 I/O;
fcntl设置 non-blocking -
IO 多路复用:
select、poll、epoll(必须要会) -
典型模式:Reactor 模式、线程池 + 事件循环
④ 多线程并发模型
-
线程创建 / 退出、线程池
-
互斥锁、读写锁、条件变量
-
竞态条件、死锁、假唤醒
-
原子操作
std::atomic基本使用
⑤ 协议 & 序列化(基础版)
-
文本协议:HTTP(请求行、头、Body)、简单自定义文本协议
-
二进制协议 基本思想:包头(长度、类型、序列号) + 包体
-
序列化工具:Protobuf(足够你用很久)
⑥ 日志、配置、测试
-
日志:
spdlog或自己封装一个简单异步日志 -
配置:读 JSON/YAML 配置文件(如
nlohmann/json) -
单元测试框架:
Google Test(gtest)------至少会写基础测试 -
简单压测:用
wrk/ab这类工具对服务 QPS、延迟做个感性认识
2. 强烈建议掌握的进阶(Advanced)
① 一个主力网络库(择一深入)
-
Boost.Asio/ standalone Asio -
或学习别人开源的 C++ 服务器框架的设计思路(muduo 等)
② 数据库 / 缓存基本使用
-
MySQL:基本增删改查、事务概念
-
连接池的概念
-
Redis:KV 缓存,用作会话/简单队列
③ 服务端工程化
-
配置热加载
-
统一错误码/返回码设计
-
模块化(网络层 / 逻辑层 / 存储层分离)
3. 加分项 / 进阶方向(Optional)
-
简单 RPC 框架原理、gRPC 使用
-
消息队列概念(Kafka/RabbitMQ,用客户端 SDK)
-
分布式基础概念:注册中心、心跳、负载均衡、服务发现
-
性能调优工具:
perf、火焰图 思想
这些可以在你把"Core + Advanced"打牢之后再逐步加。
二、项目驱动学习路线(一步一步来)
我按"阶段"来设计,每个阶段都有:
-
要学的知识点
-
一个项目(你可以真实敲出来)
你可以理解为 4 大阶段,每个阶段大概 3~6 周,看你每天投入时间。
阶段 0:环境 + 现代 C++ 基础巩固
目标:
在 Linux 下自然写 C++,熟悉现代语法和基本调试。
要学:
-
在 Linux 下用
g++/cmake编译项目 -
C++11/14 核心语法:智能指针、
auto、lambda、move、thread -
用
gdb打断点、单步调试、看栈
练手小项目:控制台"任务管理器"
功能示例:
-
每隔 1 秒打印当前系统:
-
CPU 利用率(简单版可以只显示
/proc/stat分析结果) -
内存使用情况
-
-
支持简单命令:
-
list:列出当前进程数 -
quit:退出程序
-
要点:
-
用
std::thread做一个后台线程定时采集数据 -
主线程负责读用户输入命令
-
用
mutex保护共享数据(采集线程和主线程)
阶段 1:从零写出一个「多客户端 echo 服务器」
目标:
掌握 socket、阻塞/非阻塞 IO、epoll 基本使用。
要学:
-
TCP 基础:三次握手、四次挥手概念
-
socket API:创建、绑定、监听、接受连接、发送/接收
-
epoll:epoll_create/epoll_ctl/epoll_wait -
非阻塞模式 & 简单的事件循环
项目:epoll + 多客户端 echo server
功能:
-
服务端监听一个端口
-
多个客户端(你可以用
telnet/nc连)连接上来 -
客户端发什么,服务端就原样回什么
-
客户端断开,服务端能正常识别并清理资源
加一点工程化:
-
把"连接"封装成一个
Connection类 -
把"事件循环"封装到一个类,比如
EventLoop -
写简单日志(到文件即可)
阶段 2:引入多线程 + 聊天室项目
目标:
把多线程、线程池、锁玩明白,做出一个真正"可用"的小服务。
要学:
-
线程池设计:任务队列 + 工作线程
-
互斥锁、条件变量
-
简单的生产者-消费者模型
-
设计一个简单的文本协议(比如:
LOGIN:xxx、MSG:xxx)
项目:多人聊天室服务器(文本协议)
功能示例:
-
客户端通过 TCP 连接上来,先发
LOGIN:用户名 -
服务器保存"连接 ↔ 用户名"的映射
-
用户发
MSG:内容,服务器把内容转发给所有在线用户 -
支持简单命令,如
LIST(列出在线用户)
实现要点:
-
使用线程池处理消息解析和业务逻辑,网络线程只负责收发
-
用一个线程安全队列,把从 socket 收到的数据扔到线程池处理
-
注意:
-
粘包/拆包:可以规定一行一条消息,用
\n分行 -
连接断开时要清理对应用户和资源
-
阶段 3:二进制协议 + Protobuf + 简易"业务服务"
目标:
真正写一次"有协议、有结构"的服务,而不是随便发字符串。
要学:
-
Protobuf:
-
定义
.proto文件 -
生成 C++ 类
-
序列化 / 反序列化到字节流
-
-
设计一个"长度 + 类型 + 序列号 + body"的简单包结构
-
简单的用户认证 / 状态管理
项目:小型「任务管理系统」服务(TCP + Protobuf)
功能示例(就当它是一个内部管理服务):
-
客户端可以:
-
LoginRequest:登录 -
CreateTaskRequest:创建任务(标题、描述) -
ListTasksRequest:获取我的任务列表
-
-
服务端:
-
内存里维护任务列表(结构体或简单数据库)
-
使用 Protobuf 定义请求/响应消息
-
要点:
-
在流式 TCP 上实现"先读包头(4 字节长度)→ 再读包体 → 交给业务处理"
-
业务处理完成后,序列化响应消息,再打包发送
-
在代码结构上,最好能形成:
-
网络层(连接、读写、事件循环)
-
协议层(编解码)
-
业务层(处理请求)
-
阶段 4:HTTP + 数据库 + RESTful API
目标:
学会写一个简单 HTTP 服务,接 MySQL/Redis,离实际业务再近一步。
要学:
-
HTTP 协议基本格式
-
(可以)自己实现一个简单 HTTP 解析器,或用现成的小 HTTP 库练手
-
MySQL C++ 客户端库使用(或者用简单 ORM 库)
-
RESTful 风格:GET / POST / PUT / DELETE 的基本约定
项目:简单「Todo List」Web 服务
功能示例:
-
HTTP API:
-
POST /api/todo创建待办 -
GET /api/todo获取列表 -
PUT /api/todo/:id修改 -
DELETE /api/todo/:id删除
-
-
数据存 MySQL(表结构很简单:id、title、done、create_time)
要点:
-
初版可以只支持 JSON Body,返回 JSON
-
引入配置文件(端口、数据库地址)
-
加日志记录每个请求:
- 时间、方法、路径、耗时、返回码
阶段 5(进阶):迷你 RPC 框架雏形(可选但非常推荐)
目标:
理解"中间件 / RPC 框架"大致长什么样,为以后走高性能 + 分布式打基础。
要学:
-
RPC 基本概念:服务端/客户端 stub、请求 ID、超时、重试
-
服务注册:可以先本地配置文件模拟
-
简单的连接池设计
项目:自制迷你 RPC
功能示意:
-
你在客户端这样写代码:
RpcClient client("127.0.0.1", 9000); int sum = client.call<int>("AddService.Add", 1, 2); -
实际上:
-
call内部把方法名、参数打包成 Protobuf 消息,发给服务端 -
服务端根据"服务名/方法名"找到对应函数执行,返回结果
-
要点:
-
请求中带 request_id,响应携带对应 id
-
客户端用
std::promise/std::future或条件变量等待响应 -
设置超时机制(比如 3 秒超时返回错误)
做到这一步,你就已经明显超过大多数"只会写业务代码的 C++ 后端"了。
三、一个可以直接照着打勾的 Checklist
你可以把这当作自己的学习进度表:
语言与基础
-
熟悉智能指针 / RAII / move 语义
-
能用
std::thread+mutex写多线程程序 -
会在 Linux 下编译、运行、调试 C++ 程序(g++ + cmake + gdb)
网络与并发
-
独立写出 socket echo server(单客户端)
-
用
epoll支持多客户端连接 -
通过线程池实现业务与 IO 分离
-
能解释粘包/拆包、阻塞/非阻塞含义
协议与工程化
-
能使用 Protobuf 定义并序列化消息
-
实现"包头 + 包体"的二进制协议解析
-
有一个项目使用了 Protobuf + 自定义协议
-
项目里有日志 & 配置文件支持
业务能力
-
能写一个简单 HTTP 服务
-
接入 MySQL 做增删改查
-
提供 RESTful 风格 API(哪怕只支持几种方法)
进阶(加分)
-
看过/用过 Asio 或类似 C++ 网络库
-
做过一个迷你 RPC demo(哪怕很简陋)
-
会使用简单的压测工具测自己服务的 QPS