:项目概述+环境搭建)
1. 项目介绍我们之前学过阻塞队列BlockingQueue它最典型的应用场景就是实现生产者消费者模型。生产者消费者模型是后端开发中非常常用的编程方式它带来诸多好处解耦—— 生产者与消费者互不依赖支持并发—— 生产和消费可以并行推进支持忙闲不均—— 双方处理速率不一致时队列充当缓冲区削峰填谷—— 突发流量先入队后端按自身能力匀速消费在实际的后端开发中尤其是分布式系统里跨主机使用生产者消费者模型也是非常普遍的需求。为此我们通常会把队列封装成一个独立的服务程序并赋予它更丰富的功能 —— 这类服务程序就称为消息队列Message QueueMQ。与进程内的阻塞队列相比MQ 额外具备网络通信、消息持久化和消息路由能力。市面上成熟的消息队列非常多RabbitMQKafkaRocketMQActiveMQ其中RabbitMQ知名度高、功能强大、使用广泛。本项目就仿照 RabbitMQ模拟实现一个简单的消息队列。2. 开发环境操作系统LinuxCentOS 7.6 / Ubuntu 22.04编辑器VSCode / Vim编译调试g / gdb构建工具Makefile3. 技术选型开发主语言C序列化框架Protobuf 二进制序列化网络通信自定义应用层协议原生 socket可控性最强但需要自行处理 IO 多路复用、缓冲区管理等细节复杂度较高muduo 库封装了 TCP 长连接采用 epoll 事件驱动模式能更方便地实现高并发服务器与客户端数据存储SQLite3单元测试框架GTest4.环境搭建Ubuntu22.04 环境搭建1.安装 wget(一般情况下默认会自带)sudo apt-get install wget2.更换国内软件源先备份原来的/etc/apt/source.list 文件因为我没有下载vim编辑器所以我先下载备份这个是我vim前的结果添加软件源文件内容逐项检查都通过检查项结果代号jammy全程一致清华源换好了deb-src已注释正确日常不需要main / restricted / universe / multiverse齐全updates / backports齐全但有一处要改security源还是国外的看你文件最后几行代码块deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted deb http://security.ubuntu.com/ubuntu/ jammy-security universe deb http://security.ubuntu.com/ubuntu/ jammy-security multiversesecurity.ubuntu.com是Ubuntu 官方安全更新源服务器在国外国内访问同样很慢。清华源是有jammy-security镜像的应该一起换掉。改法两步第 1 步先在 vim 里保存退出代码块按 Esc 输入 :wq 按回车第 2 步一条命令替换sudo sed -i s|http://security.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g /etc/apt/sources.list确认改对了grep security /etc/apt/sources.list新增完毕后更新源sudo apt-get update3.安装 lrzsz 传输工具4.安装编译器5.安装项目构建工具 make6.安装调试器7.安装 git8.安装 cmake9.安装 ProtobufA.安装 Protobuf 依赖库sudo apt-get install autoconf automake libtool curl unzip gzip #验证 which unzip gzip autoconf automake libtool curlB.下载源码wget https://gitee.com/qigezi/bitmq/raw/master/mqthird/protobuf-all-3.20.2.tar.gzC.编译安装# 解压缩 tar -zxf protobuf-all-3.20.2.tar.gz # 切换目录 cd protobuf-3.20.2/ # 如果下载的是具体的某一门语言不需要执行这一步 ./autogen.sh # 配置安装路径 默认安装在 /usr/local 目录 ./configure # 开始编译 15 分钟左右 make # 开始安装, 需要 root 权限 sudo make install # 确认是否安装成功 protoc --version # 期望输出libprotoc 3.20.2当我在查看版本的时候它这里报错了这是经典问题库装上了但系统还找不到它报错含义protoc: error while loading shared libraries: libprotoc.so.31: cannot open shared object fileprotoc是可执行文件但它运行时还要加载动态链接库libprotoc.so.31。这两个东西安装后是分开放的文件位置protoc可执行文件/usr/local/bin/protoclibprotoc.so.31动态库/usr/local/lib/libprotoc.so.31系统运行时要去动态库搜索路径里找.so文件。ldconfig就是用来重建这个搜索缓存的。先诊断库到底装上没情况 A有输出能看到libprotoc.so.31说明库装好了只是缓存没刷新。跑sudo ldconfig protoc --version情况 B无输出 /No such file说明sudo make install没成功。重跑cd ~/protobuf-3.20.2 sudo make install sudo ldconfig protoc --version如果ldconfig之后还是报同样的错说明/usr/local/lib不在默认搜索路径里手动加进去echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/protobuf.conf sudo ldconfig protoc --version这三条就等价于教程里说的「修改/etc/ld.so.conf添加/usr/local/lib/」只是更规范的做法是单独写一个 conf 文件而不是直接改主配置文件。若安装后的库存放于 /usr/local/lib 中 导致运行程序时默认检索不到则可以修改/etc/ld.so.conf 文件添加库文件路径到其中修改完毕后加载配置文件ldconfig读取清单生成缓存让系统立刻识别新库路径D.测试验证第 1 步写contacts.protosyntax proto3; package contacts; message PeopleInfo { string name 1; int32 age 2; }第 2 步编译成 C 代码protoc --cpp_out./ contacts.protoprotocprotobuf 的编译器--cpp_out./生成 C 代码输出目录是当前文件夹./contacts.proto你写的协议描述文件执行完这条命令自动产出 2 个文件contacts.pb.h头文件类声明contacts.pb.cc源文件类实现第 3 步写test.cc#include iostream #include contacts.pb.h // 引入编译生成的头文件 using namespace std; int main() { string people_str; // 序列化 { // .proto 文件声明的 package通过 protoc 编译后 // 会为编译生成的 C 代码声明同名的命名空间 contacts::PeopleInfo people; people.set_age(20); people.set_name(张珊); // 调用序列化方法将序列化后的二进制序列存入 string 中 if (!people.SerializeToString(people_str)) { cout 序列化联系人失败. endl; } // 打印序列化结果 cout 序列化后的 people_str: people_str.size() endl; } // 反序列化 { contacts::PeopleInfo people; // 调用反序列化方法读取 string 中存放的二进制序列并反序列化出对象 if (!people.ParseFromString(people_str)) { cout 反序列化出联系人失败. endl; } // 打印结果 cout Parse age: people.age() endl; cout Parse name: people.name() endl; } return 0; }第 4 步编译运行g -stdc11 test.cc contacts.pb.cc -o test -lprotobuf ./test10.安装 Muduo下载源码 → 装依赖 → 修复 protorpc → 编译安装 → 验证A.下载源码cd ~/code git clone https://github.com/chenshuo/muduo.gitGitHub 慢就用备用地址cd ~/code wget https://gitee.com/hansionz/mq/raw/master/resource/muduo-master.zip unzip muduo-master.zipB. 安装依赖环境sudo apt install -y libz-dev libboost-all-devC.修复 protorpcmuduo/net/protorpc/CMakeLists.txt这一步是条件步骤——只有 D 编译报错了才需要改。D.编译安装cd muduo-master # 或 muduo ./build.sh ./build.sh installE.验证cd build/release-cpp11/bin ./protobuf_server 9091 # 终端 1 ./protobuf_client 0.0.0.0 9091 # 终端 2看到Jump!Win! 成功。目录保持一致11.安装 SQLite3# 安装sqlite3运行库 C/C开发头文件 sudo apt-get install sqlite3 libsqlite3-dev # 验证安装是否成功 sqlite3 --version12.安装 Gtestsudo apt-get install libgtest-dev测试 GTest 是否安装成功•编写测试代码编译源文件以及运行可执行文件5.参考文档a.AMQP 协议AMQP Part IAMQP详解-CSDN博客消息队列协议入门理解 RabbitMQ 的 Exchange / Queue / Binding 模型。b.ProtoBuf 的使用与原理protobuf 反射机制protobuf的反射机制 - sweychen - 博客园 ProtoBuf-反射原理与使用_proto反射-CSDN博客不依赖具体消息类型操作字段消息分发模块会用到。c.GTesthttps://cloud.tencent.com/developer/article/2159465gtest 三种事件机制_gtest teardown-CSDN博客单元测试框架使用指南。d.muduomuduo::CountDownLatchCountDownLatch的理解和使用 - Shane_Li - 博客园多线程同步原语需要等待多个线程就绪时使用。6.小结本篇完成了消息队列项目的全部准备工作从项目定位、技术选型到一整套开发环境落地。环境搭建清单组件版本安装方式1wget系统自带—2软件源清华镜像jammy手动配置3lrzsz—apt4gcc / g11.4.0apt5make4.xapt6gdb12.1apt7git2.34.1apt8cmake3.22.1apt9Protobuf3.20.2源码编译10Muduomaster源码编译11SQLite3apt 版本apt12GTestapt 版本apt三个值得记住的点软件源必须匹配系统代号22.04 jammy。网上大量教程是 20.04 时代写的照抄focal会把系统搞坏。云服务器不用换源。腾讯云 / 阿里云出厂就配好了内网镜像比公网源更快还不计流量。Protobuf 和 Muduo 必须源码编译。apt 源里的版本不匹配且 muduo 根本没有 apt 包。验证结果检查项命令预期Protobufprotoc --versionlibprotoc 3.20.2Muduo Protobuf跑protobuf_server/protobuf_client客户端打印Jump!Win!SQLite3sqlite3 --version输出版本号GTest./gtest[ PASSED ] 1 test.Muduo 那一步最有价值——它用 muduo 做网络、protobuf 做序列化跑通就说明整个技术栈网络 序列化已经就位。