目錄
?RabbitMQ的作用
Message queue 釋義
?問題思考
?存在的問題
優(yōu)化方案?
案例分析?
帶來的好處?
消息隊(duì)列特點(diǎn)
?Email郵件案例分析
Docker安裝部署RabbitMQ
1.下拉鏡像
2.運(yùn)行RabbitMQ
?3.打開防火墻端口號(hào)并重新運(yùn)行防火墻
4.容器啟動(dòng)后,可以通過 docker logs 容器 查看日志
6.通過剛才填寫的用戶名和密碼登錄 admin?
?springboot連接配置
1.配置spring賬號(hào)
2.創(chuàng)建兩個(gè)springboot項(xiàng)目publisher consumer 選擇依賴?
3.配置yml文件?
4.生產(chǎn)者配置類
5.生成者測(cè)試類
6.消費(fèi)者接受信息
?RabbitMQ的作用
Message queue 釋義
服務(wù)之間最常見的通信方式是直接調(diào)用彼此來通信 , 消息從一端發(fā)出后立即就可以達(dá)到另一端 , 稱為即時(shí)消息通訊 ( 同步通信 )消息從某一端發(fā)出后 , 首先進(jìn)入一個(gè)容器進(jìn)行臨時(shí)存儲(chǔ) , 當(dāng)達(dá)到某種條件后 , 再由這個(gè)容器發(fā)送給另一端 , 稱為延遲消息通訊 ( 異步通信 )
?問題思考
- ?消息通知系統(tǒng):通知商家,你有一筆新的訂單,請(qǐng)及時(shí)發(fā)貨
- ?推薦系統(tǒng):更新用戶畫像,重新給用戶推薦他可能感興趣的商品
- ?會(huì)員系統(tǒng):更新用戶的積分和等級(jí)信息
createOrder(...) {
// 完成訂單服務(wù)
doCreateOrder(...);
// 調(diào)用其他服務(wù)接口
sendMsg(...);
updateUserInterestedGoods(...);
updateMemberCreditInfo(...);
}
?存在的問題
- 過度耦合:如果后面創(chuàng)建訂單時(shí),需要觸發(fā)新的動(dòng)作,那就得去改代碼,在原有的創(chuàng)建訂單函數(shù)末尾,再追加一行代碼
- 缺少緩沖:如果創(chuàng)建訂單時(shí),會(huì)員系統(tǒng)恰好處于非常忙碌或者宕機(jī)的狀態(tài),那這時(shí)更新會(huì)員信息就會(huì)失敗,我們需要一個(gè)地方,來暫時(shí)存放無法被消費(fèi)的消息
優(yōu)化方案?

