RocketMq源码核心篇整体栏目
| 内容 | 链接地址 |
|---|---|
| 【一】环境搭建、基本使用、可视化界面 | https://zhenghuisheng.blog.csdn.net/article/details/147481401 |
| 【二】rocketmq集群搭建(docker版-2主2从) | https://zhenghuisheng.blog.csdn.net/article/details/154921615 |
| 【三】dashboard安装搭建和启动详解 | https://zhenghuisheng.blog.csdn.net/article/details/155371854 |
如需转载,请附上链接: https://blog.csdn.net/zhenghuishengq/article/details/155371854
dashboard安装搭建和启动详解
- 一、dashboard安装搭建和启动详解
-
- 1,安装和基础配置
- 2,启动和日志
- 3,浏览器访问
- 4,报错与排查
-
- 4.1,dataPath路径问题
- [4.2,JDK 版本不兼容类报错](#4.2,JDK 版本不兼容类报错)
- 4.3,listenPort端口映射问题
- 4.4,端口占用,启动麻烦
一、dashboard安装搭建和启动详解
上一篇讲解了rocketmq集群的搭建,讲解了一个两主两从的集群,来保证rocketmq的高可用和高性能。在搭建dashboard之前,一定要结合上面这篇集群的搭建来完成,二者结合共同完成dashboard的搭建
接下来这篇文章需要搭建一个rocketmq的可视化界面dashboard ,正所谓磨刀不误砍柴工 ,通过这个可视化界面,可以更方便的学习和排查问题,比如查看集群的情况,看生产者、broker、topic、消费者是否正常,看MQ的消息是否发送、消费、堆积和重试等机制
1,安装和基础配置
1.1,下载安装
首先打开官方推荐的可视化界面的网址:https://github.com/apache/rocketmq-dashboard/tags ,其内容如下,因为目前用的是4.x的版本,所以选择1.0版本即可,并且下载zip的压缩包即可,需要在本地改一些配置,再打包丢到服务器上面运行(当然也可以选择直接再本地运行,如果rocketmq用5.x版本,则必须用--Dashboard2.x的可视化包)

随后用idea将项目打开,如果下载不了,那么可以直接拿本人的源码去用,源码地址, 我将dashbroad也放在了这个源码地址目录中
1.2,项目配置
接下来就是修改application.properties中的配置文件,主要改以下四个即可。其他的选择默认属性即可
shell
server.address=0.0.0.0
server.port=8888
rocketmq.config.namesrvAddr=192.168.1.246:9876
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data
最终配置可以参考以下,没必要的情况下直接改上面三个即可
shell
# Dashboard 自己启动的 Web 服务地址
server.address=0.0.0.0
server.port=8888
spring.application.name=rocketmq-dashboard
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
# 访问集群的地址
rocketmq.config.namesrvAddr=192.168.1.246:9876
rocketmq.config.isVIPChannel=
rocketmq.config.timeoutMillis=
# Dashboard 的本地数据存放路径
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data
# 这个开启后,驾驶舱(Dashboard 首页)才能看到 TPS 图表。
rocketmq.config.enableDashBoardCollect=true
# 是否需要登录,如果设置为true,那么就需要创建账号密码
rocketmq.config.loginRequired=false
rocketmq.config.useTLS=false
最后在idea中打成jar包,通过finalshell 传到虚拟机中即可,最后将这个jar包存放在 /usr/local/env/rocketmq/cluster/bashboard 目录下

由于上面设置的 rocketmq.config.dataPath 的路径发生了改变,那么就首先需要递归创建这个目录,随后给这个配置的目录一定的权限
shell
mkdir -p /usr/local/env/rocketmq/cluster/bashboard/data
chmod -R 777 /usr/local/env/rocketmq/cluster/bashboard/data
dashboard目录下的路径结构树如下,此次把整个涉及到rocketmq的目录全部放在主/usr/local/env/rocketmq/cluster 目录下,后续的java包和日志文件,启动和暂停脚本,以及上面的本地数据存放路径放data目录下
java
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ ls -ll
total 46424
-rw-rw-r-- 1 zhenghuisheng zhenghuisheng 371177 Nov 28 21:35 dashboard.log
-rw-r--r-- 1 root root 7 Nov 28 21:20 dashboard.pid
drwxrwxrwx 2 zhenghuisheng zhenghuisheng 4096 Nov 28 17:58 data
-rw------- 1 root root 6399 Nov 28 19:51 nohup.out
-rw-rw-r-- 1 zhenghuisheng zhenghuisheng 47315993 Nov 28 17:54 rocketmq-dashboard-1.0.0.jar
-rw-r--r-- 1 root root 1251 Nov 28 20:12 start-dashboard.sh
-rw-r--r-- 1 root root 1562 Nov 28 21:15 stop-dashboard.sh

2,启动和日志
2.1,启动和配置
由于我的虚拟机里面主要是用jdk21,所以我另外下载了一个jdk8的版本,并且用jdk8版本来启动rocketmq-dashboard,似乎4.x版本的dashboard只能用jdk8版本,跟内部的netty有关。直接通过以下命令下载压缩包即可
shell
wget https://cdn.azul.com/zulu/bin/zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz
随后解压压缩包,解压完成之后我放在 /usr/local/env/java/ 路径下
shell
tar -zxvf zulu8.70.0.23-ca-jdk8.0.372-linux_x64.tar.gz
打包完成之后,将jar包放入到虚拟机中,我这边是放在**/usr/local/env/rocketmq/cluster/dashboard** 路径下面,随后执行启动命令。这里由于是rocketmq-dashboard1.0版本,因此只能选择jdk8的版本来进行项目的启动
shell
nohup /usr/local/env/java/zulu8.70.0.23-ca-jdk8.0.372-linux_x64/bin/java \
-jar rocketmq-dashboard-1.0.0.jar \
--rocketmq.config.namesrvAddr=192.168.1.246:9876 \
> dashboard.log 2>&1 &
每次手动启动也可能会过于麻烦,因此可以写一个项目启动的脚本,在 /usr/local/env/rocketmq/cluster/dashboard 路径下,新建一个 dashboard.sh 的脚本,其内容如下
shell
#!/bin/bash
nohup /usr/local/env/java/zulu8/bin/java \
-jar rocketmq-dashboard-1.0.0.jar \
--rocketmq.config.namesrvAddr=192.168.1.246:9876 \
>> dashboard.log 2>&1 &
echo "Dashboard started..."
查看 rocketmq-dashboard 进程和快速停止进程
shell
# 查看全部的rocketmq-dashboard进程
ps -ef | grep rocketmq-dashboard
# 终止全部的rocketmq-dashboard进程
pkill -f rocketmq-dashboard
上面启动是将日志放在 /usr/local/env/rocketmq/cluster/dashboard 路径下的 dashboard.log 文件中,所以可以直接看启动日志
shell
tail -f dashboard.log
随后可以看到整个项目启动成功

这里的报错排查一定要结合上一篇集群的部署搭建,比如说一些目录文件权限问题,rocketmq集群中每个broker的端口映射问题,以及每个broker中的conf配置文件等,这个需要结合 dashboard.log 日志,具体问题具体分析
2.2,脚本启动
上面启动需要每次手动的kill原来的进程,然后需要手动的执行java启动,如果每次都需要这样子启动,就会太麻烦,因此在这里设置一个启动脚本,脚本需要实现的功能如下
-
查看端口是否被占用,并且释放8888端口
-
获取正在运行的旧线程,并且杀死旧线程
-
使用jdk8启动新jar包,配置nameserver地址和日志
-
配置jvm的初始堆和最大堆,这里设置1g
那么就需要新建一个 start-dashboard.sh 的脚本,可以通过nano命令,也可以直接通过vim命令,根据系统镜像版本自由选择
shell
sudo nano start-dashboard.sh
其脚本内容如下,提前设置一些变量,后续引用即可。
shell
#!/bin/bash
# ================= RocketMQ Dashboard 启动脚本 =================
DASHBOARD_HOME="/usr/local/env/rocketmq/cluster/bashboard"
JAVA_HOME="/usr/local/env/java/zulu8.70.0.23-ca-jdk8.0.372-linux_x64"
JAR_NAME="rocketmq-dashboard-1.0.0.jar"
PID_FILE="$DASHBOARD_HOME/dashboard.pid"
LOG_FILE="$DASHBOARD_HOME/dashboard.log"
PORT=8888
cd $DASHBOARD_HOME
echo "检查是否有进程占用端口 $PORT ..."
PID_ON_PORT=$(sudo lsof -t -i:$PORT)
if [ -n "$PID_ON_PORT" ]; then
echo "端口 $PORT 被占用,PID=$PID_ON_PORT,正在杀死..."
sudo kill -9 $PID_ON_PORT
echo "端口占用进程已杀死。"
fi
echo "检查是否已有 dashboard.pid ..."
if [ -f "$PID_FILE" ]; then
OLDPID=$(cat $PID_FILE)
if ps -p $OLDPID > /dev/null 2>&1; then
echo "Dashboard PID 文件存在,杀死旧进程 PID=$OLDPID ..."
sudo kill -9 $OLDPID
echo "旧进程已杀死。"
fi
fi
JAVA_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
echo "启动 RocketMQ Dashboard ..."
nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $JAR_NAME \
--rocketmq.config.namesrvAddr=192.168.1.246:9876 \
>> $LOG_FILE 2>&1 &
echo $! > $PID_FILE
echo "启动成功!PID=$(cat $PID_FILE)"
echo "日志文件:$LOG_FILE"
配置文件如下,由于shell脚本的命令规范,所以一定要注意一些脚本的换行,比如杀死进程的内容,启动的内容,根据我的格式就行,尤其是启动jar包命令这行。

随后执行这个脚本,如果是centos系统一般将bash替换成sh即可
shell
sudo bash start-dashboard.sh
# centos版本
sh start-dashboard.sh
其结果如下,端口号被占用、进程杀死、项目启动成功这些日志都被打印
shell
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ sudo bash start-dashboard.sh
检查是否有进程占用端口 8888 ...
端口 8888 被占用,PID=133094,正在杀死...
端口占用进程已杀死。
检查是否已有 dashboard.pid ...
启动 RocketMQ Dashboard ...
启动成功!PID=226744
日志文件:/usr/local/env/rocketmq/cluster/bashboard/dashboard.log
查看dashboard日志,也可以发现项目成功启动
shell
tail -f dashboard.log
其日志结果如下,那么就可以直接通过执行脚本来实现dashboard项目重启

2.3,脚本暂停
上面的脚本是会杀死进程,但是也会重新启动,如果需要一个仅仅暂停的脚本,那么就需要新建一个 stop-dashboard.sh 的脚本,可以通过nano命令,也可以直接通过vim命令,根据系统镜像版本自由选择
shell
sudo nano stop-dashboard.sh
脚本需要实现的功能如下
- 正常杀死进程
- 杀不掉则kill -9
- 删除pid文件
其脚本内容如下
shell
#!/bin/bash
# ================= RocketMQ Dashboard 停止脚本 =================
DASHBOARD_HOME="/usr/local/env/rocketmq/cluster/bashboard"
PID_FILE="$DASHBOARD_HOME/dashboard.pid"
PORT=8888
echo "================ 停止 RocketMQ Dashboard ================"
# 1. 优先从 PID 文件停止
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "找到 PID 文件:$PID_FILE"
echo "Dashboard 正在运行,PID=$PID,准备停止..."
kill $PID
sleep 1
# 如果还没死则强制 kill -9
if ps -p $PID > /dev/null 2>&1; then
echo "进程未退出,执行 kill -9 $PID ..."
kill -9 $PID
fi
echo "Dashboard 已停止。"
else
echo "PID 文件存在,但进程不在运行,删除 PID 文件。"
fi
rm -f "$PID_FILE"
exit 0
fi
echo "没有找到 PID 文件,尝试根据端口查找进程..."
# 2. 如果 pid 文件不存在,根据端口查找正在监听 8888 的进程
PID_ON_PORT=$(sudo lsof -t -i:$PORT)
if [ -n "$PID_ON_PORT" ]; then
echo "端口 $PORT 被进程占用,PID=$PID_ON_PORT,准备停止..."
kill $PID_ON_PORT
sleep 1
# 强制 kill
if ps -p $PID_ON_PORT > /dev/null 2>&1; then
echo "进程未退出,执行 kill -9 $PID_ON_PORT ..."
kill -9 $PID_ON_PORT
fi
echo "RocketMQ Dashboard 已停止。"
else
echo "未找到正在运行的 Dashboard 进程。"
fi
echo "========================================================="
shell配置文件如下,脚本的配置也要符合规范

随后执行脚本即可
shell
sudo bash stop-dashboard.sh
其结果如下,已经将进程停止
shell
zhenghuisheng@zhenghuisheng-server:/usr/local/env/rocketmq/cluster/bashboard$ sudo bash stop-dashboard.sh
================ 停止 RocketMQ Dashboard ================
找到 PID 文件:/usr/local/env/rocketmq/cluster/bashboard/dashboard.pid
Dashboard 正在运行,PID=226744,准备停止...
Dashboard 已停止。
可以查看这个完整的流程,先杀死进程,然后查看dashboard进程状态,然后再开启进程,再查看dashboard进程状态

// 停止进程
sudo bash stop-dashboard.sh
// 查看rocketmq-dashboard状态
ps -ef | grep rocketmq-dashboard
// 启动进程
sudo bash start-dashboard.sh
// 查看rocketmq-dashboard状态
ps -ef | grep rocketmq-dashboard
3,浏览器访问
上面已经将整个项目启动成功,接下来继续通过浏览器将 dashboard 面板打开,在浏览器中访问ip + port即可
java
http://192.168.1.246:8888/#/cluster
在这个页面下,可以看到整个集群的可视化面板可以成功访问,并且整个集群也加载在里面,那么此时的dashboard可视化页面就算是完整的搭建成功了。如下面的这个集群列表,此时所有的集群列表都加载如下

topic的主题如下,之前测试的一些topic也都加载了进来

消费者页面如下,此时一些默认的消费者组也被加了进来

4,报错与排查
4.1,dataPath路径问题
在项目解压后的application.properties文件中,如果不设置dataPath会用默认的 /tmp/rocketmq-console/data , 那么就可能会出现没权限的问题,在日志文件中就会报这个错
/tmp/rocketmq-console/data 权限不够,写入失败
dashboard 无法写入本地数据
解决方案就是重新设置dataPath路径,并且需要创建目录,并且给予权限
shell
rocketmq.config.dataPath=/usr/local/env/rocketmq/cluster/bashboard/data
mkdir -p /usr/local/env/rocketmq/cluster/bashboard/data
chmod -R 777 /usr/local/env/rocketmq/cluster/bashboard/data
4.2,JDK 版本不兼容类报错
一开始我的虚拟机中只有jdk21版本,但是遇到启动失败的问题,说是Netty的版本不兼容,因此换成了jdk8的版本启动
Netty 报错 / 启动失败 / ClassNotFound
RocketMQLog:WARN No appenders could be found
据查Rocketmq4.x版本只能它通过JDK8启动
4.3,listenPort端口映射问题
在前面的集群搭建中,在这发现前面集群配置的端口映射出现问题,因此需要修改前面的docker-compose.yml文件,修改里面的port映射
shell
brokerA-master:
- "11911:10911"
- "11909:10909"
brokerA-slave:
- "20911:20911"
- "20909:20909"
brokerB-master:
- "11911:11911"
- "11909:11909"
brokerB-slave:
- "21911:21911"
- "21909:21909"
4.4,端口占用,启动麻烦
这个就是属于优化的问题,因为启动失败端口被占用等问题,进程杀死复杂问题,每次都要一个个输入命令会特别麻烦,因此手动的设置启动脚本和停止脚本,方便于开发和维护
shell
start-dashbroad.sh
stop-dashbroad.sh