仿RabbitMQ实现消息队列(二)-安装
安装配置环境
- lrzsz
- protobuf
- Gtest
- 安装muduo库
- Protobuf
- 什么是protobuf
- 使用流程介绍
- 简单上手
lrzsz
这个是文件传输工具,是来实现服务器跟本地之间的文件传输
sudo apt install lrzsz
protobuf
配置安装路径 在ubuntu下是 /usr/include/google/protobuf
这里我是直接把protobuf包下载到本地,然后直接拖到vscode.
# 切换到 protobuf目录下 运行
./autogen.sh
# 配置安装路径 默认安装在 /usr/local 目录,lib、bin 都是分散的
./configure
# 开始编译15分钟左右
make
# 开始安装
sudo make install
# 确认是否安装成功
libprotoc 3.20.2
Gtest
sudo apt install libgtest-dev
安装sqlite3
由于ubuntu问题,这里安装的是降级sqlite3 并不是最新版本的,
sudo apt install aptitude
sudo aptitude install sqlite3
安装muduo库
git clone https://github.com/chenshuo/muduo.git
wget
https://gitee.com/hansionz/mq/raw/master/resource/muduo-master.zip
运行脚本编译安装
./bulid.sh
./build.sh install
这个时候会在同级目录下生成一份build文件夹
验证是否编译安装成功
# 切换编译目录
cd ~/build/release-cpp11/bin# 运行 protobuf-demo 服务端
./protobuf_server 9091# 运行 protobuf-demo 客户端
./protobuf_client 0.0.0.0 9091
如果出现一下信息说明成功。“ chen shuo‘
20230717 07:51:14.237167Z 23144 INFO pid = 23144 - client.cc:93
20230717 07:51:14.237233Z 23144 INFO
TcpClient::TcpClient[QueryClient] - connector 0x2417530 -
TcpClient.cc:69
20230717 07:51:14.237334Z 23144 INFO
TcpClient::connect[QueryClient] - connecting to 0.0.0.0:9091 -
TcpClient.cc:10720230717 07:51:14.237511Z 23144 INFO 127.0.0.1:53368 ->
127.0.0.1:9091 is UP - client.cc:50
20230717 07:51:14.239109Z 23144 INFO onAnswer:
muduo.Answerid: 1
questioner: "Chen Shuo"
answerer: "blog.csdn.net/Solstice"
solution: "Jump!"
solution: "Win!"
- client.cc:75
20230717 07:51:14.239170Z 23144 INFO 127.0.0.1:53368 ->
127.0.0.1:9091 is DOWN - client.cc:50
20230717 07:51:14.239201Z 23144 INFO
TcpClient::~TcpClient[QueryClient] - connector 0x2417530 -
TcpClient.cc:75
Protobuf
什么是protobuf
它是数据结构序列化和反序列化框架。它基于应用层协议实现数据的序列化和反序列化的一个功能。他具有以下特点:
- 语言无关,平台无关
- 高效
- 扩展性兼容性好
序列化就是把对象转换为可存储或传输的格式的过程,反序列化就是把序列化后的数据恢复为原始对象的过程。好比如 序列化 = 把商品精心包装成快递盒, 反序列化 = 收到快递后拆开包装,恢复成商品。
使用流程介绍

简单上手
syntax = "proto3";
package contacts;message PeopleInfo {string name = 1;int32 age = 2;}
syntax = "proto3";:指定使用 proto3 版本的语法。Proto3 相比于 Proto2 简化了很多特性,并且支持更多语言。
package chat;:定义了一个包声明chat,这有助于防止不同项目之间的命名冲突。
接下来是消息类型的定义:
1、message PeopleInfo:定义了个名为PeopleInfo 的消息类型,表示一个人物具有以下信息:
string name=1;//姓名
int32 age=2;//年龄
编译
protoc --cpp_out= . contact.proto
这些定义可以被编译成多种汇编语言,以便在不同的系统和服务之间传输结构画的数据。
接下来看看几个方法:
1、序列化和反序列化方法
_InternalSerialize()
uint8_t* ChatMessage::_InternalSerialize(uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const
- 作用:将消息对象序列化为二进制格式
- 调用链:被
SerializeToArray()/SerializeToString()调用 - 重要性:所有网络传输和持久化存储的基础
2、内存管理方法
SharedCtor()/ SharedDtor()
void ChatMessage::SharedCtor(::_pb::Arena* arena, bool is_message_owned)
void ChatMessage::SharedDtor()
- 作用:构造/析构时的内存管理
- 特点:处理字符串字段的内存分配和释放
InternalSwap()
void ChatMessage::InternalSwap(ChatMessage* other)
- 作用:高效交换两个对象的内容
- 使用场景:被赋值运算符和移动语义操作调用
3、工具方法
size_t ChatMessage::ByteSizeLong() const
- 作用:计算消息序列化后的字节大小
- 用途:预先分配缓冲区大小
bool ChatMessage::IsInitialized() const
- 作用:检查所有 required 字段是否已设置(在 proto3 中主要用作占位符)
4、是几种常用函数方法
// 序列化
message.SerializeToString(&output_string);// 反序列化
message.ParseFromString(input_string);// 字段访问
message.set_sender("Alice");
const std::string& sender = message.sender();