仿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();
相关推荐
wanhengidc3 小时前
云手机是由什么组成的?
运维·服务器·web安全·游戏·智能手机
2501_941403765 小时前
5G时代的智能物联网:连接万物、赋能未来
rabbitmq
沧海寄馀生6 小时前
Apache Hadoop生态组件部署分享-Hadoop
大数据·hadoop·分布式·apache
毕设源码-朱学姐6 小时前
【开题答辩全过程】以 基于Hadoop的豆瓣电影数据分析系统设计与实现为例,包含答辩的问题和答案
大数据·hadoop·分布式
wanhengidc7 小时前
网站服务器都有哪些作用?
运维·服务器·科技·智能手机·云计算
2501_941802487 小时前
人工智能与可持续发展:科技赋能绿色未来
rabbitmq
卓小帅的博客7 小时前
关于实现远程服务器使用本地网络的清晰简洁的教程
服务器·网络·vscode·连接超时
顾安r8 小时前
11.22 脚本打包APP 排错指南
linux·服务器·开发语言·前端·flask
小小编程能手8 小时前
Linux文件编程
linux·运维·服务器
木童6629 小时前
nginx安装步骤详解
linux·运维·服务器·网络·nginx