天天看點

一文帶你用 Mac M1 跑 RocketMQ

前言

最近在倒騰 ​

​RocketMQ​

​ 消息隊列,首先就得把 RocketMQ 跑起來對吧,我們一般都是 Windows 或者 Linux 機器上,按照官方教程一下子就跑起來了,另外用 Intel 晶片的 Mac 也能輕松跑起來。

但是我在 ​

​Mac M1​

​ 上的機器上跑的時候,就遇到了各種問題,折騰了一天,最後終于把 RocketMQ 在 Mac M1 上用 ​

​Docker​

​ 跑起來了,這裡總結下心路曆程。

雖然示範環境是用 Mac M1系統,但其實 Linux 系統也适用~

關于用源碼方式跑 RocketMQ 的方式下文也有介紹。

一、用源碼跑 RocketMQ

最開始我用 Docker 跑,會報錯,後來我就用源碼跑,可以跑起來,能夠發送和消費消息。

源碼位址:​​https://github.com/apache/rocketmq​​

我用的版本是 4.9.2。

二、用 Docker 跑 RocketMQ

總共啟動了三個容器,用到的鏡像分别為

  • nameserver 鏡像:rocketmqinc/rocketmq
  • broker 鏡像:dyrnq/rocketmq:4.8.0
  • 控制台鏡像:apacherocketmq/rocketmq-dashboard:latest

三個容器啟動成功

2.1 拉取 rocketmq 鏡像

`docker pull rocketmqinc/rocketmq`       

2.2 啟動 nameserver 指令

鏡像:rocketmqinc/rocketmq

`docker run -d -p 9876:9876 -v `pwd`/data/namesrv/logs:/root/logs -v `pwd`/data/namesrv/store:/root/store --name rmqnamesrv  rocketmqinc/rocketmq sh mqnamesrv`       

2.3 啟動 broker 指令

鏡像:dyrnq/rocketmq:4.8.0

`docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs -v `pwd`/data/broker/store:/root/store --name rmqbrokerv2 --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" dyrnq/rocketmq:4.8.0 sh mqbroker -c ../conf/broker.conf`      

進入容器

`docker exec -it b6b /bin/bash`      
一文帶你用 Mac M1 跑 RocketMQ

修改 broker.conf 檔案,提示未安裝 vim 工具,則需要安裝下 vim

`vim ../conf/broker.conf
apt-get update
apt-get install vim
vim ../conf/broker.conf`       

然後将 這行指令拷貝到 broker.conf 檔案中。192.168.10.197 為自己的本機 IP

`brokerIP1=192.168.10.197`       

不知道自己 IP 的位址的,可以通過這個指令擷取 mac 機器的本機 IP,如下所示:

`ifconfig | grep "inet"`       

最後 broker.conf 配置如下:

一文帶你用 Mac M1 跑 RocketMQ

三、啟動控制台 rocketmq-dashboard

原來的控制台是 rocketmq-console-ng,但是發現 Github 上已經移除了。官方提示如下:

一文帶你用 Mac M1 跑 RocketMQ

上面公告的表示之前的rocket-console已經不在這個倉庫了,已經建立了一個獨立的倉庫并命名為RocketMQ Dashboard。倉庫路徑:​​https://github.com/apache/rocketmq-dashboard​​

我們直接執行下面的指令:

`docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.16.8.62:9876 -Drocketmq.config.isVIPChannel=false" -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest`       
一文帶你用 Mac M1 跑 RocketMQ

注意:這裡的 IP 位址為本機 IP

isVIPChannel=false,這裡必須這樣設定,不然打開控制台後,無法擷取資料。

容器啟動成功後通路 ​​http://localhost:8080/​​

一文帶你用 Mac M1 跑 RocketMQ

四、測試發送消息

往 test_topic 發送一條消息

一文帶你用 Mac M1 跑 RocketMQ

​​在消息主題中輸入www.passjava.cn​​,點選确定按鈕發送消息。

一文帶你用 Mac M1 跑 RocketMQ

發送結果如下:

一文帶你用 Mac M1 跑 RocketMQ

看下 Message 菜單欄,選擇 test_top 主題,可以看到一條消息:

一文帶你用 Mac M1 跑 RocketMQ

消息内容如下,和發送的消息一緻。

一文帶你用 Mac M1 跑 RocketMQ

五、問題彙總

broker 無法連到 NameServer

需要到容器裡面修改 broker.conf 檔案,加上

brokerIP1=192.168.10.197

并且 docker 啟動 broker 時需要增加指令參數 ​

​-c ../conf/broker.conf​

原因

這裡的 ip 位址需要指定為外網位址。因為 rockerMQ broker 預設會選擇内網位址。

隻有當參數行中有 ​

​-c​

​ 參數時才會使用配置檔案的參數。這裡卡了很長時間。

`if (commandLine.hasOption('c')) {
    String file = commandLine.getOptionValue('c');
    if (file != null) {
       configFile = file;
       InputStream in = new BufferedInputStream(new FileInputStream(file));
       properties = new Properties();
       properties.load(in);

       properties2SystemEnv(properties);
       MixAll.properties2Object(properties, brokerConfig);
       MixAll.properties2Object(properties, nettyServerConfig);
       MixAll.properties2Object(properties, nettyClientConfig);
       MixAll.properties2Object(properties, messageStoreConfig);

       BrokerPathConfigHelper.setBrokerConfigPath(file);
       in.close();
    }
}`       

啟動 broker 報錯

`wukong@wukongs-MacBook-Pro  ~  docker restart b6b
Error response from daemon: Cannot restart container b6b: Cannot link to a non running container: /rmqnamesrv AS /rmqbrokerv2/namesrv`       
原因