RocketMQ安装与配置
RocketMQ安装
环境要求
- JDK 1.8 或更高版本(RocketMQ 是⼀个典型的 Java 应⽤,所以需要提前安装 JDK。我们这⾥采⽤的是 17 版本。JDK 的安装过程略。)
- 64位操作系统
- 1G+ 内存
Windows环境安装
1.下载 RocketMQ 安装包
访问 RocketMQ 官网 下载二进制安装包,找到 Binary下载 列选择对应版本进行下载, 推荐 5.3.0 (或更高版本) 并下载。将下载的 ZIP 文件解压到一个没有中文和空格的目录,例如 D:\SoftWare\RocketMQ\rocketmq-all-5.3.0-bin-release。我们将这个目录称为 %ROCKETMQ_HOME%
2.修改 RocketMQ 配置
说明
默认配置在 Linux 下通常设定为 8G,这在 Windows 开发机上往往会导致启动失败(内存不足)。
修改 JVM 内存配置(重要)- 进入
%ROCKETMQ_HOME%\bin目录。- 编辑
runserver.cmd(NameServer 启动脚本),找到set JAVA_OPT=%JAVA_OPT% -server -Xms8g -Xmx8g ...,修改为较小的值,例如:set JAVA_OPT=%JAVA_OPT% -server -Xms256m -Xmx256m - 编辑
runbroker.cmd(Broker 启动脚本),找到set JAVA_OPT=%JAVA_OPT% -server -Xms8g -Xmx8g ...,修改为:set JAVA_OPT=%JAVA_OPT% -server -Xms256m -Xmx256m
- 编辑
- 进入
修改 Broker 配置文件 (可选)- 打开
%ROCKETMQ_HOME%\conf\broker.conf。如果需要外网访问或指定 IP,可添加或修改:brokerIP1 = 你的本机IP。默认情况下,Broker 会尝试自动获取本地 IP,通常无需修改即可在本地测试使用。
- 打开
3.配置环境变量
为了在任何目录下都能运行命令,建议配置系统环境变量- 新建系统变量
ROCKETMQ_HOME,值为你的解压路径 (如D:\SoftWare\RocketMQ\rocketmq-all-5.3.0-bin-release)。 - 将
%ROCKETMQ_HOME%\bin添加到系统的Path变量中。
- 右键「此电脑」→「属性」

- 「高级系统设置」

- 「环境变量」

系统变量区域,点击「新建」:
- 变量名:
ROCKETMQ_HOME - 变量值:RocketMQ 安装路径(如
D:\SoftWare\RocketMQ\rocketmq-all-5.3.0-bin-release)。
- 编辑系统变量中的
Path:
- 点击「新建」,添加
%ROCKETMQ_HOME%\bin。 - 点击「确定」保存所有设置。

4.启动 RocketMQ 服务
启动 NameServer
- 打开命令行 (CMD),进入
%ROCKETMQ_HOME%\bin目录。 - 执行命令:cmd
start mqnamesrv.cmd
注意
不要直接双击运行,建议使用 start 命令或在命令行运行,以便查看日志窗口。启动成功后会看到一个名为 "Apache RocketMQ Name Server" 的窗口。
- 打开命令行 (CMD),进入
启动 Broker
- 打开一个新的命令行窗口,进入
%ROCKETMQ_HOME%\bin目录。 - 执行命令(指定 NameServer 地址):cmd
start mqbroker.cmd -n localhost:9876
注意
如果是集群或特定 IP 环境,localhost 可能需要替换为具体 IP。启动成功后会看到 "Apache RocketMQ Broker" 窗口。
- 打开一个新的命令行窗口,进入
5.验证安装
- 观察两个命令行窗口,如果没有报错且持续运行,说明启动成功。
- 可以查看
%ROCKETMQ_HOME%\logs\rocketmqlogs\目录下的日志文件确认详细信息。
6.停止服务
- 直接关闭上述打开的两个命令行窗口即可停止服务。
- 或者在命令行执行:cmd
shutdown.cmd -n localhost:9876 shutdown.cmd -b localhost:9876
Linux环境
1.下载
方式一: 官网下载并上传(推荐)
- 官网下载页 选择最新版本的二进制包下载
- 通过 SFTP 上传到服务器

