訊息中介軟體——RocketMQ(一) 環境搭建(完整版)
每章一點正能量:自我控制是最強者的本能。——蕭伯納
前言
最近在學習訊息中介軟體——RocketMQ,打算把這個學習過程記錄下來。此章主要介紹環境搭建。此次主要是單機搭建(條件有限),包括在Windows、Linux環境下的搭建,以及console監控平臺搭建,最後加一demo驗證一下。
環境準備
在搭建RocketMQ之前,請先確保如下環境已經搭建完畢
- Java環境(我的JDK1.8)
- Maven環境(我的3.6.1目前最新版)
- Git環境
沒有搭建的同學走傳送門:
JDK環境搭建: JAVA8環境搭建
Maven環境搭建: Windows環境下使用Nexus 3.X 搭建Maven私服及使用介紹
1. Windows環境下搭建
1.1 下載
官方網站:http://rocketmq.apache.org/
目前最新版的是V4.5.0,點選進去。
選擇下載 rocketmq-all-4.5.0-bin-release.zip。彈出另外一個頁面,這裡選擇rocketmq-all-4.5.0-bin-release.zip進行下載。
下載成功後,選擇一個目錄放好並解壓。
1.2 修改JVM配置
以上操作完畢之後,進入目錄bin目錄,我這裡是
H:\rocketmq\rocketmq-all-4.5.0-bin-release\rocketmq-all-4.5.0-bin-release\bin
找到
runserver.cmd
和runbroker.cmd
中的JAVA_OPT。原JAVA_OPT:
set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
將 Xms Xmx 這兩個值改小一些,改為1g,如:
set "JAVA_OPT=%JAVA_OPT% -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
自己根據虛擬機器記憶體大小設定,超出記憶體大小可能會報錯。
1.3 配置環境變數
上述步驟執行完畢後,我們需要將RocketMQ安裝目錄的bin目錄配置到環境變數中。
1.4 啟動
以上配置都完成,接下來就是啟動過程。中間有點坑,請務必按步驟安裝。
在RocketMQ安裝目錄的bin目錄下,執行命令cmd:
我的目錄:
H:\rocketmq\rocketmq-all-4.5.0-bin-release\rocketmq-all-4.5.0-bin-release\bin
可以通過shift+滑鼠右擊 觸發cmd視窗選項。也可以通過win+R 在視窗輸入cmd,進入cmd視窗後移動到bin目錄下。
1.4.1 啟動NAMESERVER
- 執行命令:start mqnamesrv.cmd
成功後會彈出提示框,此框勿關閉。
1.4.3 啟動BROKER
- 執行命令:‘start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true’
注意:假如彈出提示框提示‘錯誤: 找不到或無法載入主類 xxxxxx’。開啟runbroker.cmd,然後將‘%CLASSPATH%’加上英文雙引號。
開啟 runbroker.cmd
進行修改
原:
set "JAVA_OPT=%JAVA_OPT% -cp %CLASSPATH%"
修改後:
set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%""
再次執行命令:
啟動成功!
這時候一共有三個視窗。
2. 安裝Console監控
2.1 下載
下載地址:https://github.com/apache/rocketmq-externals
下載完後如圖所示:選擇——>rocketmq-console
2.2 配置
下載完成之後,進入‘rocketmq-externals\rocketmq-console\src\main\resources’資料夾,開啟‘application.properties’進行配置。
2.2 編譯啟動
進入‘\rocketmq-externals\rocketmq-console’資料夾,執行‘mvn clean package -Dmaven.test.skip=true’,編譯生成。中間有個比較慢的下載過程需要等待。
編譯成功之後,cmd進入‘target’資料夾,執行‘java -jar rocketmq-console-ng-1.0.1.jar’,啟動‘rocketmq-console-ng-1.0.1.jar’。
2.3 檢視
訪問地址:localhost:8082
2.Linux環境下搭建
2.1 環境準備
- Java環境
- Maven環境
2.1.1 Linux環境搭建Jdk
下載JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載需要的版本:
上傳到建立的目錄/usr/java
解壓命令
tar -zxvf jdk-8u181-linux-x64.tar.gz
配置環境變數命令
vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_161
JRE_HOME=/usr/java/jdk1.8.0_161/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
source /etc/profile
驗證是否成功命令
java -version
按照以上操作,完成JDK的安裝。接下來安裝Maven環境。
2.1.2 Linux環境搭建Maven
- 下載命令:
wget http://mirror.bit.edu.cn/apache/maven/binaries/apache-maven-3.2.2-bin.tar.gz
- 解壓命令:
tar -zxvf apache-maven-3.2.2-bin.tar.gz
- 配置Maven環境命令:
vim /etc/profile
#配置maven環境變數
export MAVEN_HOME=/usr/maven/apache-maven-3.5.4
export MAVEN_HOME
export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile
- 驗證是否成功命令:
mvn -v
2.2 下載RocketMQ
- 下載命令:
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip
- 解壓命令:
unzip rocketmq-all-4.4.0-source-release.zip
- 構建二進位制檔案命令
進入解壓後的檔案目錄。
mvn -Prelease-all -DskipTests clean install -U
2.3 修改JVM配置
同Windows環境一樣,修改JVM配置。
移動到目錄 /home/rocketmq/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/bin
中。編輯bin目錄下runserver.sh
與 runbroker.sh
檔案。
根據個人虛擬機器大小進行修改
vim runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=64m -XX:MaxPermSize=128m"
vim runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=64m -XX:MaxPermSize=128m"
2.4 配置RocketMQ環境變數
分別執行如下命令:
#修改環境變數
vim /etc/profile
export ROCKETMQ=/home/rocketmq/rocketmq-all-4.4.0/distribution/target/apache-rocketmq
export PATH=$PATH:$ROCKETMQ/bin
#更新配置
source /etc/profile
2.5 啟動NAMESERVER
依然在之前的目錄 /home/rocketmq/rocketmq-all-4.4.0/distribution/target/apache-rocketmq
- 執行命令:
##啟動命令
nohup sh bin/mqnamesrv >/dev/null 2>&1 &
##檢視日誌
tail -f ~/logs/rocketmqlogs/namesrv.log
可以看圖已經成功了!
2.6 啟動BROKER
- 執行命令:
##啟動命令
nohup sh bin/mqbroker -n localhost:9876 &
##檢視日誌
tail -f ~/logs/rocketmqlogs/broker.log
注意防火牆,如果埠連線失敗,注意開通。
2.7 關閉命令
sh bin/mqshutdown broker //停止 broker
sh bin/mqshutdown namesrv //停止 nameserver
2.8 配置Console監控平臺
同Windows平臺搭建
2.8.1 啟動Console
我這裡直接將Windows平臺打包好的jar包直接丟到了Linux系統中
- 啟動命令:
java -jar rocketmq-console-ng-1.0.1.jar
2.8.2 訪問Console管理介面
訪問地址:http://192.168.220.72:8082
3. Console監控平臺說明
這裡不做過多介紹,可以參考以下文章
官網地址:https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md
其他部落格地址:https://guozh.net/rocketmqzhiconsolejiankongpingtaishiyongxiangjiesan/
3. 案例測試
案例整合環境:SpringBoot環境
案例來源於網路
3.1 pom.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.coderprogramming.rocketmq</groupId>
<artifactId>rocketmq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rocketmq</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.2 Producer生產者
**
* @Description: 生產者
* @author Coder程式設計
* @date 2019/5/8 17:08
*/
@Component
public class Producer {
/**
* 生產者的組名
*/
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup;
/**
* NameServer 地址
*/
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
public void orderedProducer() throws MQClientException, InterruptedException {
/**
* 一個應用建立一個Producer,由應用來維護此物件,可以設定為全域性物件或者單例
* 注意:ProducerGroupName需要由應用來保證唯一
* ProducerGroup這個概念傳送普通的訊息時,作用不大,但是傳送分散式事務訊息時,比較關鍵,
* 因為伺服器會回查這個Group下的任意一個Producer
*/
DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(namesrvAddr);
/**
* Producer物件在使用之前必須要呼叫start初始化,初始化一次即可 注意:切記不可以在每次傳送訊息時,都呼叫start方法
*/
producer.start();
/**
* 下面這段程式碼表明一個Producer物件可以傳送多個topic,多個tag的訊息。
* 注意:send方法是同步呼叫,只要不拋異常就標識成功。但是傳送成功也可會有多種狀態
* 例如訊息寫入Master成功,但是Slave不成功,這種情況訊息屬於成功,但是對於個別應用如果對訊息可靠性要求極高,
* 需要對這種情況做處理。另外,訊息可能會存在傳送失敗的情況,失敗重試由應用來處理。
*/
try {
for (int i = 0; i < 10; i++) {
Message msg = new Message("Topic1",// topic
"TagA",// tag
"001",// key
("Send Msg:Hello MetaQ1").getBytes());// body
SendResult sendResult = producer.send(msg);
System.out.println(sendResult);
Message msg2 = new Message("Topic2",// topic
"TagB",// tag
"002",// key
("Send Msg:Hello MetaQ2").getBytes());// body
SendResult sendResult2 = producer.send(msg2);
System.out.println(sendResult2);
Message msg3 = new Message("Topic3",// topic
"TagC",// tag
"003",// key
("Send Msg:Hello MetaQ3").getBytes());// body
SendResult sendResult3 = producer.send(msg3);
System.out.println(sendResult3);
}
} catch (Exception e) {
e.printStackTrace();
}
/**
* 應用退出時,要呼叫shutdown來清理資源,關閉網路連線,從MetaQ伺服器上登出自己
* 注意:我們建議應用在JBOSS、Tomcat等容器的退出鉤子裡呼叫shutdown方法
*/
producer.shutdown();
}
}
3.3 Consumer消費者
/**
* @Description: 消費者
* @author Coder程式設計
* @date 2019/5/8 17:08
*/
@Component
public class Consumer {
/**
* 生產者的組名
*/
@Value("${apache.rocketmq.producer.producerGroup}")
private String producerGroup;
/**
* NameServer 地址
*/
@Value("${apache.rocketmq.namesrvAddr}")
private String namesrvAddr;
/**
* 當前例子是PushConsumer用法,使用方式給使用者感覺是訊息從RocketMQ伺服器推到了應用客戶端。
* 但是實際PushConsumer內部是使用長輪詢Pull方式從Broker拉訊息,然後再回呼叫戶Listener方法
*/
public void orderedConsumer() throws InterruptedException,MQClientException {
/**
* 一個應用建立一個Consumer,由應用來維護此物件,可以設定為全域性物件或者單例
* 注意:ConsumerGroupName需要由應用來保證唯一
*/
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(producerGroup);
// consumer.setNamesrvAddr("10.10.0.102:9876");
consumer.setNamesrvAddr(namesrvAddr);
/**
* 訂閱指定topic下tags分別等於TagA或TagC或TagD
*/
consumer.subscribe("Topic1", "TagA || TagC || TagD");
/**
* 訂閱指定topic下所有訊息<br>
* 注意:一個consumer物件可以訂閱多個topic
*/
consumer.subscribe("Topic2", "*");
consumer.subscribe("Topic3", "*");
/**
* 設定Consumer第一次啟動是從佇列頭部開始消費還是佇列尾部開始消費 如果非第一次啟動,那麼按照上次消費的位置繼續消費
*/
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.registerMessageListener(new MessageListenerConcurrently() {
/**
* 預設msgs裡只有一條訊息,可以通過設定consumeMessageBatchMaxSize引數來批量接收訊息
*/
@Override
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);
MessageExt msg = msgs.get(0);
if (msg.getTopic().equals("Topic1")) {
if (null != msg.getTags()) {
// 執行Topic1的消費邏輯
if (msg.getTags().equals("TagA")) {
// 執行TagA的消費
System.out.println("TagA開始。");
} else if (msg.getTags().equals("TagC")) {
System.out.println("TagC開始。");
// 執行TagC的消費
} else if (msg.getTags().equals("TagD")) {
// 執行TagD的消費
System.out.println("TagD開始。");
}
}
} else if (msg.getTopic().equals("Topic2")) {
// 執行Topic2的消費邏輯
System.out.println("Topic2");
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
/**
* Consumer物件在使用之前必須要呼叫start初始化,初始化一次即可
*/
consumer.start();
System.out.println("Consumer Started.");
}
}
3.3 properties配置檔案
# 消費者的組名
apache.rocketmq.consumer.PushConsumer=PushConsumer
# 生產者的組名
apache.rocketmq.producer.producerGroup=Producer
# NameServer地址
apache.rocketmq.namesrvAddr=192.168.220.72:9876
# 設定應用埠
server.port=8089
3.4 測試程式碼
/**
* @author Coder程式設計
* @Title: HelloWord
* @ProjectName rocketmq
* @Description: Hello World
* @date 2019/5/814:14
*/
@RestController
public class Test {
@Autowired
private Producer producer;
@Autowired
private Consumer consumer;
@RequestMapping("/test")
public String testMQ2() {
try {
System.out.println("-----------------開始生產-----------------");
producer.orderedProducer();
System.out.println("-----------------開始消費-----------------");
consumer.orderedConsumer();
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
}
4.奉上原始碼
以上安裝jar包和案例測試原始碼已經上傳至GitHub/Gitee
原始碼地址:
Github地址
Gitee地址
文末
歡迎關注公眾號:Coder程式設計
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
相關推薦
訊息中介軟體——RocketMQ(一) 環境搭建(完整版)
每章一點正能量:自我控制是最強者的本能。——蕭伯納 前言 最近在學習訊息中介軟體——RocketMQ,打算把這個學習過程記錄下來。此章主要介紹環境搭建。此次主要是單機搭建(條件有限),包括在Windows、Linux環境下的搭建,以及console監控平臺搭建,最後加一demo驗證一下。 環境準備
MQ訊息中介軟體在分散式系統中的作用(四)
1.訊息中介軟體在分散式系統中的作用介紹 訊息中介軟體是在分散式系統中完成訊息的傳送和接收的基礎軟體。 1.1訊息中介軟體可利用高效可靠的訊息傳遞機制進行平臺無關的資料交流, 並基於資料通訊來進行分散式系統的整合。通過提供訊息傳遞和訊息 排隊模型,可以在分散式環境下擴充套件
從零開始搭建自己的VueJS2.0+ElementUI單頁面網站(一、環境搭建)
如圖所示 增刪改 type default sdn orm rain exp 名稱 原網址:https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以說是近些年來最火的前端框架之一,越來越多的
訊息中介軟體入門「一」:初識訊息中介軟體【ActiveMQ】
訊息中介軟體入門「一」:初識訊息中介軟體【ActiveMQ】 背景介紹 訊息中介軟體相當於程序間通訊的信託,可以降低複雜系統中各個模組間的耦合度。對於信託:你只需要把Message給我,就沒你的事兒了。我負責給你送到目的地,就不需要你必須實時的守著,等待所有通訊細節的完成。
PostgreSQL應用(一,環境搭建和客戶端工具安裝)
一,PostgreSQL下載 官方下載地址: https://www.postgresql.org/download/ pgAdmin4客戶端工具下載地址:https://www.pgadmin.org/download/pgadmin-4-windows/ 二,安裝 本次PostgreSQ
SpringMVC學習筆記(一、環境搭建)
SpringMVC主要功能 在獲取多個引數、檔案上傳、servlet功能單一方面都有很好的解決辦法 SpringMVC 環境搭建 構建一個空的WEB專案(記住勾選xml檔案) 匯入所需jar包 書寫主配置檔案: 建立resource資料夾 建立spring
Angular+Rxjs+Redux(一、環境搭建)
環境搭建 1.node 2.npm [email protected]/cli 4.json-server(npm install -g json-server) 執行json-server
分散式訊息中介軟體 RocketMQ:概述與原始碼編譯篇
一、前言 Apache RocketMQ 是一個分散式訊息中介軟體,其具有低延遲、高效能和可靠性、萬億級容量、靈活的可擴充套件性特性;它是阿里巴巴在2012年開源的分散式訊息中介軟體,目前已經捐贈給 Apache 軟體基金會,並於2017年9月25日成為 Apache 的頂級專案。 二、Roc
ReactNative開發實戰一之環境搭建(Windows下)
作為微信公眾號(Zjiaxin)的開山篇文章------我們將從環境搭建開始:(Windows環境下)1首先準備必要的軟體和工具:Python 2、Node、ReactNative、AndroidStudio、WebStorm、Git、Genymotion。Python2:h
重拾PHP一之環境搭建(WampServer+PhpStorm)
一、下載並激活PhpStorm啟用方式:(親測有效)在Licence Server的框框中輸入:二、配置php解析器在安裝好PhpStorm後直接可以執行.html檔案,但是執行不了.php檔案,還需要對其進行配置。
mysql 兩主一從環境搭建(5.7.24)
## 搭建說明 * 兩主一從,從本質上說,只不過是機器 master-a 和 master-b 互為主從機(熱備),然後通過 **keepalived** 進行高可用配置,使得在同一時間內只會有一臺對外提供服務,實現單寫機制,另一個機器 slave 則作為 master-a 的從機存在(冷備)。 *
struts2+spring+hibernate框架總結(框架分析+環境搭建+例項原始碼下載)
首先,SSH不是一個框架,而是多個框架(struts+spring+hibernate)的整合,是目前較流行的一種Web應用程式開源整合框架,用於構建靈活、易於擴充套件的多層Web應用程式。 整合SSH框架的系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層(實體層)。 Struts
SSH框架總結(框架分析+環境搭建+例項原始碼下載)
首先,SSH不是一個框架,而是多個框架(struts+spring+hibernate)的整合,是目前較流行的一種Web應用程式開源整合框架,用於構建靈活、易於擴充套件的多層Web應用程式。 整合SSH框架的系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層
訊息中介軟體——RabbitMQ(一)Windows/Linux環境搭建(完整版)
前言 最近在學習訊息中介軟體——RabbitMQ,打算把這個學習過程記錄下來。此章主要介紹環境搭建。此次主要是單機搭建(條件有限),包括在Windows、Linux環境下的搭建,以及RabbitMQ的監控平臺搭建。 環境準備 在搭建RabbitMQ之前,請先確保如下環境已經搭建完畢 Java環境(我
訊息中介軟體--RabbitMQ學習(一)
Activemq介紹 Activemq是 Apache出品,最流行的能力強勁的開源訊息匯流排,並且它個完全支援MS規範的訊息中介軟體。 其豐富的AP、多種叢集構建模式使得他成為業界老牌訊息中介軟體,在中小型企業中應用廣泛。 MQ衡量指標:服務效能、資料儲存、叢集架構
訊息中介軟體(一)分散式系統事務一致性解決方案大對比,誰最好使?(轉)
原文轉載至:https://blog.csdn.net/lovesomnus/article/details/51785108 在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,
訊息中介軟體ActiveMQ(一)HelloWorld入門例項
1、JMS訊息傳送模式 在點對點或佇列模型: 一個生產者向一個特定的佇列釋出訊息,一個消費者從該佇列中讀取訊息。這裡,生產者知道消費者的佇列,並直接將訊息傳送到消費者的佇列。這種模式被概括為:只有一個消費者將獲得訊息。生產者不需要在接收者消費該訊息期間處於執行狀態,接收
訊息中介軟體學習總結(1)——RocketMQ之專訪RocketMQ聯合創始人:專案思路、技術細節和未來規劃
編者按 這些年開源氛圍越來越好,各大IT公司都紛紛將一些自研程式碼開源出來。2012年,阿里巴巴開源其自研的第三代分散式訊息中介軟體——RocketMQ。經過幾年的技術打磨,阿里稱基於RocketMQ技術,目前雙十一當天訊息容量可達到萬億級。 2016年11月,阿里將Ro
訊息中介軟體學習總結(3)——RocketMQ之十分鐘入門RocketMQ
本文首先引出訊息中介軟體通常需要解決哪些問題,在解決這些問題當中會遇到什麼困難,Apache RocketMQ作為阿里開源的一款高效能、高吞吐量的分散式訊息中介軟體否可以解決,規範中如何定義這些問題。然後本文將介紹RocketMQ的架構設計,以期讓讀者快速瞭解RocketMQ
訊息中介軟體學習總結(6)——RocketMQ之RocketMQ大資料暢想
剛剛過去的雙十一,阿里自主研發的訊息中介軟體RocketMQ,充分展現了它的低延遲特性,大部分訊息請求落在2ms內,慢請求也都落在20ms內,這無疑給追求快速響應的線上交易系統(OLTP)帶去了福音。 也是在今年11月份,RocketMQ進入Apache孵化。這款最初設計來為