C++后端总览

目录

一、最关键技术栈(按优先级)

[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)


  1. 网络后端 / 高性能 C++ 服务端:最关键技术栈一览(按优先级)

  2. 项目驱动的学习路线(一步步做小项目把知识串起来)

  3. 最后给你一个可以照着打勾的 checklist


一、最关键技术栈(按优先级)

1. 必须掌握的核心(Core)

① 现代 C++(以 C++11/14/17 为主)

  • 内存 & 资源管理:RAII、智能指针(unique_ptr / shared_ptr)、对象生命周期

  • 值类别:左值/右值、移动语义(std::move、移动构造/赋值)

  • STL:vector / map / unordered_map / string / chrono 等常用容器和工具

  • 语言特性:autorange-based forlambdaconstexprenum class

  • 并发库:std::threadmutexlock_guardunique_lockcondition_variableatomic


② Linux 基础 + C++ 开发环境

  • 常用命令:lscdpstopnetstat / ssstrace

  • 进程 / 线程 概念:PID,fork,退出码,信号(SIGINTSIGTERM

  • 文件描述符:打开/关闭、阻塞/非阻塞

  • 构建 & 调试:g++cmakegdb 基本用法、valgrind 查内存问题


③ 网络编程(重点!)

  • TCP / UDP 基础(连接、三次握手、半关闭、粘包/拆包概念)

  • socket API:socket / bind / listen / accept / connect / send / recv

  • 阻塞与非阻塞 I/O;fcntl 设置 non-blocking

  • IO 多路复用:selectpollepoll(必须要会)

  • 典型模式: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 核心语法:智能指针、autolambdamovethread

  • gdb 打断点、单步调试、看栈

练手小项目:控制台"任务管理器"

功能示例:

  • 每隔 1 秒打印当前系统:

    • CPU 利用率(简单版可以只显示 /proc/stat 分析结果)

    • 内存使用情况

  • 支持简单命令:

    • list:列出当前进程数

    • quit:退出程序

要点:

  • std::thread 做一个后台线程定时采集数据

  • 主线程负责读用户输入命令

  • mutex 保护共享数据(采集线程和主线程)


阶段 1:从零写出一个「多客户端 echo 服务器」

目标:

掌握 socket、阻塞/非阻塞 IO、epoll 基本使用。

要学:

  • TCP 基础:三次握手、四次挥手概念

  • socket API:创建、绑定、监听、接受连接、发送/接收

  • epollepoll_create / epoll_ctl / epoll_wait

  • 非阻塞模式 & 简单的事件循环

项目:epoll + 多客户端 echo server

功能:

  • 服务端监听一个端口

  • 多个客户端(你可以用 telnet / nc 连)连接上来

  • 客户端发什么,服务端就原样回什么

  • 客户端断开,服务端能正常识别并清理资源

加一点工程化:

  • 把"连接"封装成一个 Connection

  • 把"事件循环"封装到一个类,比如 EventLoop

  • 写简单日志(到文件即可)


阶段 2:引入多线程 + 聊天室项目

目标:

把多线程、线程池、锁玩明白,做出一个真正"可用"的小服务。

要学:

  • 线程池设计:任务队列 + 工作线程

  • 互斥锁、条件变量

  • 简单的生产者-消费者模型

  • 设计一个简单的文本协议(比如:LOGIN:xxxMSG: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

相关推荐
m0_74870805几秒前
C++中的观察者模式实战
开发语言·c++·算法
qq_5375626712 分钟前
跨语言调用C++接口
开发语言·c++·算法
wjs202423 分钟前
DOM CDATA
开发语言
Tingjct24 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
猷咪1 小时前
C++基础
开发语言·c++
IT·小灰灰1 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧1 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q1 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳01 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾1 小时前
php 对接deepseek
android·开发语言·php