04_虚拟机中间件部署_RocketMQ 5.1.4 部署、docker 安装 dashboard 可视化、JDK 21 安装
RocketMQ 5.1.4
RocketMQ 5.1.4 和 JDK 21
作用:做消息的分发、削峰填谷、异步
安装 JDK 21
因为 rockermq 是依赖于java环境的,所以虚拟机也需要有java环境,现在安装个 jdk 21.
下载解压
得到下载地址后,用wget命令拉取即可,这里下载的是 linux 版本 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz 解压 tar -zxvf jdk-21_linux-x64_bin.tar.gz 

unzip 和 tar -zxvf 的区别
unzip 用来解压 zip 文件,tar -zxvf 用来解压 tar.gz 文件。

配置环境变量
.bash_profile 是 Bash 登录 shell 的初始化配置文件,用于设置 用户级环境变量、PATH、别名、函数,在用户登录 Linux 系统时自动执行。
Bash :Bourne Again Shell,是 Linux/Unix 系统的默认命令行解释器(Shell)
我先全局查找下 .bash_profile 文件在哪里 sudo find / -name ".bash_profile" 2>/dev/null 
我当前的 /home/ljh 这个目录是没有这个.bash_profile配置文件的,可以自己创建一个,用于我当前登录用户 ljh 可以使用。 .bash_profile 是 Bash 登录 Shell 的初始化配置文件,用于设置用户级环境变量和启动配置 在 .bash_profile 配置文件里面添加环境变量 export JAVA_HOME=/home/ljh/nfturbo/middleware/java/jdk-21.0.10 export PATH=$JAVA_HOME/bin:$PATH 执行这个配置文件 source .bash_profile 如图可以看到jdk的环境变量生效了,可以在任意位置查看版本号了。


虚拟机 安装 RocketMQ 5.1.4
重启命令
虚拟机重启之后,目前broker 和 nameserver 还不会自动启动,手动命令启动
在根目录下执行这个命令: 位置: cd /home/ljh/nfturbo/middleware/rocketmq/rocketmq-all-5.1.4-bin-release 启动 name server nohup sh bin/mqnamesrv -n "192.168.209.129:9876" & 启动 broker nohup ./bin/mqbroker -n localhost:9876 -c conf/broker.conf autoCreateTopicEnable=true & 
然后查看是否启动成功
ps -ef | grep broker
ps -ef | grep mqnamesrv
对比下就可以看到启动成功了

命令获取
wget https://dist.apache.org/repos/dist/release/rocketmq/5.1.4/rocketmq-all-5.1.4-bin-release.zip 下载后用unzip解压就行了 启动
启动name server
在根目录下执行这个命令: 位置:/home/ljh/nfturbo/middleware/rocketmq/rocketmq-all-5.1.4-bin-release nohup sh bin/mqnamesrv -n "192.168.209.129:9876" & 在这个启动命令在后台执行,我们就不用一直等。 nohup 是 让进程不被挂断 & 是 让进程在后台运行 

移除掉偏向锁的参数
到 /home/ljh/nfturbo/middleware/rocketmq/rocketmq-all-5.1.4-bin-release/bin 位置下的 runbroker.sh 配置文件里面, 移除掉 UseBiasedLocking 这个偏向锁的参数。 因为 偏向锁被废弃了,所以需要移除这个VM参数 vim 进去后 直接用 ? + 关键词 查找,然后回车即可。 
启动Broker
修改conf/broker.conf,加入:brokerIP1=你的ip地址 brokerIP1=192.168.209.129 直接在 RocketMQ 根目录启动即可 ./bin/mqbroker -n localhost:9876 -c conf/broker.conf autoCreateTopicEnable=true 或者后台启动,然后回车即可【我用这个,不然还得重新开另一个连接】 nohup ./bin/mqbroker -n localhost:9876 -c conf/broker.conf autoCreateTopicEnable=true & nohup → 关闭终端也不会挂掉 & → 后台运行,立即返回 shell 

查看是否启动成功
ps aux | grep broker ps aux | grep mqnamesrv 或者 ps -ef | grep broker ps -ef | grep mqnamesrv ps 是 Linux/Unix 下用来查看当前系统运行进程的命令 ps aux —— 显示系统中所有进程(BSD 风格) ps -ef —— 显示系统中所有进程(Unix 风格) a:显示所有用户的进程 u:显示用户信息 x:显示没有控制终端的进程(比如后台进程) grep 用来在文本中搜索匹配的字符串 
mqnamesrv 和 broker 都有进程,表示都启动成功了

