仿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();
相关推荐
Microsoft Word7 小时前
Rabbitmq基础篇
网络·分布式·rabbitmq
csdn_aspnet7 小时前
.NETCore、.NET 7 和 RabbitMQ 的发布-订阅模式
rabbitmq·.netcore·.net7.
csdn_aspnet7 小时前
RabbitMQ简介
rabbitmq
lifejump8 小时前
端口隔离技术的实验与验证(eNSP)
linux·服务器·网络
zzzsde8 小时前
【Linux】基础指令(4):基础指令&&热键&&shell运行原理
linux·运维·服务器
NiKo_W9 小时前
Linux TcpSocket编程
linux·服务器·网络·udp·socket·多线程·tcp
JavaArchJourney9 小时前
分布式锁方案详解
分布式·后端
利刃大大10 小时前
【高并发服务器】十三、TcpServer服务器管理模块
服务器·高并发·项目·cpp
盼哥PyAI实验室10 小时前
纯前端打造个人成长网站:零后端、零部署、零服务器的实践分享
运维·服务器·前端·javascript·echarts·个人开发