一、RabbitMQ 简介
RabbitMQ 是一款开源的消息队列中间件 ,基于 AMQP 协议开发,实现了应用之间的异步通信、流量削峰、解耦 等核心能力。在动力优品项目中,RabbitMQ 主要用于商品数据同步:商品新增 / 修改 / 删除时,发送消息通知搜索服务更新 Elasticsearch 索引库,保证数据一致性。
二、Linux 环境安装 RabbitMQ
2.1 安装包准备
上传以下安装包到 Linux 服务器 /upload 目录:
jdk-8u191-linux-x64.tar.gzesl-erlang-17.3-1.x86_64.rpm(RabbitMQ 依赖)esl-erlang_17.3-1~centos~6_amd64.rpmesl-erlang-compat-R14B-1.el6.noarch.rpmrabbitmq-server-3.4.1-1.noarch.rpmredis-3.0.0.tar.gz
2.2 安装 Erlang 依赖
RabbitMQ 由 Erlang 语言开发,必须先安装 Erlang 环境。
# 强制安装 Erlang,忽略依赖检查
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
2.3 安装 RabbitMQ 服务
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm
2.4 RabbitMQ 基础配置与启动
2.4.1 启动 RabbitMQ 服务
service rabbitmq-server start
2.4.2 查看服务状态
service rabbitmq-server status
出现以下信息说明服务启动成功:
- 监听端口:
5672(消息通信端口)、25672(集群端口) - 进程 PID 正常运行
- 无内存、磁盘、文件描述符告警
2.4.3 开启 Web 管理界面
# 启用管理插件
rabbitmq-plugins enable rabbitmq_management
# 重启服务生效
service rabbitmq-server restart
2.4.4 创建管理员账号(远程访问必备)
默认 guest 用户仅允许本地登录,无法在项目中使用,必须创建新账号:
# 创建账号:账号 admin 密码 123456
rabbitmqctl add_user admin 123456
# 设置管理员权限
rabbitmqctl set_user_tags admin administrator
# 赋予根虚拟主机全部权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
2.4.4 防火墙开放端口
# 开放消息端口 5672
firewall-cmd --add-port=5672/tcp --permanent
# 开放Web管理界面端口 15672
firewall-cmd --add-port=15672/tcp --permanent
# 重启防火墙
firewall-cmd --reload
2.4.4 测试访问
- Web 管理界面 :浏览器访问
http://服务器IP:15672,使用admin/123456登录 - 端口连通性测试:Windows 执行命令测试 5672 端口可连接
XML
telnet 192.168.88.137 5672
三、SpringBoot 整合 RabbitMQ
3.1 引入核心依赖
在商品服务、搜索服务的 pom.xml 中添加 AMQP 依赖:
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.2 配置文件(application.yml)
spring:
rabbitmq:
host: 192.168.88.137 # Linux服务器IP
port: 5672
username: admin # 自定义管理员账号
password: 123456
virtual-host: / # 虚拟主机
3.3 消息队列配置类
创建配置类,声明交换机、队列、绑定关系:
java
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
// 交换机名称
public static final String ITEM_EXCHANGE = "item_exchange";
// 队列名称
public static final String ITEM_QUEUE = "item_queue";
// 声明交换机(topic模式)
@Bean(ITEM_EXCHANGE)
public Exchange itemExchange(){
return ExchangeBuilder.topicExchange(ITEM_EXCHANGE).durable(true).build();
}
// 声明队列
@Bean(ITEM_QUEUE)
public Queue itemQueue(){
return QueueBuilder.durable(ITEM_QUEUE).build();
}
// 队列绑定交换机
@Bean
public Binding bindingQueue(@Qualifier(ITEM_QUEUE) Queue queue,
@Qualifier(ITEM_EXCHANGE) Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
}
}
四、消息生产者(商品服务)
商品新增、修改、删除时,发送消息通知搜索服务同步数据。
4.1 注入 RabbitTemplate
java
@Autowired
private RabbitTemplate rabbitTemplate;
4.2 发送消息
java
// 商品数据变更后发送消息
// 参数:交换机名、路由键、消息内容
rabbitTemplate.convertAndSend(
RabbitMQConfig.ITEM_EXCHANGE,
"item.add", // 路由键
商品ID // 消息内容:商品ID
);
五、消息消费者(搜索服务)
监听队列,接收消息并更新 Elasticsearch 索引库。
5.1 编写消息监听器
java
import com.powershop.service.SearchItemService;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ItemListener {
@Autowired
private SearchItemService searchItemService;
// 监听商品队列
@RabbitListener(queues = RabbitMQConfig.ITEM_QUEUE)
public void receiveMessage(Long itemId){
try {
if(itemId != null){
// 1. 根据商品ID查询最新商品数据
// 2. 同步到ES索引库
searchItemService.updateOrInsertItem(itemId);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.2 数据同步业务逻辑
根据商品 ID 查询数据,新增 / 更新到 Elasticsearch:
java
@Override
public void updateOrInsertItem(Long itemId) throws Exception {
// 1. 查询商品详情
SearchItem searchItem = searchItemMapper.getItemById(itemId);
if(searchItem == null){
// 商品删除:从ES删除数据
DeleteRequest request = new DeleteRequest(ES_INDEX_NAME, ES_TYPE_NAME, itemId.toString());
restHighLevelClient.delete(request, RequestOptions.DEFAULT);
return;
}
// 商品新增/修改:更新ES数据
IndexRequest request = new IndexRequest(ES_INDEX_NAME, ES_TYPE_NAME, itemId.toString());
request.source(JsonUtils.objectToJson(searchItem), XContentType.JSON);
restHighLevelClient.index(request, RequestOptions.DEFAULT);
}
2.4.4 功能测试
- 启动项目:启动商品服务、搜索服务,查看控制台 RabbitMQ 连接日志
- 执行操作 :在后台管理系统执行商品新增 / 修改 / 删除
- 验证结果 :
- RabbitMQ 管理界面可看到消息发送、消费记录
- 前台搜索页面数据实时更新
- Elasticsearch 索引库数据同步成功
总结
- 本文完成了 Linux 环境 RabbitMQ 安装、配置、用户权限、防火墙开放全套流程
- 实现了 SpringBoot 与 RabbitMQ 整合,完成交换机、队列、绑定声明
- 基于 RabbitMQ 实现了商品服务与搜索服务解耦,保证 MySQL 与 ES 数据实时一致
- 测试验证:消息生产、消费、数据同步功能全部正常可用