RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现
核心概念:
Message
消息 消息是不具名的,它由消息头和消息体组成,消息体式不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指该消息可能需要持久性存储)等。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。Exchange有4种类型:direct(默认)、fanout,topic,和headers,不同类型的Exchange转发消息的策略有所区别
Queue
消息队列 用来保存消息直到发送给消费者。它式消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以交换器理解成一个由绑定构成的路由表。Exchange和Queue的绑定可以是多对多的关系。
Connection
网络连接,比如一个TCP连接。
Channel
信道,多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是比较昂贵的开销,所以引入了信道的概念,以复用一条TCP连接
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、消息交换器、绑定和权限机制。vhost是AMQP概念的基础,必须再连接时指定,RabbitMQ默认的vhost是/。
Broker
表示消息队列服务器实体
AMQP中消息的路由过程是Java开发者熟悉的JMS存在一些差别,AMQP中增加了Exchange和Binding的角色。生产者把消息发布到Exchange上,消息最终到达队列并被消费者接收,而Binding决定交换器的消息应该发送到那个队列。
Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:
direct、fanout,topic,headers。headers匹配AMQP消息的header而不是路由键,headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型;
安装RabbitMQ使用的是Docker,没有安装Docker的同学可以参考下面这篇博客:
https://blog.csdn.net/qq_41097820/article/details/88795336
首先在docker hub中搜索RabbitMQ镜像:
这里安装带有management标签的版本,这种会带有Web的管理界面
1、查看是否以及安装了RabbitMQ镜像
docker images
2.拉取前面选择好的rabbitmq
docker pull rabbitmq:3-management
下载完成后,再使用docker images查看,rabbitmq以及有了
3.运行rabbitmq
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 4d6576293cb8
-p表示端口映射,5672端口是客户端和RabbitMQ及通信的接口,15672端口为管理界面访问web界面的端口。
查看虚拟机ip地址
ip addr
下面是进去以后的效果,默认的用户名及密码都为 guest ,登录进去以后就是RabbitMQ的管理界面。
RabbitMQ的管理界面。
1、首先先添加几个交换器:
2、将三种类型的交换器都添加一个:
3、切换到消息队列栏同上:
4、将Exchange与Queue绑定
点击Exchange的Name可进入到Exchange的详情页面,在里面将Exchange与Queue进行Binding
zs.direct与各Queue绑定后的结果
zs.fanout与各Queue绑定后的结果
zs.topic与各Queue绑定后的结果
5、开始测试
1)测试zs.direct(点对点)
点进交换器之后有一栏是Publish message,我们发送消息就是在这里进行发送的:
填写好之后,点击Publish message发送。
发送成功后切换到Queues查看是否收到消息,很显然 ls 收到了一条消息,点击 ls 进去查看
进来之后,展开Get message选项,点击GetMessage(s)就能得到消息了
下面是得到的之前发送过来的消息
2)测试zs.fanout(广播)
同上面测试一样,发送一条消息给 ls :
但是查看消息队列时会发现,zs.fanout下的所有消息队列都接收到了:
但是,在查看ls所收到的消息时,始终都是之前那一条:
由于消息获取来之后并没有给消息队列进行应答,将接收的消息删除。解决办法就是把Ack Mode改成第二个选项就可以了。
3)测试zs.topic(发布订阅)
消息队列中与test.news匹配上的有:ls.news、ww.news,所以它们是会多收到一条消息的。
下面是收到的ls.news中收到的来自zs.topic的消息: