完整教程:C++后端总览
目录
阶段 3:二进制协议 + Protobuf + 简易“业务服务”
网络后端 / 高性能 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-blockingIO 多路复用:
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("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
浙公网安备 33010602011771号