Server(Broker): 接收客戶端連接 , 實(shí)現(xiàn) AMQP 協(xié)議的消息隊(duì)列和路由功能的進(jìn)程 .Virtual Host :虛擬主機(jī)的概念 , 類似權(quán)限控制組 , 一個(gè) Virtual Host 里可以有多個(gè) Exchange 和 Queue.Exchange: 交換機(jī) , 接收生產(chǎn)者發(fā)送的消息 , 并根據(jù) Routing Key 將消息路由到服務(wù)器中的隊(duì)列 Queue.ExchangeType: 交換機(jī)類型決定了路由消息行為 ,RabbitMQ 中有三種類型 Exchange, 分別是 fanout 、 direct 、 topic.Message Queue :消息隊(duì)列 , 用于存儲(chǔ)還未被消費(fèi)者消費(fèi)的消息 .Message :由 Header 和 body 組成 ,Header 是由生產(chǎn)者添加的各種屬性的集合 , 包括 Message 是否被持久化、優(yōu)先級(jí)是多少、由哪個(gè) Message Queue 接收等 .body 是真正需要發(fā)送的數(shù)據(jù)內(nèi)容 .BindingKey :綁定關(guān)鍵字 , 將一個(gè)特定的 Exchange 和一個(gè)特定的 Queue 綁定起來 .
案例分析?
書架就是一個(gè)消息隊(duì)列 , 小紅是生產(chǎn)者 , 小明是消費(fèi)者
帶來的好處?
消息隊(duì)列特點(diǎn)
?Email郵件案例分析
Docker安裝部署RabbitMQ
1.下拉鏡像
docker pull rabbitmq:management
注意獲取鏡像的時(shí)候要獲取 management 版本的 , 不要獲取 last 版本的 ,management 版本的才帶有管理界面
2.運(yùn)行RabbitMQ
docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
--hostname :主機(jī)名 (RabbitMQ 的一個(gè)重要注意事項(xiàng)是它根據(jù)所謂的 “ 節(jié)點(diǎn)名稱 ” 存儲(chǔ)數(shù)據(jù) , 默認(rèn)為主機(jī)名 )-e :指定環(huán)境變量 :RABBITMQ_DEFAULT_VHOST :默認(rèn)虛擬機(jī)名RABBITMQ_DEFAULT_USER :默認(rèn)的用戶名RABBITMQ_DEFAULT_PASS :默認(rèn)用戶名的密碼
?3.打開防火墻端口號(hào)并重新運(yùn)行防火墻
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
4.容器啟動(dòng)后,可以通過 docker logs 容器 查看日志
docker logs my-rabbitmq
5.通過主機(jī)網(wǎng)址進(jìn)入管理后臺(tái)
虛擬機(jī)ip地址/15672
6.通過剛才填寫的用戶名和密碼登錄 admin?
?springboot連接配置
1.配置spring賬號(hào)
切記需要授權(quán)
2.創(chuàng)建兩個(gè)springboot項(xiàng)目publisher consumer 選擇依賴?
3.配置yml文件?
#publisher
server:
port: 8888
spring:
rabbitmq:
host: 192.168.241.130
username: spring
password: 123456
port: 5672
virtual-host: my_vhost
#consumer
server:
port: 9999
spring:
rabbitmq:
host: 192.168.241.130
username: spring
password: 123456
port: 5672
virtual-host: my_vhost
4.生產(chǎn)者配置類
@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
public Queue firstQueue() {
return new Queue("firstQueue");
}
@Bean
public Queue secondQueue() {
return new Queue("secondQueue");
}
}
5.生成者測(cè)試類
public class TestController {
@Autowired
private AmqpTemplate template;
@Autowired
private ObjectMapper objectMapper;
@RequestMapping("/send1")
public String send1(){
//向消息隊(duì)列發(fā)送消息
template.convertAndSend("firstQueue","hello world");
return "??";
}
@RequestMapping("/send2")
public String send2() throws Exception{
User jack = new User("jack", "123");
String json = objectMapper.writeValueAsString(jack);
//向消息隊(duì)列發(fā)送消息
template.convertAndSend("secondQueue",jack);
return "??";
}
}
因?yàn)橄㈥?duì)列支持的對(duì)象傳參必須consumer 和 publisher 兩個(gè)項(xiàng)目的pojo包路徑完全一致所以使用:文章來源:http://www.zghlxwxcb.cn/news/detail-810978.html
@Autowired private ObjectMapper objectMapper;
User jack = new User("jack", "123");
記得拋出異常 throws Exception 不然會(huì)報(bào)錯(cuò)文章來源地址http://www.zghlxwxcb.cn/news/detail-810978.html
6.消費(fèi)者接受信息
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue")
public class Receiver {
@RabbitHandler
public void process(String msg) {
log.warn("接收到:" + msg);
}
}
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue")
public class PojoReceiver {
@Autowired
private ObjectMapper objectMapper;
@RabbitHandler
public void process(String json) throws Exception{
User user=objectMapper.readValue(json,User.class);
log.warn("接收到:" + json);
}
}
到了這里,關(guān)于消息隊(duì)列RabbitMQ.01.基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!