RocketMQ介紹
RocketMQ 是一個 隊列模型 的消息中間件,具有高性能、高可靠、高實時、分布式 的特點。它是一個采用 Java 語言開發(fā)的分布式的消息系統(tǒng),由阿里巴巴團隊開發(fā),在2016年底貢獻給 Apache,成為了 Apache 的一個頂級項目。 在阿里內部,RocketMQ 很好地服務了集團大大小小上千個應用,在每年的雙十一當天,更有不可思議的萬億級消息通過 RocketMQ 流轉。
RocketMQ 特點
- 是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分布式等特點
- Producer、Consumer、隊列都可以分布式
- Producer 向一些隊列輪流發(fā)送消息,隊列集合稱為 Topic,Consumer 如果做廣播消費,則一個 Consumer 實例消費這個 Topic 對應的所有隊列,如果做集群消費,則多個 Consumer 實例平均消費這個 Topic 對應的隊列集合
- 能夠保證嚴格的消息順序
- 支持拉(pull)和推(push)兩種消息模式
- 高效的訂閱者水平擴展能力
- 實時的消息訂閱機制
- 億級消息堆積能力
- 支持多種消息協(xié)議,如 JMS、OpenMessaging 等
- 較少的依賴
kafka 、RocketMQ 、RabbitMQ 對比
RocketMQ安裝
RocketMQ下載: rocketmq-all-4.8.0-bin-release.zip
1.RocketMQ zip包傳入linux服務器
[root@localhost ]# cd usr/local/
[root@localhost local]# rz
2.解壓縮
[root@localhost local]# unzip rocketmq-all-4.8.0-bin-release.zip
3.調整啟動參數(shù)(修改默認啟動參數(shù),默認啟動的最大內存為4G,比較大,修改小一點,否則如果服務器內存不夠會啟動失敗)
[root@localhost local]# cd rocketmq-all-4.8.0-bin-release/bin
[root@localhost bin]# vim runserver.sh
- -Xms4g -Xmx4g -Xmn2g 改為 -Xms256m -Xmx256m -Xmn128m
4.調整broker
[root@localhost bin]# vim runbroker.sh
- -Xms8g -Xmx8g -Xmn4g 改為 -Xms256m -Xmx256m -Xmn128m
5.啟動namesrv
[root@localhost bin]# nohup sh mqnamesrv &
6.啟動broker,注意ip為公網(wǎng)ip,端口為navmesrv的默認端口9876
[root@localhost bin]# nohup ./mqbroker -n localhost:9876 &
7.檢查是否啟動成功
[root@localhost bin]# jps -l
- 如果發(fā)現(xiàn)報錯bash: jps: 未找到命令... 請更新以下命令
[root@localhost bin]# sudo yum install java-1.8.0-openjdk-devel.x86_64
- 輸入命令 jps -l
- 關閉 RocketMQ 命令 (此處無需關閉,只用于了解)
./mqshutdown broker
./mqshutdown namesrv
RocketMQ 控制臺安裝
1.克隆rocketmq項目
[root@localhost local]# cd /usr/local/
[root@localhost local]# git clone https://github.com/apache/rocketmq-externals.git
- 進入\rocketmq-externals\rocketmq-console\src\main\resources\ 下修改 application.properties 配置文件
- 配置文件修改如下圖
github提供了 Docker 和 非Docker 兩種安裝方法供其選擇,這里使用非Docker方式進行安裝
- 在 \rocketmq-externals\rocketmq-console\ 文件夾下打開控制臺,輸入以下命令進行maven打包
mvn clean package -Dmaven.test.skip=true
- 進入 \rocketmq-externals\rocketmq-console\target\ 文件夾下打開控制臺,輸入以下命令進行 jar包啟動
java -jar rocketmq-console-ng-2.0.0.jar
- 打開瀏覽器訪問 localhost:9877,如果報錯
- 開放 10909 01911 9876 端口
firewall-cmd --zone=public --add-port=10909/tcp --permanent
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --zone=public --add-port=9876/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload
- 驗證RocketMQ功能是夠正常
1.驗證生產消息正常,輸入命令
[root@localhost rocketmq-all-4.8.0-bin-release]# export NAMESRV_ADDR=localhost:9876
[root@localhost rocketmq-all-4.8.0-bin-release]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
正常的情況下,會看到一堆的類似于如下的輸出,這是生產消息后成功的result:
SendResult [sendStatus=SEND_OK, msgId=7F000001372329453F44466341350068, offsetMsgId=C0A8017600002A9F000000000000674E, messageQueue=MessageQueue [topic=TopicTest, brokerName=localhost.localdomain, queueId=3], queueOffset=33]
2.驗證消費消息正常,執(zhí)行如下命令:
[root@localhost rocketmq-all-4.8.0-bin-release]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
正常的情況下,會看到一堆的類似于如下的輸出,這是消費的消息內容:
ConsumeMessageThread_1 Receive New Messages: [MessageExt [brokerName=localhost.localdomain, queueId=0, storeSize=201, queueOffset=0, sysFlag=0, bornTimestamp=1618387294736, bornHost=/192.168.1.118:34722, storeTimestamp=1618387294743, storeHost=/192.168.1.118:10911, msgId=C0A8017600002A9F0000000000000192, commitLogOffset=402, bodyCRC=1250039395, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=34, CONSUME_START_TIME=1618387666005, UNIQ_KEY=7F00000136FE29453F44466306100001, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 50], transactionId='null'}]]
- 訪問頁面 http://localhost:9877 ,出現(xiàn)下圖界面,安裝成功
RocketMQ 集成 - 生產者
-
gateway下pom.xml文件添加依賴
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
- nacos 配置 RocketMQ
rocketmq:
name-server: 192.168.190.129:9876
producer:
# 小坑:必須指定group
group: test-group
-
common 下創(chuàng)建實體類 MyMessage.class
package com.bi.cloud.pojo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MyMessage implements Serializable {
private Integer id;
private String name;
private String status;
private Date createTime;
}
-
gateway下創(chuàng)建 TestProducerController.class
package com.bi.cloud.controller;
import com.bi.cloud.pojo.MyMessage;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Date;
/**
* 生產者
**/
@RestController
@RequestMapping("/api/testRocketMQ")
public class TestProducerController {
/**
* 用于發(fā)送消息到 RocketMQ 的api
*/
@Resource
public RocketMQTemplate rocketMQTemplate;
@GetMapping("/sendMsg")
public String testSendMsg() {
String topic = "test-topic";
MyMessage message = new MyMessage();
message.setId(1);
message.setName("王霄");
message.setStatus("default");
message.setCreateTime(new Date());
// 發(fā)送消息
rocketMQTemplate.convertAndSend(topic, message);
return "send message success";
}
}
- Postman 調用接口
- 如果報錯 請關閉linux防火墻
systemctl stop firewalld
- 消息發(fā)送成功后,可以到RocketMQ的控制臺中進行查看:
RocketMQ 集成 - 消費者
- engine下pom.xml文件添加依賴
<!-- rocketmq -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
- nacos 配置 RocketMQ
rocketmq:
name-server: 192.168.190.129:9876
producer:
# 小坑:必須指定group
group: test-group
- engine 下創(chuàng)建消費者監(jiān)聽器 TestConsumerListener.class
package com.bi.cloud.service.Impl;
import com.alibaba.fastjson.JSON;
import com.bi.cloud.pojo.MyMessage;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
/**
* 消費者監(jiān)聽器
**/
@Slf4j
@Component
// topic需要和生產者的topic一致,consumerGroup屬性是必須指定的,內容可以隨意
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer-group")
public class TestConsumerListener implements RocketMQListener<MyMessage> {
/**
* 監(jiān)聽到消息的時候就會調用該方法
*/
@Override
public void onMessage(MyMessage message) {
log.info("從test-topic中監(jiān)聽到消息");
log.info(JSON.toJSONString(message));
}
}
- 編寫完成后啟動項目,由于之前我們已經(jīng)往隊列里發(fā)送了消息,所以此時消費者項目一啟動,就可以監(jiān)聽到消息并消費,控制臺就會輸出如下日志:
第八章 Oauth2.0 安全認證子模塊集成 http://www.lxweimin.com/p/4fd45fb565eb
參考文獻:
https://github.com/apache/rocketmq-externals.git
https://blog.csdn.net/qq_40280582/article/details/111785355
https://zhuhuix.blog.csdn.net/article/details/108866638
https://blog.51cto.com/zero01/2426303