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. 测试验证:消息生产、消费、数据同步功能全部正常可用
相关推荐
China_Yanhy1 小时前
【云原生 AI 实战】EKS 搭建 GPU 超算集群:从零拉起节点到 PyTorchJob 分布式训练 (附 EFA 加速避坑指南)
人工智能·分布式·云原生
zhangzeyuaaa2 小时前
Kafka 单分区顺序消费的极限与突围:从原理到实战
分布式·kafka
珠海西格电力10 小时前
零碳园区的能源供给成本主要包括哪些方面?
大数据·分布式·微服务·架构·能源
霑潇雨19 小时前
Spark学习基础转换算子案例(单词计数(WordCount))
java·大数据·分布式·学习·spark·maven
富士康质检员张全蛋21 小时前
Kafka架构 数据发送保障
分布式·架构·kafka
zhojiew21 小时前
使用 Spark Connect 在 Amazon EMR on EC2 上实现远程 Spark开发
大数据·分布式·spark
庞轩px1 天前
第二篇:RocketMQ事务消息——分布式事务的最终一致性方案
分布式·rocketmq
momom1 天前
分布式缓存集群高可用架构与一致性哈希优化实践
分布式·后端·架构
heimeiyingwang1 天前
【架构实战】分布式事务TCC模式:两阶段提交的工程艺术
分布式·架构