RabbitMQ簡介
AMQP,即Advanced Message Queuing Protocol耍铜,高級消息隊列協(xié)議错沃,是應(yīng)用層協(xié)議的一個開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計钮糖。消息中間件主要用于組件之間的解耦梅掠,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息瓤檐、隊列、路由(包括點對點和發(fā)布/訂閱)娱节、可靠性挠蛉、安全。
RabbitMQ是一個開源的AMQP實現(xiàn)肄满,服務(wù)器端用Erlang語言編寫谴古,支持多種客戶端,如:Python稠歉、Ruby掰担、.NET、Java怒炸、JMS带饱、C、PHP阅羹、ActionScript勺疼、XMPP、STOMP等捏鱼,支持AJAX执庐。用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性导梆、擴展性轨淌、高可用性等方面表現(xiàn)不俗。
RabbitMQ基本概念
1.Message
消息看尼,消息是不具名的递鹉,它由消息頭和消息體組成。消息體是不透明的狡忙,而消息頭則由一系列的可選屬性組成梳虽,這些屬性包括routing-key(路由鍵)、priority(相對于其他消息的優(yōu)先權(quán))灾茁、delivery-mode(指出該消息可能需要持久性存儲)等窜觉。
2.Publisher
消息的生產(chǎn)者,也是一個向交換器發(fā)布消息的客戶端應(yīng)用程序北专。
3.Exchange
交換器禀挫,用來接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊列。
4.Binding
綁定拓颓,用于消息隊列和交換器之間的關(guān)聯(lián)语婴。一個綁定就是基于路由鍵將交換器和消息隊列連接起來的路由規(guī)則,所以可以將交換器理解成一個由綁定構(gòu)成的路由表。
5.Queue
消息隊列砰左,用來保存消息直到發(fā)送給消費者匿醒。它是消息的容器,也是消息的終點缠导。一個消息可投入一個或多個隊列廉羔。消息一直在隊列里面,等待消費者連接到這個隊列將其取走。
6.Connection
網(wǎng)絡(luò)連接,比如一個TCP連接释牺。
7.Channel
信道,多路復(fù)用連接中的一條獨立的雙向數(shù)據(jù)流通道竹挡。信道是建立在真實的TCP連接內(nèi)地虛擬連接,AMQP 命令都是通過信道發(fā)出去的立膛,不管是發(fā)布消息揪罕、訂閱隊列還是接收消息,這些動作都是通過信道完成宝泵。因為對于操作系統(tǒng)來說建立和銷毀 TCP 都是非常昂貴的開銷耸序,所以引入了信道的概念,以復(fù)用一條 TCP 連接鲁猩。
8.Consumer
消息的消費者坎怪,表示一個從消息隊列中取得消息的客戶端應(yīng)用程序。
9.Virtual Host
虛擬主機廓握,表示一批交換器搅窿、消息隊列和相關(guān)對象。虛擬主機是共享相同的身份認(rèn)證和加密環(huán)境的獨立服務(wù)器域隙券。每個 vhost 本質(zhì)上就是一個 mini 版的 RabbitMQ 服務(wù)器男应,擁有自己的隊列、交換器娱仔、綁定和權(quán)限機制沐飘。vhost 是 AMQP 概念的基礎(chǔ),必須在連接時指定牲迫,RabbitMQ 默認(rèn)的 vhost 是 / 耐朴。
10.Broker
表示消息隊列服務(wù)器實體。
Exchange 類型
Exchange分發(fā)消息時根據(jù)類型的不同分發(fā)策略有區(qū)別盹憎,目前共四種類型:direct筛峭、fanout、topic陪每、headers 影晓。下面只講前三種模式镰吵。
1.Direct模式
消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致, 交換器就將消息發(fā)到對應(yīng)的隊列中挂签。路由鍵與隊列名完全匹配
2.Topic模式
topic 交換器通過模式匹配分配消息的路由鍵屬性疤祭,將路由鍵和某個模式進行匹配,此時隊列需要綁定到一個模式上饵婆。它將路由鍵和綁定鍵的字符串切分成單詞画株,這些單詞之間用點隔開。它同樣也會識別兩個通配符:符號“#”和符號“*”啦辐。#匹配0個或多個單詞,*匹配一個單詞蜈项。
3.Fanout模式x
每個發(fā)到 fanout 類型交換器的消息都會分到所有綁定的隊列上去芹关。fanout 交換器不處理路由鍵,只是簡單的將隊列綁定到交換器上紧卒,每個發(fā)送到交換器的消息都會被轉(zhuǎn)發(fā)到與該交換器綁定的所有隊列上侥衬。很像子網(wǎng)廣播,每臺子網(wǎng)內(nèi)的主機都獲得了一份復(fù)制的消息跑芳。fanout 類型轉(zhuǎn)發(fā)消息是最快的轴总。
SpringBoot整合RabbitMQ
在?pom.xml?中添加?spring-boot-starter-amqp的依賴
在?application.yml文件中配置rabbitmq相關(guān)內(nèi)容
使用Direct模式
1.配置隊列
2.創(chuàng)建一個User實體類
3.接收者
4.發(fā)送者
5.測試,訪問http://localhost:8080/sendDirectQueue博个,查看日志輸出
6.日志輸出
注意:發(fā)送者與接收者的Queue名字一定要相同怀樟,否則接收收不到消息
使用Topic模式
1.配置隊列
2.創(chuàng)建一個User實體類(和上面一樣)
3.接收者
4.發(fā)送者
5.測試,訪問http://localhost:8080/sendTopic盆佣,查看日志輸出
6.日志輸出
由日志記錄可以看出lzc.message可以被receiveTopic1和receiveTopic2所接收往堡,而lzc.lzc只能被receiveTopic2接收。
使用Fanout模式
1.配置隊列
2.創(chuàng)建一個User實體類(和上面一樣)
3.接收者
4.發(fā)送者
5.測試共耍,訪問http://localhost:8080/sendFanout虑灰,查看日志輸出
6.日志輸出
由日志輸出可以看出,兩個接收者都接收到了消息痹兜,因為交換機FANOUT_EXCHANGE綁定了兩個隊列穆咐。
在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流群。交流學(xué)習(xí)群號:478030634 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring字旭,MyBatis对湃,Netty源碼分析,高并發(fā)遗淳、高性能熟尉、分布式、微服務(wù)架構(gòu)的原理洲脂,JVM性能優(yōu)化斤儿、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系剧包。還能領(lǐng)取免費的學(xué)習(xí)資源,目前受益良多
注:關(guān)注作者微信公眾號往果,了解更多分布式架構(gòu)疆液、微服務(wù)、netty陕贮、MySQL堕油、spring、性能優(yōu)化肮之、等知識點掉缺。公眾號:《Java爛豬皮》