寫在前面:本人是Linux系統小白,雖然有買阿里雲的服務器,但是在使用操作上面還是一知半解,一臉懵逼。由於本人服務器上已經部署了項目所需的其餘東西,所以不敢輕舉妄動(晚上就因爲一些騷操作差點被隊友拿刀砍了),所以這次安裝測試RocketMQ,我先登錄阿里雲控制檯爲服務器創建了一份快照。就算出事也有補救機會。以此篇博客記錄我的安裝過程以及過程中遇到的坑,最後給出我的示例代碼。親測可用。
參考:https://www.jianshu.com/p/b570884e0dd6
目錄
8.如果要開啓防火牆,則需要開放特定端口(以下內容未經過本人測試)
一、下載
1. 使用如下語句下載rocketmq的包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip
下載完成
查看下載的包
二、解壓
1. 在/usr/local下新建一個程序文件夾用來放rocketmq
mkdir -p /usr/local/rocketmq
查看新建的文件夾,ok建好了
2. 將剛剛下載的rocket包解壓到我們新建的程序文件夾裏面
unzip rocketmq-all-4.2.0-bin-release.zip -d /usr/local/rocketmq
如果提示沒有unzip的話,使用yum安裝一下
yum install unzip
安裝之後,再次執行解壓命令(注意:需要到rocket包的那個目錄下執行命令),解壓後到路徑下看一眼嘻嘻(小白的卑微)
三、運行
3.1 修改PATH路徑
命令
vim /etc/profile
在末尾追加
#set rocketmq environment
export ROCKETMQ_HOME=/usr/local/rocketmq
#set path
export PATH=$ROCKETMQ_HOME/bin:$PATH
export NAMESRV_ADDR=你的阿里雲服務器公網IP:9876
保存後退出,執行以下命令,讓文件生效
source /etc/profile
3.2 嘗試啓動mqnamesrv
解壓後在當前目錄(也就是rocketmq的這個文件夾)執行以下命令,測試nameServer
nohup sh bin/mqnamesrv &
服務器反饋如下:
讓我們輸入下面這個命令來看一下出了什麼問題
cat nohup.out
反饋如下:
錯誤日誌在/usr/local/rocketmq/hs_err_pid18305.log,我們使用命令來查看錯誤日誌:
cat hs_err_pid18305.log
錯誤日誌如下:
英語不好,所以我去谷歌翻譯翻譯了一下:
問題在於內存不足,我們可以將測試環境的內存容量調低一點
3.3 調低內存
輸入命令:
vim runbroker.sh
可以看到如下信息,白圈標註的地方就是要修改的地方
修改如下:(注:要修改文件需要按一下“ i ”,修改完成後按下“ Esc ”,保存並退出是“ :wq! ”,強制退出是“ :q! ”)
將
-server -Xms8g -Xmx8g -Xmn4g
修改爲
-server -Xms256m -Xmx256m -Xmn128m
修改後的文件內容如下
同理修改runserver.sh(我還修改了tools.sh,也是大的地方就改小)
修改後重新啓動,以下列出可能會用到的命令
3.4 需要使用到的命令
3.4.1 開啓服務命令
//啓動nameServer
nohup sh mqbroker -n localhost:9876 &
/***啓動broker**/
//可以先嚐試這個啓動命令能否自己創建topic
nohup sh mqbroker -n localhost:9876 autoCreateTopicEnable=true &
//如果不行,使用3.4.4的命令在Centos7手動創建topic後,使用這個命令啓動broker
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
3.4.2 查看日誌命令
tail -f ~/logs/rocketmqlogs/namesrv.log
tail -f ~/logs/rocketmqlogs/broker.log
3.4.3 關閉服務命令
sh mqshutdown namesrv
sh mqshutdown broker
3.4.4 手動在命令行創建topic命令(bin目錄下)
./mqadmin updateTopic -n localhost:9876 -b localhost:10911 -t testTopic
3.4.5 查看當前所有的topic
./mqadmin topicList
3.4.6 查看當前開啓的服務命令
jps
四、程序代碼示例
4.1 代碼
代碼複製到本地後要自己alt+enter引入一些包,注:請先引入pom依賴
4.1.1 pom依賴
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-common</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
4.1.2 application.properties
#rocketmq
apache.rocketmq.consumer.PushConsumer=PushConsumer
apache.rocketmq.producer.producerGroup=Producer
apache.rocketmq.namesrvAddr=你的阿里雲公網IP:9876
4.1.3 RocketController
@RestController
@RequestMapping("/rocket")
public class RocketController {
@Autowired
private ProducerService producer;
@RequestMapping("/push")
public String pushMsg(String msg) {
return producer.send("testTopic", "push", msg);
}
}
4.1.4 ConsumerService
@Component
public class ConsumerService {
@Value("${apache.rocketmq.consumer.PushConsumer}")
private String consumerGroup;
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
@PostConstruct
public void defaultMQPushConsumer() {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
consumer.setNamesrvAddr(namesrvAddr);
try {
consumer.subscribe("testTopic", "push");
// 如果是第一次啓動,從隊列頭部開始消費
// 如果不是第一次啓動,從上次消費的位置繼續消費
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
try {
for (MessageExt messageExt : list) {
String messageBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
System.out.println("[Consumer] msgID(" + messageExt.getMsgId() + ") msgBody : " + messageBody);
}
} catch (Exception e) {
e.printStackTrace();
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
System.out.println("[Consumer 已啓動]");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.1.5 ProducerService
@Service
//@Component
public class ProducerService {
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup;
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
private DefaultMQProducer producer;
@PostConstruct
public void initProducer() {
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr);
producer.setRetryTimesWhenSendFailed(3);
try {
producer.start();
System.out.println("[Producer 已啓動]");
} catch (Exception e) {
e.printStackTrace();
}
}
public String send(String topic, String tags, String msg) {
SendResult result = null;
try {
Message message = new Message(topic, tags, msg.getBytes(RemotingHelper.DEFAULT_CHARSET));
result = producer.send(message,10000);
System.out.println("[Producer] msgID(" + result.getMsgId() + ") " + result.getSendStatus());
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println(result.toString());
return "{\"MsgId\":\"" + result.getMsgId() + "\"}";
}
@PreDestroy
public void shutDownProducer() {
if (producer != null) {
producer.shutdown();
}
}
4.2 運行
4.2.1 運行程序,會在idea控制檯輸出信息:
4.2.2 在本地瀏覽器上訪問
http://localhost:8080/rocket/push?msg=hello
4.2.3 會出現如下頁面:
4.2.4 同時,idea控制檯會輸出
五、安裝rocketmq的可視化管理工具
5.1下載
1. 進入到rocketmq文件夾
cd /usr/local/rocketmq
2. 克隆
git clone https://github.com/apache/rocketmq-externals
如果你沒有安裝git,請使用以下命令安裝git:
yum install git
5.2 修改配置文件
進入到下面路徑
cd /usr/local/rocketmq/rocketmq-externals/rocketmq-console/src/main/resources
使用vim修改application.properties
vim application.properties
修改如下配置
server.port=8082 // 服務端口號
rocketmq.config.namesrvAddr=阿里雲服務器的私有IP:9876 // 配置服務地址
rocketmq.config.dataPath=/tmp/rocketmq-console/data // mq數據路徑,可以自己修改
使用maven打包
cd /usr/local/rocketmq/rocketmq-externals/rocketmq-console
mvn clean package -Dmaven.test.skip=true
5.3 運行
(需要一直在後臺運行,其實也可能不需要)
nohup java -jar rocketmq-console-ng-1.0.1.jar --server.port=8082 --rocketmq.config.namesrvAddr=阿里雲私有IP:9876 &
在自己本機的電腦瀏覽器輸入
http:/阿里雲外網IP:8082/#/
出現以下界面就妥了
最後:列舉我遇到的坑
坑1:需要修改rocketmq的brokerIP
使用vim編輯conf目錄下的broker.conf,追加brokerIP1和brokerIP2的定義,馬賽克掉的是我阿里雲服務器的外網ip(它默認使用了私有ip進行連接,所以程序報錯)
修改了brokerIP後,需要重啓rocketmq,注意,在啓動broker的時候,需要使用如下命令,使用配置文件中的內容進行啓動
nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
坑2:這個純屬自己蠢,沒有創建阿里雲服務器的安全組規則
百讀文章說創建兩個,一個9876是肯定的,另一個是10911,然而我配置了還是不行,注意!!!請看你的報錯信息,報錯信息會給出你自己真實需要的端口,比如,我的就是10909我也不知道爲什麼
坑3:沒有辦法自己創建topic
這個topic我的不知道爲什麼就是不能自己創建,加了autoCreateTopicEnable=true也不行,非得手動創建,我去tm的小火箭
坑4:給我報錯nullPointer,結果屁事兒沒有
只要服務器的rocketmq運行起來了,本地項目端口號對上了,這報錯就消失了。嗯。
坑5:關於防火牆,以下是可能會用到的命令
1.卸載firewalld
yum remove firewalld
2.安裝iptables
yum install iptables-services
3.查看防火牆狀態
service iptables status
4.停止防火牆
service iptables stop
5.啓動防火牆
service iptables start
6.設爲開機不啓動
systemctl disable iptables.service
7.設爲開機啓動
systemctl enable iptables.service
8.如果要開啓防火牆,則需要開放特定端口(以下內容未經過本人測試)
例:開放3306端口
編輯:vi /etc/sysconfig/iptables
添加配置
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
重啓防火牆使配置生效
systemctl restart iptables.service
9.其它相關命令
查看防火牆規則
iptables -L
清空防火牆規則
iptables -F
保存使操作生效
/etc/sysconfig/iptables save
停止防火牆
/etc/sysconfig/iptables stop