目录 一:RabbitMq简介二:RabbitMQ 名词解释1):Message2):Publisher3):Exchange4):Binding5):Queue6):Connection7):Channel8):Consumer9):Virtual Host三:web 管理界面介绍四:消息队列种类:1).第一种模型(直连)消息生产者: 消息消费者:配置信息(只需要生产者): 2).Work工作队列模型消息生产者:消息消费者 3).发布订阅模型----->使用的是交换机 发布订阅模型推送到接收的流程①:Direct Exchange ②:Fanout Exchange③:Topic Exchange发布订阅模型-综合案例。三:消息回调处理①消息推送到server,但是在server里找不到交换机②消息推送到server,找到交换机了,但是没找到队列 ③消息推送到sever,交换机和队列啥都没找到 ④消息推送成功四:Mq应用场景①异步通讯②系统解耦③削峰填谷④数据同步④日志处理④任务调度
一:RabbitMq简介
在安装完rabbitMq后,
安装需要是哪个动作:
1:安装 Erlang环境,并配置环境变量,https://blog.csdn.net/m0_64633707/article/details/130527421
2:在那装rabbitMq。
3:输入http://ip:15672/ ,是可以看到一个简单后台管理界面的。
在这个界面里面我们可以做些什么?
可以手动创建虚拟host,创建用户,分配权限,创建交换机,创建队列等等,还有查看队列消息,消费效率,推送效率等等。
以上这些管理界面的操作在这篇暂时不做扩展描述,我想着重介绍后面实例里会使用到的。
二:RabbitMQ 名词解释
1):Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性
组成,这些属性包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode
(指出该消息可能需要持久性存储)等。
2):Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序
3):Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
4):Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由
规则,所以可以将交换器理解成一个由绑定构成的路由表。
5):Queue
消息队列,用来保存消息到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多,个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
6):Connection
网络连接,比如一个 TCP 连接。
7):Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的 TCP 连接内地虚拟连接,AMQP
命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因
为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连
接
8):Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序
9):Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和,权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 。
10):Broker
表示消息队列服务器实体
三:web 管理界面介绍
connections:无论生产者还是消费者,都需要与 RabbitMQ 建立连接后才可以完成消息的生产和消费,
在这里可以查看连接情况
channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。
Exchanges:交换机,用来实现消息的路由
Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列
四:消息队列种类:
tip:RabbitMQ 发送消息分为 2 个阶段
消息发送到交互机里面,可以监视
消息由交互机到队列里面,也可以监视
1).第一种模型(直连)
消息生产者:
@SpringBootTest
public class SpringAMQPTest {
//SpringAMQP提供的三个功能之一:封装了 RabbitTemplate 工具,用于发送消息 (生产者)
@Autowired
private RabbitTemplate template;
@Test
void test(){
//利用RabbitTemplate提供的方法向指定队列发送消息
template.convertAndSend("simple.queue","Hello SpringAQMP!");
}
}
消息消费者:
@Component
public class MessageListener {
/**
* SpringAMQP提供的三个功能之二:基于注解的监听器模式,异步接收消息 (消费者)
* @RabbitListener是SpringAMQP提供的监听消息队列的注解
* @param message
*/
@RabbitListener(queues = "simple.queue")
public void basicQueueListener(String message) {
System.out.println("消费者接收到消息:" + message);
}
}
配置信息(只需要生产者):
server:
port: 8001
spring:
#给项目来个名字
application:
name: RabitMq-provider
#配置rabbitMq 服务器
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
2).Work工作队列模型
消息生产者:
@Test
void testWorkQueue(){
String queueName = "work.queue";
String message = "Hello SpringAQMP-";
for (int i = 0; i < 20; i++) {
template.convertAndSend(queueName,message+i);
}
}
消息消费者
@RabbitListener(queues = "work.queue")
public void workQueueListener01(String message) throws InterruptedException {
System.out.println("消费者01接收到消息:" + message + " - " + LocalTime.now());
Thread.sleep(20);
}
@SneakyThrows
@RabbitListener(queues = "work.queue")
public void workQueueListener02(String message){
System.out.println("消费者02接收到消息:" + message + " - " + LocalTime.now());
3).发布订阅模型----->使用的是交换机
3.1.Fanout广播
3.2.Direct路由
3.3.Topics通配符
发布订阅模型推送到接收的流程
首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图:。
常用的交换机有以下三种,因为消费者是从队列获取信息的,队列是绑定交换机的(一般),所以对应的消息推送/接收模式也会有以下几种:
①:Direct Exchange
直连型交换机,根据消息携带的路由键将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。
②:Fanout Exchange
扇型交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。
③:Topic Exchange
主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
简单地介绍下规则:
* (星号) 用来表示一个单词 (必须出现的)# (井号) 用来表示任意数量(零个或多个)单词
通配的绑定键是跟队列进行绑定的,举个小例子
队列Q1 绑定键为 .TT. 队列Q2绑定键为 TT.#
如果一条消息携带的路由键为 A.TT.B,那么队列Q1将会收到;
如果一条消息携带的路由键为TT.AA.BB,那么队列Q2将会收到;
主题交换机是非常强大的,为啥这么膨胀?
当一个队列的绑定键为 “#”(井号) 的时候,这个队列将会无视消息的路由键,接收所有的消息。
当 * (星号) 和 # (井号) 这两个特殊字符都未在绑定键中出现的时候,此时主题交换机就拥有的