一、为什么选 rocketmq?
rocketmq 是阿里开源的分布式消息中间件,经过双11高并发场景验证,核心优势是高吞吐量、高可靠性、低延迟,解决分布式系统中的异步解耦、流量削峰、数据一致性问题,比 rabbitmq 更适合高并发业务场景。
1.1 核心作用
- • 异步解耦:服务间无需同步调用,通过消息异步通信,避免一个服务故障导致全流程崩溃(如下单后异步通知库存、支付、物流);
- • 流量削峰:秒杀、活动等高并发场景,请求先进入消息队列,服务器按能力逐步消费,防止服务过载宕机;
- • 数据一致性:通过事务消息,确保跨服务操作的数据一致性(入门暂不深入,重点讲基础收发);
- • 异步通知:注册、订单变更等场景,异步发送短信、邮件,提升用户体验,不阻塞主流程。
1.2 典型应用场景
- • 电商场景:下单→库存扣减→支付回调→物流通知→短信提醒,全流程异步解耦;
- • 高并发场景:秒杀、抢购、直播带货的请求缓冲,削峰填谷;
- • 日志/监控场景:异步收集系统日志、监控数据,避免阻塞业务运行;
- • 分布式事务场景:跨服务操作(如订单+库存),通过事务消息确保数据一致。
1.3 核心组件
消息流转:生产者 → 主题(topic) → 消费者,核心组件无需死记,理解作用即可:
- • 生产者(producer):发送消息的一方(如下单服务);
- • 消费者(consumer):接收并处理消息的一方(如库存服务);
- • 主题(topic):消息的分类容器,生产者发送到指定主题,消费者订阅主题接收消息(类似 rabbitmq 的交换机+队列结合体);
- • 消息队列(message queue):主题下的细分队列,用于负载均衡,一个主题可包含多个队列;
- • nameserver:rocketmq 的“注册中心”,管理生产者、消费者与主题的关联关系,无状态、可集群部署;
- • broker:消息中转角色,接收生产者消息、存储消息、转发消息给消费者,是 rocketmq 的核心服务。
二、环境准备
推荐 docker 安装(一键启动,无需配置环境变量),无 docker 环境可选择本地安装,步骤简洁可落地。
2.1 docker 一键安装
前提:已安装 docker,执行以下命令,一键启动 nameserver 和 broker(整合在一起,简化操作):
# 拉取 rocketmq 镜像(官方推荐版本,稳定兼容) docker pull rocketmqinc/rocketmq:4.9.4 # 启动容器(映射端口,设置环境变量,简化配置) docker run -d --name rocketmq -p 9876:9876 -p 10911:10911 -e "rocketmq_namesrv_addr=localhost:9876" -e "rocketmq_broker_addr=localhost:10911" rocketmqinc/rocketmq:4.9.4
验证:容器启动后,执行 docker ps,能看到 rocketmq 容器运行即成功(9876是 nameserver 端口,10911是 broker 端口)。
2.2 本地安装
- 1. 下载 rocketmq:访问 rocketmq 官方下载页,选择 4.9.4 版本(稳定兼容 springboot),下载二进制包;
- 2. 解压安装包:解压到无中文、无空格的路径(如 d:\rocketmq-all-4.9.4-bin-release);
- 3. 启动 nameserver:
- • 打开 cmd,进入解压目录的 bin 文件夹(如 cd d:\rocketmq-all-4.9.4-bin-release\bin);
- • 执行命令:
start mqnamesrv.cmd,弹出窗口显示“nameserver started successfully”即成功; - 4. 启动 broker:
- 常见问题:启动 broker 报错“内存不足”?修改 bin 目录下的 runbroker.cmd,将 jvm 内存配置改小(如 -xms512m -xmx512m -xmn256m),保存后重新启动。
2.3 maven 依赖
springboot 提供 rocketmq starter 依赖,无需引入复杂核心依赖,直接在 pom.xml 中添加以下依赖,一键整合(版本与 rocketmq 对应,4.9.4 版本适配):
<?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 https://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.7.18</version>
<relativepath/>
</parent>
<groupid>com.example</groupid>
<artifactid>springboot-rocketmq-intro</artifactid>
<version>0.0.1-snapshot</version>
<properties>
<java.version>1.8</java.version>
<rocketmq.version>4.9.4</rocketmq.version>
</properties>
<dependencies>
<!-- springboot web 依赖(用于编写接口测试生产者) -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- rocketmq 整合依赖(核心) -->
<dependency>
<groupid>org.apache.rocketmq</groupid>
<artifactid>rocketmq-spring-boot-starter</artifactid>
<version>${rocketmq.version}</version>
</dependency>
<!-- lombok 简化代码(可选,与全系列风格统一) -->
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional>
</dependency>
</dependencies>
</project>• 新建 cmd 窗口,进入 bin 文件夹,执行命令:start mqbroker.cmd -n localhost:9876 autocreatetopicenable=true;
• 弹出窗口显示“broker started successfully”即成功(autocreatetopicenable=true 表示自动创建主题,简化入门操作)。
三、springboot 基础配置
在 application.yml 中配置 rocketmq 连接信息(nameserver 地址、生产者组、消费者组),注释详细,入门阶段无需修改核心配置,直接复制即可:
spring: application: name: springboot-rocketmq-intro # 项目名称,可自定义 # rocketmq 核心配置 rocketmq: name-server: localhost:9876 # nameserver 地址(本地默认,服务器填对应ip) producer: group: rocketmq-producer-group # 生产者组(自定义,同一组生产者共享配置) send-message-timeout: 3000 # 消息发送超时时间(毫秒) retry-times-when-send-failed: 1 # 发送失败重试次数(入门设1,避免重复发送) consumer: group: rocketmq-consumer-group # 消费者组(自定义,同一组消费者负载均衡消费) message-model: clustering # 消费模式:clustering(集群模式,默认)、broadcasting(广播模式) consume-thread-max: 10 # 最大消费线程数(入门无需修改) consume-timeout: 15000 # 消费超时时间(毫秒)
配置说明:
- •
name-server:必须与启动的 nameserver 地址一致,否则无法连接 rocketmq; - • 生产者组/消费者组:用于分组管理,同一消费者组的多个消费者会负载均衡消费同一主题的消息;
- •
message-model:集群模式(默认)适合大多数场景,多个消费者分工消费;广播模式会让所有消费者接收同一条消息。
四、消息生产与消费
重点实现「普通消息」的生产与消费(入门首选),代码可直接复制,注释详细,跟着操作就能跑通,后续可扩展事务消息、延迟消息。
4.1 消息生产者(发送普通消息)
编写生产者,通过 rocketmqtemplate 发送消息到指定主题(topic),这里用接口编写,方便通过浏览器测试,代码可直接复制:
import org.apache.rocketmq.spring.core.rocketmqtemplate;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.pathvariable;
import org.springframework.web.bind.annotation.restcontroller;
/**
* rocketmq 消息生产者
* 发送普通消息到指定主题
*/
@restcontroller
public class rocketmqproducer {
// 注入 rocketmqtemplate(springboot 自动配置,直接使用)
@autowired
private rocketmqtemplate rocketmqtemplate;
// 自定义主题名称(可自定义,消费者需订阅相同主题)
private static final string topic_name = "springboot_rocketmq_topic";
/**
* 发送普通消息接口(可通过浏览器访问测试)
* @param msg 要发送的消息内容(可自定义)
* @return 发送结果
*/
@getmapping("/send/rocketmq/{msg}")
public string sendmessage(@pathvariable string msg) {
// 消息内容(可自定义,拼接前缀方便区分)
string message = "【rocketmq 普通消息】" + msg;
// 发送消息:参数1=主题名称,参数2=消息内容
rocketmqtemplate.convertandsend(topic_name, message);
return "rocketmq 消息发送成功!发送内容:" + message;
}
}4.2 消息消费者(订阅并消费消息)
编写消费者,通过 @rocketmqmessagelistener 注解订阅指定主题和消费者组,当主题中有消息时,自动接收并处理,代码可直接复制:
import org.apache.rocketmq.spring.annotation.rocketmqmessagelistener;
import org.apache.rocketmq.spring.core.rocketmqlistener;
import org.springframework.stereotype.component;
/**
* rocketmq 消息消费者
* 订阅指定主题,消费消息
*/
@component // 交给spring管理,否则无法订阅消息
@rocketmqmessagelistener(
topic = "springboot_rocketmq_topic", // 订阅的主题(必须与生产者的主题一致)
consumergroup = "${rocketmq.consumer.group}" // 消费者组(与配置文件中一致)
)
public class rocketmqconsumer implements rocketmqlistener<string> {
/**
* 接收并处理消息(消息类型与生产者发送的一致,这里是string)
* @param msg 接收的消息内容
*/
@override
public void onmessage(string msg) {
// 模拟消息处理(实际项目中替换为业务逻辑,如扣减库存、发送短信等)
system.out.println("rocketmq 消费者接收消息:" + msg);
// 入门阶段暂不添加复杂业务逻辑,后续可扩展异常处理、消息确认等
}
}4.3 测试步骤
- 1. 启动 rocketmq(确保 nameserver 和 broker 已启动,无报错);
- 2. 启动 springboot 项目(确保项目无报错,成功连接 rocketmq);
- 3. 打开浏览器,访问测试接口:
http://localhost:8080/send/rocketmq/hellorocketmq(msg 参数可自定义,比如替换为“订单创建成功”); - 4. 浏览器返回“rocketmq 消息发送成功!”,说明消息发送成功;
- 5. 查看 idea 控制台,消费者会输出:“rocketmq 消费者接收消息:【rocketmq 普通消息】hellorocketmq”,说明消息消费成功。
4.4 关键注意点
- • 生产者和消费者的「主题(topic)必须一致」,否则消费者无法接收消息;
- • 消费者类必须添加
@component注解,交给 spring 管理,否则无法订阅主题; - •
@rocketmqmessagelistener注解的consumergroup必须与配置文件中rocketmq.consumer.group一致; - • 启动项目前,必须先启动 rocketmq(nameserver + broker),否则项目会报错“无法连接 nameserver”;
- • 消息类型要一致:生产者发送 string 类型,消费者也要用 string 类型接收(后续可扩展对象消息)。
五、扩展:两种常用消息类型
入门掌握普通消息即可,以下两种常用消息类型可按需扩展,代码可直接复制到对应类中,无需修改核心配置。
5.1 同步消息(可靠发送,适合重要消息)
同步消息:生产者发送消息后,会等待 broker 确认接收,确保消息发送成功(适合订单、支付等重要消息),添加到 rocketmqproducer 类中:
/**
* 发送同步消息(可靠发送,等待broker确认)
*/
@getmapping("/send/rocketmq/sync/{msg}")
public string sendsyncmessage(@pathvariable string msg) {
string message = "【rocketmq 同步消息】" + msg;
// 同步发送,返回发送结果(可判断是否发送成功)
org.apache.rocketmq.client.producer.sendresult sendresult = rocketmqtemplate.syncsend(topic_name, message);
// 判断发送状态(success 表示发送成功)
if (sendresult.getsendstatus() == org.apache.rocketmq.client.producer.sendstatus.send_ok) {
return "同步消息发送成功!发送内容:" + message + ",消息id:" + sendresult.getmsgid();
} else {
return "同步消息发送失败!";
}
}5.2 异步消息(非阻塞,适合非重要消息)
异步消息:生产者发送消息后,无需等待确认,直接返回,通过回调函数处理发送结果(适合日志、通知等非重要消息),添加到 rocketmqproducer 类中:
/**
* 发送异步消息(非阻塞,通过回调处理结果)
*/
@getmapping("/send/rocketmq/async/{msg}")
public string sendasyncmessage(@pathvariable string msg) {
string message = "【rocketmq 异步消息】" + msg;
// 异步发送,回调函数处理发送结果
rocketmqtemplate.asyncsend(topic_name, message, new org.apache.rocketmq.spring.support.rocketmqsendcallback() {
// 发送成功回调
@override
public void onsuccess(org.apache.rocketmq.client.producer.sendresult sendresult) {
system.out.println("异步消息发送成功,消息id:" + sendresult.getmsgid());
}
// 发送失败回调
@override
public void onexception(throwable e) {
system.out.println("异步消息发送失败,原因:" + e.getmessage());
}
});
return "异步消息发送中,请查看控制台回调结果!发送内容:" + message;
}六、常见问题与解决方案
整理入门阶段最常遇到的问题,直接对照解决方案,避免卡壳,节省时间。
1. 项目启动报错:could not connect to nameserver
• 原因1:rocketmq 未启动(nameserver 或 broker 未启动);
• 原因2:application.yml 中 name-server 配置错误(如端口错误、ip错误);
• 原因3:服务器安装的 rocketmq,未开放 9876、10911 端口;
• 解决方案:启动 rocketmq;核对 name-server 配置;开放服务器端口(阿里云/腾讯云安全组配置)。
2. 消息发送成功,但消费者收不到消息
• 原因1:生产者和消费者的主题(topic)不一致;
• 原因2:消费者组配置错误(@rocketmqmessagelistener 的 consumergroup 与配置文件不一致);
• 原因3:消费者类未添加 @co想在高并发场景下保证系统稳定?这篇文章手把手教你用springboot整合rocketmq实现消息生产与消费,从环境搭建到核心代码,覆盖异步解耦、流量削峰等关键应用,让你快速掌握可靠消息中间件并上手实战mponent 注解,spring 未扫描到;
• 解决方案:核对主题名称;核对消费者组配置;给消费者类添加 @component 注解,重启项目。
3. 启动 broker 报错“内存不足”
• 原因:rocketmq 默认 jvm 内存配置较大,本地环境内存不足;
• 解决方案:修改 bin 目录下的 runbroker.cmd(windows)或 runbroker.sh(linux),将 jvm 内存配置改小,如:
原配置:-xms2g -xmx2g -xmn1g
修改后:-xms512m -xmx512m -xmn256m,保存后重启 broker。
4. 消息发送失败,提示“topic does not exist”
学习本就是一个长期积累的过程,没有捷径,唯有坚持。希望这些干货能够真正帮到你,学以致用,不断提升,在自己的领域里越走越远。喜欢本文,别忘了点赞、在看、转发,我们下期干货继续!
• 原因:未开启自动创建主题,且主题未手动创建;
• 解决方案:启动 broker 时添加参数 autocreatetopicenable=true(本地安装),或重新启动 docker 容器(docker 方式已配置)。
到此这篇关于springboot 整合 rocketmq 实现消息生产与消费的文章就介绍到这了,更多相关springboot 整合 rocketmq 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论