文章目录
- 前言
- 一、数据隔离
- 1.用户管理
- 2.virtual host
- 二、控制台收发
- 1.交换机
- 2.队列
- 3.绑定
- 三、编程式收发
- 1.依赖和配置
- 2.收发信息
- 总结
前言
1.了解数据隔离
2.RabbitMQ控制台收发信息
3.SpringBoot整合RabbitMQ收发信息
一、数据隔离
1.用户管理
点击Admin选项卡,首先会看到RabbitMQ控制台的用户管理界面
这里的用户都是RabbitMQ的管理或运维人员。仔细观察用户表格中的字段,如下:
- Name:itheima,也就是用户名
- Tags:administrator,说明itheima用户是超级管理员,拥有所有权限
- Can access virtual host: /,可以访问的virtual host,这里的/是默认的virtual host
对于小型企业而言,出于成本考虑,我们通常只会搭建一套MQ集群,公司内的多个不同项目同时使用。这个时候为了避免互相干扰, 我们会利用virtual host的隔离特性,将不同项目隔离。一般会做两件事情:
- 给每个项目创建独立的运维账号,将管理权限分离。
- 给每个项目创建不同的virtual host,将每个项目的数据隔离。 比如,我们给自己项目创建一个新的用户,命名为dragon,权限为admin
2.virtual host
创建完用户,你会发现你的用户是这样:
别急,需要授权,为你创建的用户绑定管理的虚拟机。登录你刚才创建的用户。
/代表默认虚拟机,我们可以给自己的项目创建一个单独的virtual host,而不是使用默认的/。
由于我们是登录dragon账户后创建的virtual host,因此回到users菜单,你会发现当前用户已经具备了对/dragon这个virtual host的访问权限了
如果你以前在默认的用户或者你创建的其他用户创建了队列,交换机,你可以看到全部没有,这就是隔离效果,互不干扰。就在当前用户当前绑定授权的虚拟机操作。
二、控制台收发
如果RabbitMQ安装有问题,可以看我文章Docker中的快速安装RaabbitMQ
1.交换机
点击Exchanges选项卡,可以看出很多交换机
我们点击任意交换机,即可进入交换机详情页面。仍然会利用控制台中的publish message 发送一条消息:
这里是由控制台模拟了生产者发送的消息(这里的生产者就是交换机),可以看到拒绝了,这样说明交换机没有存储消息的能力,由于没有消费者存在,最终消息丢失了。交换机只负责路由分发消息,所以我们创建队列,也就是消费者来处理接收消息,让交换机(生产者)有分发消息的对象。
2.队列
我们打开Queues选项卡,新建一个队列:hello.queue1、hello.queue2
此时,我们再次向amq.fanout交换机发送一条消息。会发现消息依然没有到达队列!!
怎么回事呢?
发送到交换机的消息,只会路由到与其绑定的队列,因此仅仅创建队列是不够的,我们还需要将其与交换机绑定。
3.绑定
点击Exchanges选项卡,点击amq.fanout交换机,进入交换机详情页,然后点击Bindings菜单,在表单中填写要绑定的队列名称
再次进入绑定队列的交换机内发送信息,回到Queues页面,可以发现hello.queue中已经有一条消息了
点击队列名称,进入详情页,查看队列详情,这次我们点击get message,可以看到信息了
三、编程式收发
- 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于RabbitMQ采用了
AMQP协议
,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与RabbitMQ交互。并且RabbitMQ官方也提供了各种不同语言的客户端。但是,RabbitMQ官方提供的Java客户端编码相对复杂,一般生产环境下我们更多会结合Spring来使用。而Spring的官方刚好基于RabbitMQ提供了这样一套消息收发的模板工具:SpringAMQP
。并且还基于SpringBoot对其实现了自动装配,使用起来非常方便。- SpringAMQP提供了三个功能:
- 自动声明队列、交换机及其绑定关系
- 基于注解的监听器模式,异步接收消息
- 封装了RabbitTemplate工具,用于发送消息
1.依赖和配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
spring:
rabbitmq:
host: 192.168.198.148 # 你的虚拟机IP
port: 5673 # 端口
virtual-host: /dragon # 虚拟主机
username: dragon # 用户名
password: 123 # 密码
2.收发信息
这里是创建两个springboot项目,在途中pom.xml文件粘贴依赖,在这两个项目内的application.yaml粘贴配置。并且我在控制台也已经手动创建simple.queue队列。
接收消息:
随便创建个类写如下代码
@Component
public class SpringRabbitListener {
// 利用RabbitListener来声明要监听的队列信息
// 将来一旦监听的队列中有了消息,就会推送给当前服务,调用当前方法,处理消息。
// 可以看到方法体中接收的就是消息体的内容
@RabbitListener(queues = "simple.queue")//队列名
public void listenSimpleQueueMessage(String msg) throws InterruptedException {
System.out.println("spring 消费者接收到消息:【" + msg + "】");
}
}
发送消息:
在publisher项目的测试类里写如下代码
@SpringBootTest
public class SpringAmqpTest {
@Resource
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleQueue() {
// 队列名称
String queueName = "simple.queue";
// 消息
String message = "hello, spring amqp!";
// 发送消息
rabbitTemplate.convertAndSend(queueName, message);
}
}
先运行consumer项目的启动类,再运行测试类发送信息,就可以看到在consumer项目控制台接收信息了。
总结
以上就是简单的消息收发,具体的编程化创建虚拟机,队列以及收发信息,我会在讲解交换机的文章中讲解。