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

Server(Broker): 接收客戶端連接 , 實現(xiàn) AMQP 協(xié)議的消息隊列和路由功能的進(jìn)程 .Virtual Host :虛擬主機(jī)的概念 , 類似權(quán)限控制組 , 一個 Virtual Host 里可以有多個 Exchange 和 Queue.Exchange: 交換機(jī) , 接收生產(chǎn)者發(fā)送的消息 , 并根據(jù) Routing Key 將消息路由到服務(wù)器中的隊列 Queue.ExchangeType: 交換機(jī)類型決定了路由消息行為 ,RabbitMQ 中有三種類型 Exchange, 分別是 fanout 、 direct 、 topic.Message Queue :消息隊列 , 用于存儲還未被消費(fèi)者消費(fèi)的消息 .Message :由 Header 和 body 組成 ,Header 是由生產(chǎn)者添加的各種屬性的集合 , 包括 Message 是否被持久化、優(yōu)先級是多少、由哪個 Message Queue 接收等 .body 是真正需要發(fā)送的數(shù)據(jù)內(nèi)容 .BindingKey :綁定關(guān)鍵字 , 將一個特定的 Exchange 和一個特定的 Queue 綁定起來 .
案例分析?
書架就是一個消息隊列 , 小紅是生產(chǎn)者 , 小明是消費(fèi)者
帶來的好處?
消息隊列特點(diǎn)
?Email郵件案例分析
Docker安裝部署RabbitMQ
1.下拉鏡像
docker pull rabbitmq:management
注意獲取鏡像的時候要獲取 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 的一個重要注意事項是它根據(jù)所謂的 “ 節(jié)點(diǎn)名稱 ” 存儲數(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.打開防火墻端口號并重新運(yùn)行防火墻
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
4.容器啟動后,可以通過 docker logs 容器 查看日志
docker logs my-rabbitmq
5.通過主機(jī)網(wǎng)址進(jìn)入管理后臺
虛擬機(jī)ip地址/15672
6.通過剛才填寫的用戶名和密碼登錄 admin?
?springboot連接配置
1.配置spring賬號
切記需要授權(quán)
2.創(chuàng)建兩個springboot項目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.生成者測試類
public class TestController {
@Autowired
private AmqpTemplate template;
@Autowired
private ObjectMapper objectMapper;
@RequestMapping("/send1")
public String send1(){
//向消息隊列發(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);
//向消息隊列發(fā)送消息
template.convertAndSend("secondQueue",jack);
return "??";
}
}
因為消息隊列支持的對象傳參必須consumer 和 publisher 兩個項目的pojo包路徑完全一致所以使用:文章來源:http://www.zghlxwxcb.cn/news/detail-821473.html
@Autowired private ObjectMapper objectMapper;
User jack = new User("jack", "123");
記得拋出異常 throws Exception 不然會報錯文章來源地址http://www.zghlxwxcb.cn/news/detail-821473.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)于消息隊列RabbitMQ.01.安裝部署與基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!