文章目录
- 前言
- [一、 RabbitMQ 消息队列配置](#一、 RabbitMQ 消息队列配置)
-
- [1. 创建交换机](#1. 创建交换机)
- [2. 创建队列](#2. 创建队列)
- [## 3. 绑定](## 3. 绑定)
- [二、构建Spring Boot项目](#二、构建Spring Boot项目)
-
- [1. 添加依赖](#1. 添加依赖)
- [2. 配置连接](#2. 配置连接)
- [3. 声明交换机、队列和绑定](#3. 声明交换机、队列和绑定)
- [4. 消息的发送与接收](#4. 消息的发送与接收)
- [三、🛠️ 监控与问题排查技巧](#三、🛠️ 监控与问题排查技巧)
-
- [1. 核心监控手段](#1. 核心监控手段)
- [2. 常见问题与解决方案](#2. 常见问题与解决方案)
前言
🚀Spring Boot 集成
集成过程主要分为添加依赖、配置连接、声明组件和收发消息四个步骤。
一、 RabbitMQ 消息队列配置
1. 创建交换机

2. 创建队列

## 3. 绑定
- 点击要绑定队列的交换机,进入交换机详情页面

- 在绑定信息区域,向交换机添加绑定信息。
输入要绑定的队列名称,绑定键,以及必要的参数,点击Bind。

二、构建Spring Boot项目
1. 添加依赖
在 pom.xml 文件中,添加 spring-boot-starter-amqp 依赖,它将自动引入所有必要的库。
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置连接
在 application.yml 中配置 RabbitMQ 的连接信息。建议开启心跳和连接重试,以保证连接的稳定性。
yaml
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
# 开启心跳检测,防止连接因长时间空闲而断开
requested-heartbeat: 60
listener:
simple:
retry:
enabled: true # 开启连接重试
max-attempts: 3
3. 声明交换机、队列和绑定
通过 Java 配置类来声明 RabbitMQ 的核心组件。这确保了应用启动时,所需的队列和交换机就已存在。
java
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
// 声明一个名为 "test.queue" 的持久化队列
@Bean
public Queue testQueue() {
return new Queue("test.queue", true);
}
// 声明一个名为 "test.direct" 的持久化直连交换机
@Bean
public DirectExchange testExchange() {
return new DirectExchange("test.direct", true, false);
}
// 将队列绑定到交换机,并指定路由键
@Bean
public Binding binding(Queue testQueue, DirectExchange testExchange) {
return BindingBuilder.bind(testQueue).to(testExchange).with("test.routingKey");
}
}
4. 消息的发送与接收
使用 RabbitTemplate 发送消息,@RabbitListener 注解接收消息。
-
生产者 :注入
RabbitTemplate,调用convertAndSend方法。java@Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { // 发送消息到指定的交换机和路由键 rabbitTemplate.convertAndSend("test.direct", "test.routingKey", message); } -
消费者 :使用
@RabbitListener监听队列。强烈建议使用手动确认模式(MANUAL),以确保消息被成功处理后再发送ACK,防止消息丢失。javaimport com.rabbitmq.client.Channel; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.messaging.handler.annotation.Header; @Component public class OrderConsumer { @RabbitListener(queues = "test.queue", ackMode = "MANUAL") public void processMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) { try { // 业务处理逻辑 System.out.println("收到消息: " + message); // 处理成功后,手动确认 channel.basicAck(tag, false); } catch (Exception e) { // 处理失败,可以根据情况选择拒绝消息 // requeue=true 表示消息重新入队,false 则进入死信队列(如果配置了) channel.basicNack(tag, false, true); } } }
三、🛠️ 监控与问题排查技巧
当系统投入运行后,有效的监控和问题排查能力至关重要。
1. 核心监控手段
- RabbitMQ 管理后台
RabbitMQ 的管理插件,这是最直观的监控工具,它提供了一个 Web UI 来监控和管理 RabbitMQ 服务器。
通过启用 rabbitmq_management 插件,你可以访问 http://<你的服务器IP>:15672 来查看:
- 概览: 连接数、信道数、队列总数、消息速率等。
- 队列: 每个队列的消息数量(Ready, Unacked)、消费者数量、内存占用。
- 连接/信道: 查看当前所有连接和信道的状态。
- 节点: 监控各个节点的内存、磁盘、文件描述符等资源使用情况。
- Prometheus + Grafana
对于生产环境,建议使用 Prometheus 收集指标,并用 Grafana 进行可视化展示和告警。
- 步骤一:启用 Prometheus 插件。
bash
rabbitmq-plugins enable rabbitmq_prometheus
-
步骤二 :配置 Prometheus (
prometheus.yml) 来抓取 RabbitMQ 的指标(默认端口 15692)。yamlscrape_configs: - job_name: 'rabbitmq' static_configs: - targets: ['localhost:15692'] -
步骤三:在 Grafana 中导入 RabbitMQ 官方或社区提供的仪表盘模板,即可看到丰富的可视化图表。
2. 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 消息丢失 | 生产者未开启确认、消费者自动确认、队列/消息未持久化。 | 1. 生产者开启 publisher-confirm-type: correlated 2. 消费者使用 ackMode: MANUAL 3. 队列和消息都设置为持久化。 |
| 消息重复消费 | 消费者处理成功后,发送ACK前Broker宕机,导致消息重新投递。 | 实现业务幂等性。例如,使用消息的唯一ID在Redis中做处理记录,或依赖数据库的唯一索引。 |
| 消息堆积 | 消费者处理能力不足、处理速度慢、或消费者宕机。 | 1. 优化消费者 :增加消费者实例数量,调整 prefetch 参数(建议5-25)。 2. 队列拆分 :按业务类型或优先级拆分队列,避免单队列瓶颈。 3. 使用惰性队列:将积压消息存入磁盘,降低内存压力。 |
| 消费者阻塞 | 消费者处理逻辑耗时过长,或预取(prefetch)消息数过多。 | 1. 调小 prefetch 值,避免一个消费者占用过多消息。 2. 消费者内部使用线程池异步处理业务,避免阻塞消费线程。 |
| 高CPU/性能慢 | 频繁创建/销毁连接、大量小消息、磁盘I/O瓶颈。 | 1. 使用连接池 ,保持长连接。 2. 生产者批量发送 ,减少网络交互次数。 3. 检查磁盘I/O,考虑使用SSD。 |
通过以上步骤,可以完成 Spring Boot 与 RabbitMQ 的基础集成,并具备在生产环境中监控和解决常见问题的能力。