最近在学习黑马商城(微服务)用到了RabbitMQ,下面是自己整理的笔记
一、什么是 RabbitMQ ?
RabbitMQ 是一个消息中间件,本质上是一个“消息中转站”。
举个栗子:
-
你(生产者)下单
-
外卖平台(RabbitMQ)负责转单
-
商家(消费者)接单做饭
你不需要直接联系商家
商家也不用一直盯着你有没有下单
二、为什么需要 RabbitMQ
在没有消息队列时,系统之间通常是直接调用:
订单系统 → 库存系统 → 物流系统 → 短信系统
存在问题:
- 强耦合(一个系统挂了,整个链路受影响)
- 同步调用(响应慢)
- 高并发容易崩溃
引入 RabbitMQ 后:
订单系统 → RabbitMQ → 库存系统
→ 物流系统
→ 短信系统
优势:
- 解耦:系统之间不直接依赖
- 异步:提升接口响应速度
- 削峰:应对高并发请求
三、核心概念
1. Producer(生产者)
发送消息的一方
例如:订单服务
2. Consumer(消费者)
接收并处理消息的一方
例如:库存服务、短信服务
3. Queue(队列)
用于存储消息
特点:
- 先进先出(FIFO)
- 消费者从队列中获取消息
4. Exchange(交换机)
负责消息的路由和分发
作用:
决定消息应该发送到哪个队列
5. RoutingKey(路由键)
用于指定消息的路由规则
四、消息传递流程
RabbitMQ 的核心流程:
Producer → Exchange → Queue → Consumer
详细步骤:
- Producer 发送消息到 Exchange
- Exchange 根据规则(RoutingKey)分发消息
- 消息进入对应的 Queue
- Consumer 从 Queue 中获取并处理消息
五、Exchange 类型(重点)
1. Direct(直连交换机)
特点:
- 精确匹配 RoutingKey
示例:
routingKey = order.create
只有匹配的队列才能接收消息
适用场景:
- 精准路由
2. Fanout(广播交换机)
特点:
- 不需要 RoutingKey
- 消息会发送到所有绑定的队列
适用场景:
- 广播通知
- 日志分发
3. Topic(主题交换机)
特点:
- 支持通配符匹配
通配符规则:
* 匹配一个单词
# 匹配多个单词
示例:
order.*
order.#
适用场景:
- 灵活的消息路由(最常用)
4. Headers(头交换机)
特点:
- 根据消息头属性匹配
使用较少
六、Spring AMQP 快速上手
光看理论没啥感觉,直接上代码。
黑马商城用的是 Spring AMQP,它把 RabbitMQ 的一堆繁琐操作封装好了,用起来很方便。
1. 引入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置连接
yaml
spring:
rabbitmq:
host: 192.168.1.100 # RabbitMQ 服务地址
port: 5672
virtual-host: /hmall # 虚拟主机,做环境隔离用的
username: hmall
password: 123456
虚拟主机(Virtual Host)可以理解为命名空间,不同项目用不同的 vhost,互不干扰。
3. 发送消息(生产者)
java
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage() {
// 参数:交换机名、路由键、消息内容
rabbitTemplate.convertAndSend("order.direct", "order.create", "新订单来了!");
}
就这几行,消息就发出去了。
4. 接收消息(消费者)
java
@Component
public class OrderListener {
@RabbitListener(queues = "order.queue")
public void handleOrderMessage(String message) {
System.out.println("收到消息:" + message);
// 处理业务逻辑...
}
}
@RabbitListener 标注的方法会一直监听指定队列,有消息来就自动触发,完全异步,不用自己轮询。
以上就是 RabbitMQ 的入门笔记,核心链路
Producer → Exchange → Queue → Consumer搞清楚之后,后面的东西基本都是在这个基础上扩展。后续打算继续整理消息可靠性、死信队列这些内容,有兴趣的可以关注一下,有写错的地方欢迎评论区指出~