RabbitMQ 入门指南:安装、基础结构、消息模型与入门案例
本篇文章,我们将一步步指导如何在 CentOS 系统上安装 RabbitMQ ,这是基于 Erlang 语言开发的强大开源消息中间件。我们会从下载和安装开始,然后深入到 RabbitMQ 的核心概念,包括通道、交换机、队列和虚拟主机。此外,我们还会通过简单的入门案例,展示如何在 RabbitMQ 中发送和接收消息。涉及到代码的部分 , 我们已经提供给大家 demo 版本 , 下载之后按照教程模拟即可 .
一 . 安装 RabbitMQ
RabbitMQ 是基于 Erlang 语言开发的开源消息通信中间件 .
那 Erlang 天生就是一个并发的语言 , 本身就是为了分布式系统来去设计的 .
那 RabbitMQ 是建立在 Erlang 语言上进行开发的 , 所以 RabbitMQ 的性能以及吞吐量都是很厉害的 .
但是 RabbitMQ 的最厉害之处 , 是消息的可靠性以及稳定性 , 这也保证了整个系统的高可用 .
那 RabbitMQ 的官网也给大家贴在这里了 : https://www.rabbitmq.com/ , 大家可以去浏览一下
我们选择在 CentOS 系统上来进行安装 RabbitMQ
1.1 下载镜像
我们可以通过 docker 在线拉取
docker pull rabbitmq:3.8-management
也可以将本地的 tar 包进行上传 , 我们选择这种方式
mq.tar (点击即可下载)
将这个文件上传到根目录下的 tmp 目录中
cd /tmp/
接下来我们只需要加载镜像即可
# 加载镜像docker load -i mq.tar
1.2 安装 MQ
执行这条指令即可
docker run \-eRABBITMQ_DEFAULT_USER=root \-eRABBITMQ_DEFAULT_PASS=root \-v mq-plugins:/plugins \--name mq \--hostname mq \-p15672:15672 \-p5672:5672 \-d\
rabbitmq:3.8-management
我们来分析一下这段命令
docker run \# 设置环境变量, 用户名是 root-eRABBITMQ_DEFAULT_USER=root \# 设置环境变量, 密码是 root-eRABBITMQ_DEFAULT_PASS=root \# 挂载数据卷, 后面会用到-v mq-plugins:/plugins \# 给 MQ 起一个名字--name mq \# 主机名: 这里不配置也可以, 后期需要配置集群--hostname mq \# 端口映射: RabbitMQ 的管理平台的端口-p15672:15672 \# 端口映射: 将来做消息通信的端口-p5672:5672 \# 后台运行-d\# 镜像名称
rabbitmq:3.8-management
后续启动 RabbitMQ , 使用 docker start mq 命令即可
1.3 测试连接
接下来 , 我们访问虚拟机的 IP 的 15672 端口 , 就可以进入到 RabbitMQ 的界面了
账号密码就是我们在上面配置的 root 账户
登陆之后就会来到 RabbitMQ 的管理页面
我们简单的介绍一下
Overview : 总览界面 , 展示的是 MQ 节点的详细信息 , 我们目前只有一个节点
Connections : 连接页面 , 无论是消息的发布者还是接收者 , 都需要与 MQ 建立起连接 .
Channels : 通道 , 建立连接之后就需要建立一个通道 , 这样的话生产者 / 消费者才能基于通道进行消息的发送 / 接收 . 可以认为 Channels 是 MQ 中各种操作 (比如消息的发送和接收) 的最基本对象 , 将来每一个连接的人都需要创建出一个或者多个通道 .
Exchanges : 交换机 , 主要进行消息的路由操作
Queues : 队列 , 用于消息的存储
Admin : 管理 , 在这个界面可以管理用户的信息
比如我们可以添加一个用户
但是创建出之后 , 我们发现提示没有访问权限 (No access)
这是因为虚拟主机 (virtual hosts) 的缘故
虚拟主机是 MQ 中的一种逻辑划分 , 将来我们会有很多用户 , 那每个用户都去创建自己的队列、交换机、通道等等 . 那不同用户之间就有可能产生冲突 , 那为了避免这种情况 , 就出现了虚拟主机的概念
通过虚拟主机对不同的用户进行隔离 , 这样的话就会互相看不到对方的内容 , 这实际上也是一种多租户的解决方案 .
我们还可以在右面点击 Virtual Hosts 来创建更多的虚拟主机
此时 root 用户就已经有了这两个虚拟主机的权限
但是 zhangsan 用户依然没有任何虚拟主机 , 我们需要点击 zhangsan 用户额外去设置
我们可以再回到交换机界面看一下
1.4 MQ 的基本结构
1.5 小结
channel : 通道 - 操作 MQ 的工具
exchange : 交换机 - 路由消息进入到队列中
queue : 队列 - 缓存消息
virtual host : 虚拟主机 - 是对 queue、exchange 等资源的逻辑分组
二 . RabbitMQ 的消息模型
MQ 的官方文档中给出了 7 个 MQ 的 Demo , 我们可以来看一下
MQ 的官方文档 : https://www.rabbitmq.com/tutorials
我们主要关注前五种模型 , 我们可以分一下类
三 . 入门案例
我们来看官网提供给我们的最简单的案例
publisher : 消息发布者 , 将消息发送到队列 queue
queue : 消息队列 , 负责接收并缓存消息
consumer : 从队列中获取消息
3.1 导入基础工程
我们目前的目的 , 主要是了解这个消息队列的模型 , 所以代码我们直接给到大家 , 大家直接 IDEA 打开即可
mq-demo.zip (点击即可下载)
3.2 生产者
我们打开 publisher 模块下面的单元测试类 : PublisherTest , 那这个代码就是用来进行消息发送的
首先 , 我们创建了一个 ConnectionFactory 连接工厂 , 发送消息的话需要建立连接 , 那建立连接就需要用到连接工厂 .
连接工厂创建之后 , 就需要设置一些信息 , 那这些信息就需要大家灵活调整
准备就绪之后 , 就需要建立连接
当这行代码走完 , 我们 RabbitMQ 的后台就会捕捉到一个连接
继续往下执行 , 当创建通道的代码执行完毕之后 , 再去观察通道界面
通道已经连接 , 接下来就可以向队列中发送消息了
那我们继续往下执行 , 就会创建队列
那接下来生产者就可以向消费者发送消息了 .
此时我们可以去 RabbitMQ 的控制中心来看一下
此时我们生产者可以结束掉任务了
那我们刷新 Queues 界面 , 发现生产者关闭之后 , 消息还在
那这也就验证了生产者只负责将消息添加到队列中 , 而不负责其他功能
3.3 消费者
我们找到消费者中的单元测试类 : ConsumerTest
我们还是在第一行先打一个断点
然后运行
首先 , 还是需要创建连接工厂并设置一系列参数
接下来就需要建立连接
继续往下看,然后我们发现 , 怎么又创建了一个队列 ? 生产者不是创建完了吗 , 我们直接用多好 ?
其实是这样的 , 我们并不能保证先运行生产者还是消费者 , 如果先启动消费者的话就会找不到要发送消息的队列 . 那为了避免队列不存在 , 我们就都需要先指定好队列 .
但其实我们看一下 RabbitMQ 的控制中心,发现并不会新创建出一个队列,它是自动绑定生产者之前创建好的队列 .
那接下来队列绑定之后 , 就可以从队列中获取消息了
这段逻辑就类似于 JS 的回调函数 , 当有消息出现的时候才会去执行 .
那我们把代码完全放行之后 , 会先打印等待接收消息还是接收到消息哪句话呢 ?
这就是回调机制 , 执行订阅信息的代码 , 只是先将回调函数与队列进行了绑定 , 但是消息还并没有真的到达 . 所以逻辑继续向下执行 , 打印了 “接收到消息” , 等到 RabbitMQ 把消息投递过来了 , 上面的回调函数才会去执行 . 所以最后打印的是 “接收到消息” .
接收到消息之后 , 此时队列中的消息也被清空了
3.4 小结
基本消息队列的消息发送流程 :
- 建立 connection
- 创建 channel
- 利用 channel 声明队列
- 利用 channel 向队列发送消息
基本消息队列的消息接收流程 :
- 建立 connection
- 创建 channel
- 利用 channel 声明队列
- 定义 consumer 的消费行为 handleDelivery() (这是个回调函数)
- 利用 channel 将消费者与队列绑定
不知道大家是否成功安装了 RabbitMQ , 并且按照提供的示例代码成功执行 .
如果对你有帮助的话 , 还请一键三连~
版权归原作者 加勒比海涛 所有, 如有侵权,请联系我们删除。