RabbitMQ

时间:2024-01-20 22:37:43

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:
Messaging that just works — RabbitMQ

安装

docker安装

#拉取镜像
docker pull rabbitmq:3.8-management
#启动容器
docker run \
 -e RABBITMQ_DEFAULT_USER=rabbitmq \
 -e RABBITMQ_DEFAULT_PASS=rabbitmq \
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 --network hmall \
 -d \
 rabbitmq:3.8-management

#查看是否启动成功
docker ps
#结果展示:启动成功
58eaae6861ab   rabbitmq:3.8-management   "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds    4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq

访问地址:ip:15672

在这里插入图片描述

启动命令含义
-e 指定环境变量

RABBITMQ_DEFAULT_USER:指定用户名
RABBITMQ_DEFAULT_PASS:指定密码
-v 挂载数据卷
–name 指定容器名
–hostname 指定主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名
-p 指定服务运行的端口(15672:RabbitMQ提供的管理控制台的端口 5672:RabbitMQ的消息发送处理接口)
-d 后台运行容器

偶尔存在一个问题,当我们重新打开centos7 重新启动mq再次登录web页面时,会存在以下提示

报错:发现登录以访问此站点http://192.168.44.129:15672要求进行身份验证与此站点的连接不安全
如何解决?

第一种方法:将我们的挂载目录/mq/data删掉,重新执行启动命令重启(不建议,这样我们之前的信息会丢失)

第二种方法:参考这篇博客可以解决

RabbitMQ中的核心概念

  • Broker接收和分发消息的应用,RabbitMQ Server就是 Message Broker

  • Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建 exchange / queue

  • Connection:publisher / consumer 和 broker 之间的 TCP 连接

  • Channel:如果每一次访问RabbitMQ都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker 识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销

  • Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point)、topic (publish-subscribe) 、fanout (multicast),生产者发送的消息由交换机决定投递到哪个队列。

  • Queue:消息最终被送到队列等待consumer取走

  • Bindingexchange 和 queue之间的虚拟连接,binding中可以包含routingkey。Binding信息被保存到exchange中的查询表中,用于message的分发依据

在这里插入图片描述

上述这些东西都可以在RabbitMQ的管理控制台来管理,下边我们就一起来学习控制台的使用。

收发消息

交换机

我们打开Exchanges选项卡,可以看到已经存在很多交换机:

image.png

我们点击任意交换机,即可进入交换机详情页面。利用控制台中的publish message 发送一条消息:

image.png
image.png
这里是由控制台模拟了生产者发送的消息。由于没有消费者存在,最终消息丢失了,这样说明交换机没有存储消息的能力。

队列

我们打开Queues选项卡,新建一个队列:

image.png

命名为hello.queue1

image.png

再以相同的方式,创建一个队列,密码为hello.queue2,最终队列列表如下:

image.png

此时,我们再次向amq.fanout交换机发送一条消息。会发现消息依然没有到达队列!!

怎么回事呢?

发送到交换机的消息,只会路由到与其绑定的队列,因此仅仅创建队列是不够的,我们还需要将其与交换机绑定。

绑定关系

点击Exchanges选项卡,点击amq.fanout交换机,进入交换机详情页,然后点击Bindings菜单,在表单中填写要绑定的队列名称:

image.png

相同的方式,将hello.queue2也绑定到改交换机。最终,绑定结果如下:

image.png

发送消息

再次回到exchange页面,找到刚刚绑定的amq.fanout,点击进入详情页,再次发送一条消息:

image.png

回到Queues页面,可以发现hello.queue中已经有一条消息了:

image.png

点击队列名称,进入详情页,查看队列详情,这次我们点击get message:

image.png
可以看到消息到达队列了:
image.png

这个时候如果有消费者监听了MQ的hello.queue1hello.queue2队列,自然就能接收到消息了。

数据隔离

用户管理

点击Admin选项卡,首先会看到RabbitMQ控制台的用户管理界面:

image.png

这里的用户都是RabbitMQ的管理或运维人员。目前只有安装RabbitMQ时添加的itheima这个用户。仔细观察用户表格中的字段,如下:

  • Nameitheima,也就是用户名
  • Tagsadministrator,说明itheima用户是超级管理员,拥有所有权限
  • Can access virtual host/,可以访问的virtual host,这里的/是默认的virtual host

对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用virtual host的隔离特性,将不同项目隔离。一般会做两件事情:

  • 给每个项目创建独立的运维账号,将管理权限分离。
  • 给每个项目创建不同的virtual host,将每个项目的数据隔离。

比如,我们给黑马商城创建一个新的用户,命名为hmall

image.png

你会发现此时hmall用户没有任何virtual host的访问权限:

image.png

别急,接下来我们就来授权。

virtual host

我们先退出登录:

image.png

切换到刚刚创建的hmall用户登录,然后点击Virtual Hosts菜单,进入virtual host管理页:

image.png

可以看到目前只有一个默认的virtual host,名字为 /
我们可以给黑马商城项目创建一个单独的virtual host,而不是使用默认的/

image.png

创建完成后如图:

image.png

由于我们是登录hmall账户后创建的virtual host,因此回到users菜单,你会发现当前用户已经具备了对/hmall这个virtual host的访问权限了:

image.png

此时,点击页面右上角的virtual host下拉菜单,切换virtual host/hmall

image.png

然后再次查看queues选项卡,会发现之前的队列已经看不到了:

image.png

这就是基于virtual host 的隔离效果。