## 一、RabbitMQ 是什么?
RabbitMQ 是一个开源的消息代理和队列服务器,用于通过**异步消息传递**实现系统间的通信。它支持多种消息协议,最核心的是 AMQP(Advanced Message Queuing Protocol),具有以下核心优势:
- ✅ **解耦系统**:生产者和消费者无需知道对方存在
- ✅ **流量削峰**:应对突发高并发请求
- ✅ **异步处理**:提升系统响应速度
---
## 二、5 分钟快速搭建环境
### 通过 Docker 启动(推荐)
```bash
docker run -d --name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:management
5672:AMQP 协议端口(代码连接用)15672:Web 管理界面(浏览器访问 http://localhost:15672)- 默认账号:
guest/guest
三、Java 代码示例(完整可运行)
1. 添加 Maven 依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.16.0</version>
</dependency>
2. 生产者代码(发送消息)
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class Producer {
private final static String QUEUE_NAME = "JAVA_QUEUE";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 创建持久化队列(服务重启后仍存在)
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
String message = "Hello RabbitMQ!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("✅ 消息发送成功: " + message);
}
}
}
3. 消费者代码(接收消息)
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
private final static String QUEUE_NAME = "JAVA_QUEUE";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
System.out.println("🔄 等待接收消息...");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("✅ 收到消息: " + message);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
// 保持程序持续运行
while (true) {
Thread.sleep(1000);
}
}
}
四、运行演示
-
启动生产者 运行
Producer.java,输出:✅ 消息发送成功: Hello RabbitMQ! -
启动消费者 运行
Consumer.java,输出:🔄 等待接收消息... ✅ 收到消息: Hello RabbitMQ! -
Web 管理界面验证 访问 http://localhost:15672 可以看到队列
JAVA_QUEUE中有一条消息
五、核心概念解析
| 组件 | 作用说明 |
|---|---|
| Producer | 消息生产者,通过 basicPublish 发送消息 |
| Consumer | 消息消费者,通过 basicConsume 订阅队列 |
| Queue | 消息存储的队列,具有 FIFO 特性 |
| Exchange | 消息路由组件(支持 Direct/Fanout/Topic 等类型) |
| Binding | 将 Exchange 和 Queue 绑定,定义路由规则 |
六、实际应用场景
-
电商订单系统
graph LR 订单服务-->|发送消息| RabbitMQ RabbitMQ-->|处理消息| 库存服务 RabbitMQ-->|处理消息| 支付服务 RabbitMQ-->|处理消息| 物流服务 -
日志收集系统 多个微服务将日志发送到 RabbitMQ,由统一消费者进行存储和分析
-
实时通知系统 用户操作(如点赞、评论)通过消息队列触发实时推送
七、最佳实践建议
-
消息持久化 队列和消息都设置为持久化,防止服务器重启丢失数据
// 队列持久化 channel.queueDeclare(QUEUE_NAME, true, false, false, null); // 消息持久化 channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes()); -
手动消息确认 消费者处理完成后手动发送 ACK,避免消息丢失
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {}); // 处理完成后调用 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); -
设置 Qos 限制 防止消费者过载,每次只处理一条消息
channel.basicQos(1); // 每次处理1条消息
八、总结
RabbitMQ 的 Java 客户端使用非常简洁,通过本文的示例代码您可以快速实现:
- 消息队列的创建与管理
- 消息的发送与消费
- 基本的生产者-消费者模型
建议后续深入探索:
- 不同 Exchange 类型的路由机制
- 消息确认与重试机制
- 集群化部署方案