RabbitMQ基础入门

3 阅读3分钟

最近在学习黑马商城(微服务)用到了RabbitMQ,下面是自己整理的笔记

一、什么是 RabbitMQ ?

RabbitMQ 是一个消息中间件,本质上是一个“消息中转站”。

举个栗子:

  • 你(生产者)下单

  • 外卖平台(RabbitMQ)负责转单

  • 商家(消费者)接单做饭

你不需要直接联系商家
商家也不用一直盯着你有没有下单

二、为什么需要 RabbitMQ

在没有消息队列时,系统之间通常是直接调用:

订单系统 → 库存系统 → 物流系统 → 短信系统

存在问题:

  • 强耦合(一个系统挂了,整个链路受影响)
  • 同步调用(响应慢)
  • 高并发容易崩溃

引入 RabbitMQ 后:

订单系统 → RabbitMQ → 库存系统
                    → 物流系统
                    → 短信系统

优势:

  • 解耦:系统之间不直接依赖
  • 异步:提升接口响应速度
  • 削峰:应对高并发请求

三、核心概念

1. Producer(生产者)

发送消息的一方

例如:订单服务


2. Consumer(消费者)

接收并处理消息的一方

例如:库存服务、短信服务


3. Queue(队列)

用于存储消息

特点:

  • 先进先出(FIFO)
  • 消费者从队列中获取消息

4. Exchange(交换机)

负责消息的路由和分发

作用:

决定消息应该发送到哪个队列


5. RoutingKey(路由键)

用于指定消息的路由规则


四、消息传递流程

RabbitMQ 的核心流程:

Producer → Exchange → Queue → Consumer

详细步骤:

  1. Producer 发送消息到 Exchange
  2. Exchange 根据规则(RoutingKey)分发消息
  3. 消息进入对应的 Queue
  4. 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 搞清楚之后,后面的东西基本都是在这个基础上扩展。后续打算继续整理消息可靠性、死信队列这些内容,有兴趣的可以关注一下,有写错的地方欢迎评论区指出~