仿RabbitMQ实现消息队列(二)-安装

安装配置环境

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();
相关推荐
tedcloud1232 分钟前
Kimi-K3 部署指南:大模型应用开发环境搭建实践
linux·运维·服务器·开源·音视频
深念Y37 分钟前
ZTE_UZ901_NVRAM经验总结
linux·服务器·网络·嵌入式硬件·嵌入式·随身wifi
闲云自留地2 小时前
课后作业-20260806-Linux iSCSI服务器
linux·运维·服务器
智购科技智能售货柜2 小时前
自动售货机商品识别YOLO模型训练实战:从6万张图片到98%识别率的完整复盘~YH
运维·服务器·数据库·人工智能·redis·物联网·yolo
ACP广源盛139246256732 小时前
2026 PCIe互连芯片@ACP#国产替代格局解析:芯动科技领跑高端交换芯片赛道
大数据·网络·数据库·人工智能·分布式·嵌入式硬件
SeaTunnel2 小时前
Apache SeaTunnel 提交一个任务都经过了什么?
java·大数据·服务器·apache·etl·seatunnel
.冰块.2 小时前
P-SAN 实战:CentOS7 搭建 iSCSI Target 共享块存储
linux·服务器·iscsi
Kina_C2 小时前
Keepalived 单播模式实战:跨网络高可用的关键配置
linux·服务器·网络·keepalived
creator_Li2 小时前
Kafka深入刨析-Consumer
分布式·kafka
IKUN家族2 小时前
常见的依懒
java·服务器·数据库