RabbitMQ 消息队列集成与使用

一、RabbitMQ 简介

RabbitMQ 是一款开源的消息队列中间件 ,基于 AMQP 协议开发,实现了应用之间的异步通信、流量削峰、解耦 等核心能力。在动力优品项目中,RabbitMQ 主要用于商品数据同步:商品新增 / 修改 / 删除时,发送消息通知搜索服务更新 Elasticsearch 索引库,保证数据一致性。

二、Linux 环境安装 RabbitMQ

2.1 安装包准备

上传以下安装包到 Linux 服务器 /upload 目录:

  • jdk-8u191-linux-x64.tar.gz
  • esl-erlang-17.3-1.x86_64.rpm(RabbitMQ 依赖)
  • esl-erlang_17.3-1~centos~6_amd64.rpm
  • esl-erlang-compat-R14B-1.el6.noarch.rpm
  • rabbitmq-server-3.4.1-1.noarch.rpm
  • redis-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 测试访问

  1. Web 管理界面 :浏览器访问 http://服务器IP:15672,使用 admin/123456 登录
  2. 端口连通性测试: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 功能测试

  1. 启动项目:启动商品服务、搜索服务,查看控制台 RabbitMQ 连接日志
  2. 执行操作 :在后台管理系统执行商品新增 / 修改 / 删除
  3. 验证结果
    • RabbitMQ 管理界面可看到消息发送、消费记录
    • 前台搜索页面数据实时更新
    • Elasticsearch 索引库数据同步成功

总结

  1. 本文完成了 Linux 环境 RabbitMQ 安装、配置、用户权限、防火墙开放全套流程
  2. 实现了 SpringBoot 与 RabbitMQ 整合,完成交换机、队列、绑定声明
  3. 基于 RabbitMQ 实现了商品服务与搜索服务解耦,保证 MySQL 与 ES 数据实时一致
  4. 测试验证:消息生产、消费、数据同步功能全部正常可用
相关推荐
Kyrie_Li21 分钟前
Kafka-安装和配置(搭建环境)
分布式·kafka
逻极22 分钟前
MongoDB 从入门到精通:文档数据库的灵活之道
分布式·mongodb·nosql·聚合框架
大G的笔记本1 小时前
分布式事务实战
分布式
AI浩2 小时前
梯度累积与 Micro-Batch 设计分层式精讲:有效批次、显存边界与分布式同步
开发语言·分布式·batch
l1t2 小时前
DeepSeek总结的从 DeepSeek 到 Quack:分布式 DuckDB 的梦想何时开始变得真实
数据库·分布式
钝挫力PROGRAMER2 小时前
BugFixed:etcd 单节点宕机后数据“消失”
分布式·etcd
小旭95272 小时前
Spring Cloud 集成分布式日志 ELK+Swagger 接口文档实战
java·分布式·后端·elk·spring cloud
SilentSamsara2 小时前
消息队列集成:Python + Kafka/RabbitMQ 生产实践
服务器·开发语言·分布式·python·kafka·rabbitmq
2601_957882242 小时前
分布式媒体中台的非阻塞I/O架构:高并发事件网关、熔断机制与跨域ETL管道流控实践
分布式·架构·媒体
2601_957879333 小时前
分布式媒体中台的多渠道协同架构:数据一致性、高并发调度与跨域路由容错实践
分布式·架构·媒体