调整内存大小
如果内存不够,修改 bin/runserver.sh 和 runbroker.sh,把内存调小一点。 我这里自己测试用的,也不用太多占内存 

消息和日志存放位置
配置文件没改的话,日志和消息数据库位置


查看日志是否启动成功
1、直接查关键字
grep "boot success" broker.log grep "boot success" namesrv.log 
2、查看 NameServer 日志 namesrv.log
cd /home/ljh/logs/rocketmqlogs tail -f namesrv.log 或者 tail -n 100 /home/ljh/logs/rocketmqlogs/namesrv.log 日志显示成功启动


3、查看 broker 日志 broker.log
cd /home/ljh/logs/rocketmqlogs tail -f broker.log 或者 tail -n 100 /home/ljh/logs/rocketmqlogs/broker.log 日志显示成功启动

4:jps -l 查看当前机器上运行的 Java 程序进程
列出所有 Java 进程,并显示启动的主类或 jar 包路径 jps -l 可以看到 broker 和 nameserver都启动成功了

docker 安装 dashboard
为什么rockermq安装在宿主机,而dashboard 安装在docker?
因为 RocketMQ 是核心服务(高性能组件),而 Dashboard 只是一个管理工具,放容器里更方便、更安全、更解耦。
Dashboard 是运行在 Docker 容器里的 JVM,不在宿主机 JVM 进程列表中。
命令
Docker 会从 Docker Hub 下载镜像层(layers) 下载完成后,这个镜像 不是放在当前目录,而是存储在 Docker 的 默认存储目录,由 Docker 管理。 镜像默认存储在:/var/lib/docker docker pull apacherocketmq/rocketmq-dashboard:latest 启动: docker run -d \ --name rocketmq-dashboard \ --restart unless-stopped \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.209.129:9876" \ -p 8080:8080 \ -t apacherocketmq/rocketmq-dashboard:latest 解释: -d 关掉终端,容器还会继续运行 --restart unless-stopped \ 容器自动重启策略 ,除非手动停止,否则会自动重启 -Drocketmq.namesrv.addr=192.168.209.129:9876 Dashboard 去连接 RocketMQ NameServer 总结: 从镜像创建一个容器,并在后台运行 RocketMQ Dashboard Dashboard 是运行在 Docker 容器里的 Java 程序 ------------------------------------------------ 后面报错,重新安装了: 1、先拉取镜像 docker pull styletang/rocketmq-console-ng:latest 2、重新创建容器 docker run -d \ --name rocketmq-dashboard \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.209.129:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 8080:8080 \ -t styletang/rocketmq-console-ng 
启动失败
浏览器无法访问,开始排除问题
1、查看进程
1-1:ps -ef | grep dashboard


1-2:docker ps

1-3:直接看容器进程 docker top rocketmq-dashboard

