RabbitMQ交换机、绑定、队列、消息、虚拟主机详解
1.交换机属性
交换机属性:
name:交换机名称
type:交换机类型 direct,topic,fanout,headers
durability:是否需要持久化,true为持久化
auto delete:当最后一个绑定到exchange上的队列被删除后,exchange没有绑定的队列了,自动删除该exchange
internal:当前exchange是否用于rabbitMQ内部使用,默认为false
arguments:扩展参数,用于扩展AMQP协议自制定化使用
2.direct exchange类型
direct exchange:所有发送到direct exchange的消息被转发到routing key中指定的queue
注意:direct模式可以使用rabbitMQ自带的exchange:default exchange,所以不需要将exchange进行任何绑定(binding)操作,消息传递时,routingkey必须完全匹配才会被队列接收,否则该消息会被抛弃。
流转示意图如下
![](https://img.haomeiwen.com/i9167995/0b99e5d6ed470643.png)
代码地址: https://github.com/hmilyos/rabbitmq-api-demo
代码示例:
消费端代码:
![](https://img.haomeiwen.com/i9167995/27636c4b06e27365.png)
启动消费端
![](https://img.haomeiwen.com/i9167995/b9ba2bea8ffb5372.png)
上管控台查看交换机和队列是否成功创建
![](https://img.haomeiwen.com/i9167995/12207c2c14238913.png)
![](https://img.haomeiwen.com/i9167995/8c41b89e89ed9f41.png)
点击进去查看绑定情况
![](https://img.haomeiwen.com/i9167995/e543c14f3c67f52f.png)
生产端代码
![](https://img.haomeiwen.com/i9167995/1d801d7aaea8d335.png)
然后把生产端run一下
![](https://img.haomeiwen.com/i9167995/d30d5f0f9b9a2f1d.png)
再查看消费端的日志
![](https://img.haomeiwen.com/i9167995/7c4b2020102e039f.png)
该消费端只接收 routingkey 为 test.direct 的消息,证明direct exchange类型的,routingkey 必须完全匹配才会被队列接收,否则该消息会被抛弃。
3.topic exchange类型
topic exchange:所有发送到topic exchange的消息被转发到所有关心routingkey中topic的queue上
exchange将routingkey和某topic进行模糊匹配,此时队列需要绑定一个topic。
注意:topic可以使用通配符进行模糊匹配
#匹配一个或多个词,注意是词
*只能匹配一个词
例如“log.#”能匹配到“log.info.oa”
“log.*”只能匹配到“log.erro”这种格式
具体示例图如下图,usa.news能被usa.#,#.news所消费,usa.weather能被usa.#,#.weather所消费...
![](https://img.haomeiwen.com/i9167995/1143d02dec2847f3.png)
代码示例:
消费端:
![](https://img.haomeiwen.com/i9167995/fcf87e6e3f681af5.png)
启动消费端,上管控台查看创建、绑定是否成功
![](https://img.haomeiwen.com/i9167995/1a6db151defbf262.png)
确认成功后,编写生产端代码
![](https://img.haomeiwen.com/i9167995/bef633dee5104053.png)
启动生产端
![](https://img.haomeiwen.com/i9167995/0765d16a8c8506dc.png)
消费端接收到的
![](https://img.haomeiwen.com/i9167995/a184afde2ad86b9d.png)
routingKey3 ="user.delete.abc" 的未被接收,符合 user.* 的规则
这时候在消费端把 routingKey 修改一下, routingKey ="user.#",重启消费端,上管控台
![](https://img.haomeiwen.com/i9167995/fdaeb0266b32d5bb.png)
发现之前 * 的并没有解绑,需要我们手动解绑一下,然后再启动生产端的代码
![](https://img.haomeiwen.com/i9167995/6bde70f4b72eaf34.png)
发现三条都能接收到了,符合 # 的规则。
4.fanout exchange类型
fanout exchange:不处理路由键,只需要简单的将队列绑定到交换机上,发送到该交换机的消息都会被转发到于该交换机绑定的所有队列上,fanout交换机由于不需要进行routingkey的对比 直接发送所以绑定的queue,所以转发消息是最快的
示意图如下图所示
![](https://img.haomeiwen.com/i9167995/a9e1275ae9187886.png)
代码实现:
![](https://img.haomeiwen.com/i9167995/40ae02ba61de5d9c.png)
启动一下消费端
![](https://img.haomeiwen.com/i9167995/20b70aabfb18a9d4.png)
启动生产端
![](https://img.haomeiwen.com/i9167995/5aee5d5f138473ae.png)
查看消费端的日志
![](https://img.haomeiwen.com/i9167995/468db54d99fcf72f.png)
routingkey0-9的都能被就收,也就相当于该交换机上所有的队列都能接收来到该交换机的消息。
headers类型的不常用,就不介绍了
5.binding
binding:绑定exchange和exchange/queue之间的连接关心。binding中可以包含routingkey或者参数
6. Queue
queue:消息队列,实际存储消息数据,durability表示是否持久化,durable表示是,transient表示否。auto delete:如选择yes,表示当最后一个监听被移除后,该queue会被自动删除。
7. Message
message:服务器和应用程序之间传送的数据 本质上就是一段数据,由properties和payload(body)组成
常用属性:delivery mode,headersheaders(自定义属性),content_type,content_encoding,priority,correlation_id,reply_to,expiration,message_id,timestamp,type,user_id,app_id,cluster_id
代码实现:
![](https://img.haomeiwen.com/i9167995/82779ce373e0d35c.png)
生产端
![](https://img.haomeiwen.com/i9167995/2e5705d13f2e0f89.png)
先启动消费端,上管控台确认交换机和队列是否创建和绑定成功,再启动生产端,消费端接收到如下的信息
![](https://img.haomeiwen.com/i9167995/038f2ff18638da84.png)
8.virtual host
virtual host 虚拟主机
虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个virtual host里面可以有若干个exchange和queue,但是里面不能有相同名称的exchange或queue