過多的描述就不扯了,本文主要記錄RabbitMQ的安裝以及簡單使用。本次安裝是為了實現spring cloud的消息總線:SpringCloud全家桶學習之消息總線---SpringCloud Bus
一、RabbitMQ安裝
1.下載Erlang的rpm包
RabbitMQ是Erlang語言編寫,所以Erang環境必須要有,注:Erlang環境一定要與RabbitMQ版本匹配:https://www.rabbitmq.com/which-erlang.html
Erlang下載地址:https://www.rabbitmq.com/releases/erlang/(根據自身需求及匹配關系,下載對應rpm包)
2.下載RabbitMQ的rpm包
RabbitMQ下載地址:https://www.rabbitmq.com/releases/rabbitmq-server/(根據自身需求及匹配關系,下載對應rpm包)
3.下載socat的rpm包
rabbitmq安裝依賴於socat,所以需要下載socat。
socat下載地址:http://repo.iotti.biz/CentOS/6/x86_64/socat-1.7.3.2-1.el6.lux.x86_64.rpm
根據自身需求下載對應系統socat依賴:(http://repo.iotti.biz/CentOS/)
4.分別安裝Erlang、Socat、RabbitMQ(一定按照順序!)
一定按照以下順序安裝:
①rpm -ivh erlang-18.3-1.el6.x86_64.rpm
②rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm
③rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
5.配置rabbitmq:vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
6.安裝管理插件:rabbitmq-plugins enable rabbitmq_management
6.啟動RabbitMQ,瀏覽器訪問:http://192.168.64.128:15672/,出現以下界面說明安裝完成!
①cd /usr/lib/rabbitmq/bin
②./rabbitmq-server start
二、工作模型
當producer(consumer)要生產(消費)消息時,需要與服務器建立一個長連接,在RabbitMQ中稱為Connection,為解決客戶端與服務端所產生頻繁連接的問題,由於會大量的消耗服務器內存,這里引入消息通道的概念,在保持長連接的情況下,可以通過建立Channel的方式與服務器通訊,當有請求時就會建立通道,結束則關閉通道。在RabbitMQ中,一般的做法不會讓消息直接發送到消息隊列中,這里引入了Exchange(交換機)的概念,通過交換機來實現消息更加靈活的分發,交換機沒有實際的進程,而隊列是有的,它只是一個地址列表,在隊列創建的時候會與Exchange綁定一個專屬的key,在生產者生產消息的時候也會指定這個key,那么Exchange就會通過這個key去匹配Queue,從而實現靈活分發。然后消費方會通過訂閱指定的隊列去消費消息。在RabbitMQ中有Virtual Host虛擬機的概念,它可以當成是一個小型的MQ,一個RabbitMQ服務器上可以有多個虛擬機,相互之間是隔離的,當然不同的虛擬機之間可以有相同的交換機與隊列,可以實現資源的隔離。
三、RabbitMQ的5種模式
1、簡單模式(一對一的發送)
①生產者發送消息給交換機
②交換機接收消息,如果交換機沒有綁定隊列,消息扔進垃圾桶
③隊列接收消息,存儲在內存,等待消費者連接監聽獲取消息,消費成功后,返回確認
一些場景:短信,QQ
2、工作模式(資源的爭搶)
①生產者將消息發送給交換機
②交換機發送給綁定的后端隊列
③一個隊列被多個消費者同時監聽,形成消息的爭搶結構:根據消費者所在的系統的空閑、性能爭搶隊列中的消息
一些場景:搶紅包
3、發布訂閱(交換機類型為fanout)
注:圖中未畫消費者
①交換機定義類型為:fanout
②交換機綁定多個隊列
③生產者將消息發送給交換機,交換機復制同步消息到后端所有的隊列中
一些場景:郵件群發
4、路由模式(交換機類型:direct)
①交換機定義類型為:direct
②交換機綁定多個隊列,隊列綁定交換機時,給交換機提供了一個routingkey(路由key)
③發布訂閱時,所有fanout類型的交換機綁定后端隊列用的路由key都是“”;在路由模式中需要綁定隊列時提供當前隊列的具體路由key
一些場景:錯誤消息的接收和提示
5、主題模式(交換機類型:topic)
①交換機定義類型為:topic
②交換機綁定多個隊列,與路由模式非常相似,做到按類划分消息
③路由key隊列綁定的通配符如下:#表示任意字符串,*表示沒有特殊符號(單詞)的字符串
四、RabbitMQ整合至SpringBoot
1、項目准備
producer端、consumer端代碼地址:https://github.com/Simple-Coder/rabbitmq
2、直連型交換機Exchange
訪問http://192.168.56.100:15672,查看rabbtimq的管理頁面,看到消息推送成功
再看看隊列顯示已經推送到隊列中
直連交換機是一對一,那如果咱們配置多台監聽綁定到同一個直連交互的同一個隊列,會怎么樣?
可以看到是實現了輪詢的方式對消息進行消費,而且不存在重復消費。
3、主題交換機Exchange
3.1 top測試
TopicManReceiver監聽隊列1,綁定鍵為:topic.man
TopicTotalReceiver監聽隊列2,綁定鍵為:topic.#
而當前推送的消息,攜帶的路由鍵為:topic.man
可以看到兩個監聽消費者receiver都成功消費到了消息,因為這兩個recevier監聽的隊列的綁定鍵都能與這條消息攜帶的路由鍵匹配上。
3.2 topic主題測試
調用接口/sendTopicMessage2。
TopicManReceiver監聽隊列1,綁定鍵為:topic.man
TopicTotalReceiver監聽隊列2,綁定鍵為:topic.#
而當前推送的消息,攜帶的路由鍵為:topic.woman
所以可以看到兩個監聽消費者只有TopicTotalReceiver成功消費到了消息
4、fanout Exchange扇型交換機
可以看到只要發送到 fanoutExchange 這個扇型交換機的消息, 三個隊列都綁定這個交換機,所以三個消息接收類都監聽到了這條消息。