2、查看日志
2-1:容器日志路径
安装在docker 里面的服务的具体位置 cd /var/lib/docker/containers 
问题:
为什么 docker logs -f rocketmq-dashboard 这个命令看日志有报错,
看 ad4e0f8bbf72f76f85bee782de60260d12f10bf3d33ca6b7de62aac1097f9fd8-json.log ·······这个日志没有报错,不都是 dashboard的日志吗?
回答:
两个日志是同一来源,但看到的内容不一定完全一致,因为: docker logs 是 Docker 解析后的流式输出 *-json.log 是 Docker 原始底层日志文件 就是这个日志也有报错,只不过是 json 格式,我没看出来而已 
2-1:通过 docker 容器名字查看日志 docker logs -f rocketmq-dashboard
docker logs 是 Docker 客户端提供的子命令,用来查看容器标准输出日志 docker logs -f rocketmq-dashboard 执行这个查询日志,Docker 会: 1、找到容器 rocketmq-dashboard 2、找到这个容器的日志驱动(默认 json-file) 3、读取:/var/lib/docker/containers/<容器ID>/<容器ID>-json.log 4、解析 JSON 5、输出人类可读内容 只查看 100 行 docker logs --tail 100 rocketmq-dashboard 
可以看到报错信息了
RocketMQ 内部调用链是:Dashboard → NameServer → Broker Dashboard → NameServer (查询 Broker 地址) Dashboard → Broker (直接通信) 1️⃣ Dashboard 先找 NameServer 2️⃣ NameServer 返回 Broker 地址 3️⃣ Dashboard 再自己去找 Broker,而不是nameserver去找broker 这行异常是在 获取 Broker 集群信息时发生的: 说明 NameServer 已经返回了 Broker 信息, 但 Dashboard 去连接 Broker 时失败 .RemotingConnectException: connect to null failed 和 validateObject failed, clusterInfo = null (Broker 集群信息获取失败,说明 Broker 根本没有连上) 可以看出在控制台上无法访问broker 这里可以看出 nameserver 已经链接上了 ClientConfig{namesrvAddr='192.168.209.129:9876' 
可能是启动控制台的时候ip地址不对。如果按照官方文档,你用的是
docker run -d \ --name rocketmq-dashboard \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" \ -p 8080:8080 \ -t apacherocketmq/rocketmq-dashboard:latest ---------------------------------------- 这个命令只适用于一种情况: NameServer 和 Dashboard 在同一个容器, 或者 Dashboard 直接跑在宿主机(不是 Docker) 但是现在我是: NameServer:宿主机虚拟机 Dashboard:Docker 容器 问题: 可是我不是已经能连接到nameserver了吗,然后nameserver再去连接broker为什么会失败? 回答: NameServer 只负责“告诉你 Broker 在哪”,不做代理、不转发 RocketMQ 内部调用链是:Dashboard → NameServer → Broker Dashboard → NameServer (查询 Broker 地址) Dashboard → Broker (直接通信) 1️⃣ Dashboard 先找 NameServer 2️⃣ NameServer 返回 Broker 地址 3️⃣ Dashboard 再自己去找 Broker,而不是nameserver去找broker 那么就会有问题。因为,docker容器 是一个容器,doccker容器 与 宿主机 可以看成是两个独立的服务器,在 docker 容器内访问 127.0.0.1或localhost都是访问的这个docker容器本身,如果要访问宿主机的必须使用宿主机IP
docker run -d \ --name rocketmq-dashboard \ --link rmqserver:namesrv \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.209.129:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 8080:8080 \ -t styletang/rocketmq-console-ng ----------------- 解释: Dcom.rocketmq.sendMessageWithVIPChannel=false 关闭 VIP 通道【一个 10909 的端口】 --link rmqserver:namesrv \ 这个后面被我删掉了 容器 rmqserver 可以用 hostname namesrv 访问,不过这里没用到,因为写了 宿主机IP。 styletang/rocketmq-console-ng 这个是更新的版本 重新安装成功
停掉并删除旧容器 docker rm -f rocketmq-dashboard 先拉取镜像 docker pull styletang/rocketmq-console-ng:latest 重新创建容器 docker run -d \ --name rocketmq-dashboard \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.209.129:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ -p 8080:8080 \ -t styletang/rocketmq-console-ng 
拉取成功

创建容器成功

查看日志
docker logs -f rocketmq-dashboard
好像没毛病

启动已有容器
启动已有容器 docker start rocketmq-dashboard 设置自动重启
docker update --restart unless-stopped rocketmq-dashboard 访问成功
http://192.168.209.129:8080/#/

代码简单集成
部署完成之后要集成到项目中,这个是我自己记录的,读者可以不必理会。
pom

配置文件依赖关系
spring.config.import 是干啥的?
回答:
在 Spring Boot 2.4+,官方推荐 配置文件模块化,可以把不同的配置拆成多个文件,然后在主配置里导入;
作用:
告诉 Spring Boot 把这些文件的配置都加载到环境里;
顺序决定覆盖规则(后面文件可以覆盖前面文件的属性);
可以把配置拆模块化,便于管理;
所以这里的 stream.yml 被导入到整个 Spring Environment 里了。


Spring Boot 3 自动配置注册文件 理解
在 Spring Boot 2.x 时代,这个功能由 spring.factories 文件提供
在 Spring Boot 3.x,官方改为 AutoConfiguration.imports 文件,
它被 AutoConfigurationImportSelector 和 ImportCandidates 类加载。