方式二: 使用 wget 命令直接下载(不推荐,非国内网站,下载过慢)
# 新建并进入指定目录 (如果目录已存在则不会删除并新建, 会保留)
mkdir -p /opt/software
cd /opt/software/
wget https://archive.apache.org/dist/rocketmq/5.3.0/rocketmq-all-5.3.0-bin-release.zip
2.解压
通过 unzip 命令解压 zip 压缩包
cd /opt/software/
ls
unzip rocketmq-all-5.3.0-bin-release.zip
ls解压 
解压结果 
3.修改默认配置
说明
RocketMQ 相关配置文件中初始堆大小和默认最大堆大小默认为4个g,一般在个人电脑 / 虚拟机上压力还是比较大,所以建议修改一下
生产环境不建议调整。这⼀系列参数实际上就是RocketMQ的JVM调优结果。
- runserver.sh
如果 JDK(JVM) 版本 小于等于 9,需修改 89 行 -Xms4g(JVM 初始堆大小) -Xmx4g(JVM 最大堆大小) -Xmn2g(JVM 年轻代大小)配置项,建议修改为 -Xms512m -Xmx512m-Xmn256m,也可根据实际情况调整
如果 JDK(JVM) 版本 大于 9,需修改 94 行 -Xms4g(JVM 初始堆大小) -Xmx4g(JVM 最大堆大小)配置项,建议修改为 -Xms512m -Xmx512m,也可根据实际情况调整
cd /opt/software/rocketmq-all-5.3.0-bin-release
vim bin/runserver.sh
# 根据 JDK(JRE) 版本修改 runserver.sh 文件配置
# 如果 JDK(JVM) 版本 小于等于 9,需修改 89 行 -Xms4g(JVM 初始堆大小) -Xmx4g(JVM 最大堆大小) -Xmn2g(JVM 年轻代大小)配置项,建议修改为 -Xms512m -Xmx512m-Xmn256m,也可根据实际情况调整
-Xms512m -Xmx512m -Xmn256m
# 如果 JDK(JVM) 版本 大于 9,需修改 94 行 -Xms4g(JVM 初始堆大小) -Xmx4g(JVM 最大堆大小)配置项,建议修改为 -Xms512m -Xmx512m,也可根据实际情况调整
-Xms512m -Xmx512m -Xmn256m原始runserver.sh文件 
JDK版本 
因为 JDK 版本为 17.0.18,所以修改后内容如下 
- runbroker.sh
同理,调整 runbroker.sh 中的内存大小 
# 第 103 行
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
# 修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"- tools.sh(可选)
如果需要使用 tools.sh 进行安装测试,则需修改 tools.sh 文件内配置的内存大小 
# 第 57 行
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
# 修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"4.配置环境变量
为了方便在任何目录下执行 RocketMQ 命令,建议配置 ROCKETMQ_HOME 环境变量。
- 编辑配置文件
vim /etc/profile
# 或者仅针对当前用户: vim ~/.bashrc- 添加以下内容到文件末尾
# NAMESRV_ADDR 环境变量(启动 Broker时,需要给 Broker 指定 对应的 NAMESRV 的地址)
export NAMESRV_ADDR=localhost:9876
# ROCKETMQ_HOME 环境变量 (可选但推荐)
export ROCKETMQ_HOME=/opt/software/rocketmq-all-5.3.0-bin-release
export PATH= $ PATH: $ ROCKETMQ_HOME/bin- 使配置生效
source /etc/profile
# 如果修改的是 .bashrc,则执行: source ~/.bashrc- 验证环境变量
echo $ROCKETMQ_HOME
# 应输出: /opt/software/rocketmq-all-5.3.0-bin-release
echo $NAMESRV_ADDR
# 应输出:localhost:98765.启动 RocketMQ 服务
RocketMQ 由两个核心组件组成:NameServer (注册中心) 和 Broker (消息代理)。必须先启动 NameServer,再启动 Broker。
启动 NameServer 并验证是否启动成功
- 进入
%ROCKETMQ_HOME%\bin目录,执行命令,启动 NameServershell# 进入 bin 目录 cd $ ROCKETMQ_HOME/bin # 启动 NameServer (后台运行) # nohup 表示忽略挂起信号,& 表示后台运行 nohup sh mqnamesrv & - 执行命令,验证 NameServer 是否启动成功shell看到
# 查看进程 jps -l | grep NamesrvStartup # 或者查看日志 (日志默认在 ~/logs/rocketmqlogs/namesrv.log) tail -f ~/logs/rocketmqlogs/namesrv.logThe Name Server boot success...字样即表示成功。
- 进入
启动 Broker 并验证是否启动成功
- 确保仍在 bin 目录下,执行命令,启动 Brokershell
# -n 参数指定 NameServer 的地址 (IP:端口),默认端口为 9876 # 如果是单机测试,IP 可以是 localhost 或 127.0.0.1 # 如果需要外网访问,建议指定服务器的真实 IP (例如: 192.168.x.x) nohup sh mqbroker -n localhost:9876 & - 验证 Broker 是否启动成功shell看到
# 查看进程 jps -l | grep BrokerStartup # 查看日志 tail -f ~/logs/rocketmqlogs/broker.logThe broker[...] boot success...字样即表示成功。
- 确保仍在 bin 目录下,执行命令,启动 Broker
6.安装验证
RocketMQ 提供了简单的命令行工具来测试收发消息。
- 发送测试消息
- 进入
%ROCKETMQ_HOME%\bin目录,执行命令,发送测试消息shell输出cd $ ROCKETMQ_HOME/bin sh tools.sh org.apache.rocketmq.example.quickstart.ProducerSendResult [sendStatus=SEND_OK, ...]表示发送成功。
- 进入
- 接收(消费)测试消息
- 进入
%ROCKETMQ_HOME%\bin目录,执行命令,接收测试消息shell输出cd $ ROCKETMQ_HOME/bin sh tools.sh org.apache.rocketmq.example.quickstart.ConsumerConsumeMessageThread_x Receive New Messages ...表示接收成功。
- 进入
7.停止服务
停止服务的顺序通常没有严格限制,但建议先停 Broker 再停 NameServer。
cd $ ROCKETMQ_HOME/bin
# 停止 Broker
sh mqshutdown broker
# 停止 NameServer
sh mqshutdown namesrv其它
日志位置
- 所有日志默认存储在用户主目录下的 ~/logs/rocketmqlogs/ 文件夹中。
- namesrv.log: NameServer 日志
- broker.log: Broker 日志
常见问题
Windows 本地 Java 程序无法连接到虚拟机 Linux 中的 RocketMQ NameServer
原因分析
- 虚拟机 Linux 系统的防火墙未开放 RocketMQ 核心端口,导致网络请求被拦截;
- RocketMQ 配置中 Broker/NameServer 绑定的是虚拟机内网 IP,Windows 无法访问;
- 代码中 NameServer 地址配置错误(如写死 localhost 而非虚拟机 IP)。
解决方案
方案1:开放 Linux 防火墙端口(推荐)
RocketMQ 核心端口列表:
- NameServer:9876(TCP)- 客户端发现服务入口
- Broker:10911(TCP)- 客户端收发消息主端口
- Broker:10909(TCP)- VIP 通道(代码未禁用时需开放)
- Broker:10912(TCP)- HA 主从同步(集群模式需开放)
执行命令:
# 开放核心端口
firewall-cmd --permanent --add-port=9876/tcp
firewall-cmd --permanent --add-port=10911/tcp
firewall-cmd --permanent --add-port=10909/tcp
firewall-cmd --permanent --add-port=10912/tcp
# 重新加载防火墙配置使修改生效
firewall-cmd --reload
# 验证端口是否开放成功
firewall-cmd --list-ports方案 2:临时关闭防火墙(测试环境可选)
# CentOS/RHEL 系统
systemctl stop firewalld
systemctl disable firewalld
# Ubuntu/Debian 系统
ufw disableJava客户端项目搭建
之前的步骤实际上是在服务器上快速验证RocketMQ的服务状态,接下来我们动⼿搭建⼀个RocketMQ的客户 端应⽤,在实际应⽤中集成使⽤RocketMQ。
📌示例代码不用强行记忆,在 RocketMQ 的源码包中有个 example 模块,其中就有这些示例代码。
方式一:Java客户端项目直接下载
方式二:具体搭建流程
- 创建一个标准的 maven 项目,在 pom.xml 中引入一下核心依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.3.0</version>
</dependency>- 创建一个简单的消息生产者
public class Producer {
/**
* The number of produced messages.
*/
public static final int MESSAGE_COUNT = 2;
public static final String PRODUCER_GROUP = "please_rename_unique_group_name";
public static final String DEFAULT_NAMESRVADDR = "192.168.218.134:9876";
public static final String TOPIC = "TopicTest";
public static final String TAG = "TagA";
public static void main(String[] args) throws MQClientException, InterruptedException {
/*
* Instantiate with a producer group name.
*/
DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
/*
* Specify name server addresses.
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
* <pre>
* {@code
* producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
* </pre>
*/
// Uncomment the following line while debugging, namesrvAddr should be set to your local address
// producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
/*
* Launch the instance.
*/
producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
// producer.setNamesrvAddr("worker1:9876;worker2:9876;worker3:9876");
producer.start();
for (int i = 0; i < MESSAGE_COUNT; i++) {
try {
/*
* Create a message instance, specifying topic, tag and message body.
*/
Message msg = new Message(TOPIC /* Topic */,
TAG /* Tag */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
msg.setKeys("aaaa");
/*
* Call send message to deliver message to one of brokers.
*/
producer.sendOneway(msg);
SendResult sendResult = producer.send(msg, 20 * 1000);
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.printf("%s%n", sendResult);
}
@Override
public void onException(Throwable e) {
System.out.println(e.getMessage());
}
});
System.out.printf("%s%n", sendResult);
} catch (Exception e) {
e.printStackTrace();
Thread.sleep(1000);
}
}
/*
* Shut down once the producer instance is no longer in use.
*/
producer.shutdown();
}
}说明
运行其中的 main 方法,就会往 RocketMQ 中发送两条消息。在这个实现过程中,需要注意一下的是对于生产者,需要指定对应的 nameserver 服务的地址,这个地址需要指向自己的服务器。
- 创建一个消息消费者接收 RocketMQ 中的消息
/**
* This example shows how to subscribe and consume messages using providing {@link DefaultMQPushConsumer}.
*/
public class Consumer {
// public static final String CONSUMER_GROUP = "newGroup";
public static final String CONSUMER_GROUP = "please_rename_unique_group_name";
public static final String DEFAULT_NAMESRVADDR = "192.168.218.134:9876";
public static final String TOPIC = "TopicTest";
public static void main(String[] args) throws MQClientException {
/*
* Instantiate with specified consumer group name.
*/
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
/*
* Specify name server addresses.
* <p/>
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
* <pre>
* {@code
* consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
* </pre>
*/
// Uncomment the following line while debugging, namesrvAddr should be set to your local address
consumer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
/*
* Specify where to start in case the specific consumer group is a brand-new one.
*/
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
/*
* Subscribe one more topic to consume.
*/
consumer.subscribe(TOPIC, "*");
/*
* Register callback to execute on arrival of messages fetched from brokers.
*/
consumer.registerMessageListener((MessageListenerConcurrently) (msg, context) -> {
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msg);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
/*
* Launch the consumer instance.
*/
consumer.start();
System.out.printf("Consumer Started.%n");
}
}说明
运行其中的 main 方法后,就可以启动一个 RocketMQ 消费者,接收之前发到 RocketMQ 上的消息,并将消息内容打印出来。在这个实现过程中,需要重点关注的有两点。一是对于消费者,同样需要指定 nameserver 的地址。二是消费者需要在 RocketMQ 中订阅具体的 Topic,只有发送到这个 Topic 上的消息才会被这个消费者接收到。
RocketMQ可视化管理服务搭建
在之前的简单实验中,RocketMQ 都是以后台服务的方式在运行,我们并不很清楚 RocketMQ 是如何运行的。RocketMQ 的社区就提供了⼀个图形化的管理控制台 Dashboard,可以用可视化的方式直接观测并管理 RocketMQ 的运行过程。
1. Dashboard Jar 包下载
方式一:官网下载并打包
- 官网下载 Dashboard 项目(SpringBoot),Zip 压缩包
Dashboard 服务并不在 RocketMQ 的运行包中,需要到 RocketMQ 的官网下载页面 单独下载。

- 打包项目为可运行的 Jar 包
# mvn clean package -DskipTests 核心是「清理 + 打包 + 跳过测试」
# clean 保证环境干净,package 完成编译打包,-DskipTests 跳过测试提升构建速度
# 区分 skipTests(只跳过测试执行)和 maven.test.skip=true(跳过测试编译 + 执行),按需使用
# -DskipTests 只会跳过测试执行,不会跳过测试代码的编译;如果想连测试代码编译都跳过,需要用 -Dmaven.test.skip=true
mvn clean package -DskipTests
方式二:直接下载已打包 Jar 包
2. 部署
- 新建 application.yaml 配置文件
配置 nameserver(注册中心) 的地址
rocketmq:
config:
namesrvAddrs:
- 127.0.0.1:9876- 执行命令,启动 dashboard
# java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar
# 使用 Java 运行一个可执行的 JAR 包,这里运行的是 RocketMQ Dashboard 应用。
# 1>dashboard.log
# 将标准输出(文件描述符 1)重定向到 dashboard.log 文件。
# 1 代表标准输出(stdout),通常指程序正常运行时打印的信息。
# > 是重定向符号,将输出写入指定文件(覆盖原内容)。
# 等价写法:>dashboard.log 默认也是重定向标准输出。
# 2>&1
# 将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)当前指向的位置。
# 2 代表标准错误(stderr),通常指程序运行时的错误信息。
# >& 用于将一个输出流合并到另一个输出流。
# 由于前面已经把标准输出指向了 dashboard.log,这里的效果就是将标准错误也写入同一个 dashboard.log 文件,实现所有输出(正常日志 + 错误日志)的统一记录。
# &
# 将整个命令放到后台运行。终端不会阻塞,可以继续执行其他命令;但关闭终端时进程可能退出(取决于 shell 的 hup 设置),如需长期运行建议配合 nohup 使用。
java -jar rocketmq-dashboard-2.0.0.jar 1>dashboard.log 2>&1 &- Windows 访问 Dashboard
Dashboard 客户端端口默认为 8080,所以通常 RocketMQ Dashboard 页面访问路径为 ip:8080

常见问题
Maven 打包 rocketmq-dashboard 失败,frontend-maven-plugin 下载 yarn 超时或 SSL 握手失败
原因分析
frontend-maven-plugin 在构建前端资源时,需要从 GitHub 下载 yarn 和 node 的二进制文件(默认地址 https://github.com/...)。
由于网络不稳定或防火墙干扰,下载过程容易超时或出现 SSL 握手错误(如 Remote host terminated the handshake: SSL peer shut down incorrectly)。
解决方案
修改 pom.xml,配置国内镜像源(推荐)
为
frontend-maven-plugin指定国内镜像源(如华为云),可大幅提高下载成功率,避免网络问题。
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.11.3</version>
<configuration>
<workingDirectory>frontend</workingDirectory>
<installDirectory>target</installDirectory>
<!-- 新增部分 -->
<!-- 指定 Node.js 和 Yarn 的下载源为华为云镜像 -->
<nodeDownloadRoot>https://repo.huaweicloud.com/nodejs/</nodeDownloadRoot>
<yarnDownloadRoot>https://repo.huaweicloud.com/yarn/</yarnDownloadRoot>
<!-- 可选:将安装目录移到 target 下,避免权限问题 -->
<installDirectory>${project.build.directory}/frontend</installDirectory>
</configuration>
<!-- ... 其他 executions 保持不变 ... -->
</plugin>Rocketmq-dashboard 启动成功,但 Windows 无法访问
原因分析
- 虚拟机 Linux 系统的防火墙未开放 RocketMQ_Dashboard 核心端口,导致网络请求被拦截;
解决方案
方案1:开放 Linux 防火墙端口(推荐)
RocketMQ 核心端口列表:
- Dashboard:8080(TCP)- 客户端入口
执行命令:
# 开放核心端口
firewall-cmd --permanent --add-port=8080/tcp
# 重新加载防火墙配置使修改生效
firewall-cmd --reload
# 验证端口是否开放成功
firewall-cmd --list-ports方案 2:临时关闭防火墙(测试环境可选)
# CentOS/RHEL 系统
systemctl stop firewalld
systemctl disable firewalld
# Ubuntu/Debian 系统
ufw disableRocketMQ 分布式集群搭建
单节点 RocketMQ 服务无法直接用于生产环境。一旦服务器出现异常,例如磁盘损坏,存储在本地磁盘上的所有数据都会丢失,RocketMQ 中的消息也会随之丢失,会造成严重的业务影响。因此,我们需要搭建RocketMQ 分布式集群,从架构层面避免单点故障带来的数据风险。
RocketMQ 分布式集群采用主从架构实现高可用。在多台服务器组成的集群中,一部分节点作为 Master 节点,负责处理客户端的读写请求;另一部分节点作为 Slave 节点,用于同步备份 Master 节点的数据。这样一来,即使 Master 节点因磁盘损坏等原因发生故障,Slave 节点仍保存着完整的备份数据,确保消息数据不会丢失。

准备七台相同的 Linux 服务器,参照 RocketMQ安装(Linux环境),在 七个虚拟机服务器上都安装上 RocketMQ 服务,无需启动
为 七台虚拟机 配置域名
shell# 编辑 /etc 目录下的 hosts 文件,添加域名 vim /etc/hostsshell# hosts 文件末尾添加以下内容 IP 根据七台虚拟机的 IP 地址进行修改 192.168.218.136 node1 192.168.218.137 node2 192.168.218.138 node3 192.168.218.139 node4 192.168.218.140 node5 192.168.218.141 node6 192.168.218.142 node7
