一、RabbitMQ 核心知识点
1.1 什么是 MQ
MQ(Message Queue,消息队列),也叫消息中间件,是存储消息的容器,用于分布式系统之间进行通信,实现系统解耦、异步通信、流量削峰等核心能力。

1.2 主流 MQ 对比选型
| 特性 | RabbitMQ | ActiveMQ | RocketMQ | Kafka |
|---|---|---|---|---|
| 公司 / 社区 | Rabbit | Apache | 阿里 | Apache |
| 开发语言 | Erlang | Java | Java | Scala&Java |
| 协议 | AMQP | OpenWire、AUTO、Stomp、MQTT | 自定义 | 自定义 |
| 单机吞吐量 | 万级 | 万级 (最差) | 十万级 | 十万级 |
| 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
| 特性 | 并发能力强,延时低 | 老牌产品,文档多 | 功能完备,扩展性佳 | 主打大数据日志采集,仅支持核心 MQ 功能 |
选型建议:
- 中小型公司:首选 RabbitMQ(高并发、社区活跃、功能完备);
- 大型公司:根据场景选择 RocketMQ(业务消息)或 Kafka(日志采集)。
1.3 RabbitMQ 基础
RabbitMQ 是采用 Erlang 语言开发实现 AMQP(高级消息队列)协议的消息中间件。
AMQP 协议组成

AMQP 协议定义了消息传递的规范,核心包含:
- 生产者:发送消息的应用程序;
- 交换机(Exchange):路由消息到队列;
- 队列(Queue):存储消息的缓冲区;
- 消费者:接收并处理消息的应用程序;
- 绑定(Binding):交换机与队列的关联规则。
1.4 为什么使用MQ(RabbitMQ核心价值)
(1)解耦
传统模式:系统 A 直接调用系统 B/C 代码,新增系统 D 需修改 A 的代码;

MQ 模式:系统 A 将消息写入 MQ,其他系统从 MQ 订阅消息,A 无需修改代码。

(2)异步
传统模式:非核心业务同步执行,响应慢;

MQ 模式:非核心业务通过 MQ 异步执行,提升响应速度。

A服务把消息发送到MQ,B、C服务接受消息后以异步方式运行
(3)削峰
传统模式:高并发请求直接冲击数据库,导致连接异常;

MQ 模式:请求先写入 MQ,系统按数据库处理能力从 MQ 慢慢拉取消息,平稳消费。

1.5 RabbitMQ 安装(CentOS)
1.5.1 克隆 CentOS 虚拟机(可选)
通过 VMware 克隆 CentOS 虚拟机,作为 RabbitMQ 部署节点。
1.5.2 安装 Erlang(RabbitMQ 依赖)
上传安装包


bash
# 依次执行
rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps
rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps
rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps
1.5.3 安装 RabbitMQ
bash
bash
# 安装包
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm
# 启动/停止/重启/状态
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
service rabbitmq-server status
# 开机自启
chkconfig rabbitmq-server on
# 防火墙开放15672端口(管理界面)
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save
# 开启web管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
# 创建管理员账号
rabbitmqctl add_user admin 1111
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
# 查看用户
rabbitmqctl list_users
1.5.4 访问管理界面
浏览器访问:http://服务器IP:15672,使用 admin/1111 登录。

1.6 RabbitMQ 工程搭建
1.6.1 创建工程
新建 SpringBoot 工程springboot_rabbitmq。
1.6.2 pom.xml 依赖
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.powershop</groupId>
<artifactId>springboot_rabbitmq</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
1.6.3 连接工具类
java
运行
package com.powershop.util;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
public class ConnectionUtil {
/**
* 建立与RabbitMQ的连接
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("192.168.233.132");
//端口
factory.setPort(5672);
//设置账号信息
factory.setUsername("admin");
factory.setPassword("1111");
factory.setVirtualHost("/");
// 获取连接
Connection connection = factory.newConnection();
return connection;
}
}
1.7 RabbitMQ 五种消息模型
RabbitMQ 提供 5 种核心消息模型(排除 RPC),其中 3/4/5 属于订阅模型,仅路由方式不同。
5.1 Simple - 简单模型
核心角色:
- P(生产者):发送消息;
- C(消费者):接收消息;
- 队列:存储消息的缓冲区。
(1)生产者发送消息
java
package com.powershop.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.powershop.util.ConnectionUtil;
public class Send {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 获取连接和通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 声明队列(幂等性)
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 消息内容
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
//关闭资源
channel.close();
connection.close();
}
}
(2)消费者接收消息
java
package com.powershop.simple;
import java.io.IOException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.powershop.util.ConnectionUtil;
public class Recv {
private final static String QUEUE_NAME = "simple_queue";
public static void main(String[] argv) throws Exception {
// 获取连接
Connection connection = ConnectionUtil.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 定义消费者
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
BasicProperties properties,byte[] body) throws IOException {
String msg = new String(body);
System.out.println(" [x] received : " + msg + "!");
}
};
// 监听队列(自动确认)
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
说明:消费者启动后会持续监听队列,有新消息立即消费,消费后消息从队列移除。
(注:其余 4 种消息模型可参考 RabbitMQ 官方文档,核心逻辑类似,仅交换机 / 路由规则不同。)