目錄 ? ?測(cè)試exchange.fanout(廣播發(fā)送) 一、springboot與消息隊(duì)列1、消息隊(duì)列的應(yīng)用場(chǎng)景? 2、消息隊(duì)列簡(jiǎn)介1)大多應(yīng)用,可通過(guò)消息服務(wù)中間件來(lái)提示系統(tǒng)異步通信、擴(kuò)展解耦能力 2)消息服務(wù)中兩個(gè)重要概念: 消息代理和目的地 但消息發(fā)送者發(fā)生消息以后,將由消息代理接管,消息代理保證消息傳遞到指定目的地。 3)消息隊(duì)列主要有兩種形式的目的地 1、隊(duì)列(queue):點(diǎn)對(duì)點(diǎn)消息通信(point-to-point) 2、主題(topic):發(fā)布(publish)/訂閱(subscribe)消息通信 4)點(diǎn)對(duì)點(diǎn)式: -消息發(fā)送者發(fā)送消息,消息代理將其放入一個(gè) 隊(duì)列中,消息接收者從隊(duì)列中獲取消息內(nèi)容,消息讀取后被移除隊(duì)列 -消息只有唯一的發(fā)送者和接收者,但并不是說(shuō)只能有一個(gè)接收者 5)發(fā)布訂閱式: -發(fā)送者(發(fā)布者)發(fā)送消息到主題,多個(gè)接收者(訂閱者)監(jiān)聽(tīng)(訂閱)這個(gè)主題,那么就會(huì)在消息到達(dá)同時(shí)接收消息 6)JMS(java message service)JAVA消息服務(wù): -基于JVM消息代理的規(guī)范。ActiveMQ、HometMQ是JMS實(shí)現(xiàn) 7)AMQP(Advanced Message Queuing Protocol) -高級(jí)消息隊(duì)列協(xié)議,也是一個(gè)消息代理的規(guī)范,兼容JMS -RabbitMQ是AMQP的實(shí)現(xiàn) ?8)spring支持 -spring-jms提供了對(duì)JMS的支持 -spring-rabbit提供了對(duì)AMQP的支持 -需要ConnectionFactory的實(shí)現(xiàn)來(lái)連接消息代理 -提供JmsTemplate、rabbittemplate來(lái)發(fā)送消息 -@JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上監(jiān)聽(tīng)消息代理發(fā)布的消息 -@EnableJms、@EnableRabbit開(kāi)啟支持 9)springboot自動(dòng)配置 -JmsAutoConfiguration -RabbitAutoConfiguration ? 二、RabbitMQ簡(jiǎn)介RabbitMQ是一個(gè)由erlang開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn)。 核心概念message:消息。它是由消息頭和消息體組成。消息體是不透明的,而消息投則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對(duì)于其他消息的優(yōu)先權(quán))、delivery-mode(之處該消息可能需要持久性存儲(chǔ))等。 publisher:消息的生產(chǎn)者,也是一個(gè)向交換器發(fā)布消息的客戶端應(yīng)用程序。 exchange:交換器,用來(lái)接收生產(chǎn)者發(fā)送的消息并將這些消息路由給服務(wù)器中的隊(duì)列。它有四種類型:direct(默認(rèn))、fanout、topic和headers,不同類型的exchange轉(zhuǎn)發(fā)消息的策略有所區(qū)別 queue:消息隊(duì)列,用來(lái)保存消息知道發(fā)送到消費(fèi)者。它是消息的容器,也是消息的終點(diǎn)。一個(gè)消息可投入一個(gè)或多個(gè)隊(duì)列。消息一直在隊(duì)列里面,等待消費(fèi)者連接到這個(gè)隊(duì)列將其取走。 binding:綁定,用于消息隊(duì)列和交換器之間的關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來(lái)的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表。 connection:網(wǎng)絡(luò)連接,比如一個(gè)TCP連接。 channel:信道,多路復(fù)用連接中的一條獨(dú)立的雙向數(shù)據(jù)流通道。信道是建立在真實(shí)的TCP連接內(nèi)的虛擬連接,AMQP命令都是通過(guò)信道以發(fā)出去的,不管是發(fā)布消息、訂閱隊(duì)列還是接收消息,這些動(dòng)作都是通過(guò)信道完成,因?yàn)閷?duì)于操作系統(tǒng)來(lái)說(shuō)建立和銷毀TCP都是非常昂貴的開(kāi)銷,所以引入了信道的概念,以復(fù)用一條TCP連接。 consumer:消息的消費(fèi)者,表示一個(gè)從消息隊(duì)列中取得消息的客戶端應(yīng)用程序。 virtual host:虛擬主機(jī),表示一批交換器、消息隊(duì)列和相關(guān)對(duì)象。虛擬主機(jī)是共享相同的身份認(rèn)證和加密環(huán)境的獨(dú)立服務(wù)器域。每個(gè)Vhost本質(zhì)上就是一個(gè)mini版的rabbitMQ服務(wù)器,擁有自己的隊(duì)列、交換器、綁定和權(quán)限機(jī)制。Vhost是AMQP概念的基礎(chǔ),必須在連接時(shí)指定,rabbitMQ默認(rèn)的Vhost是/。 Broker:表示消息隊(duì)列服務(wù)器實(shí)體 ?三、rabbitMQ運(yùn)行機(jī)制AMQP中的消息路由 AMQP中消息的路由過(guò)程和java開(kāi)發(fā)者熟悉的JMS存在一些差別,AMQP中增加了Exchange和Binding的角色。生產(chǎn)者把消息發(fā)布到Exchange上,消息最終到達(dá)隊(duì)列并被消費(fèi)者接收,而B(niǎo)inding決定交換器的消息應(yīng)用發(fā)送到那個(gè)隊(duì)列。 ?點(diǎn)對(duì)點(diǎn)通信:消息中的路由鍵(routing key)如果和binding中的binding key一致,交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。路由鍵與隊(duì)列名完全匹配,如果一個(gè)隊(duì)列綁定到交換機(jī)要求路由鍵為“dog”,則只轉(zhuǎn)發(fā)routing key 標(biāo)記為“dog”的消息,不會(huì)轉(zhuǎn)發(fā)“dog.puppy”,也不會(huì)轉(zhuǎn)發(fā)“dog.guard”等等。它是完全匹配、單播的模式。 廣播通信:每個(gè)發(fā)到fanout類型交換器的消息都會(huì)分到所有綁定的隊(duì)列上去。fanout交換器不處理路由鍵,只是簡(jiǎn)單的將隊(duì)列綁定到交換器上,每個(gè)發(fā)送到交換器的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換器綁定的所有隊(duì)列上。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息。fanout類型轉(zhuǎn)發(fā)消息是最快的 模糊通信:topic交換器通過(guò)模式匹配分配消息的路由鍵屬性,將路由鍵和某個(gè)模式進(jìn)行匹配,此時(shí)隊(duì)列需要綁定到一個(gè)模式上,這些單詞之間點(diǎn)隔開(kāi)。它同樣也會(huì)識(shí)別兩個(gè)通配符:符號(hào)“#”和符號(hào)“*”。#匹配0個(gè)或多個(gè)單詞,*匹配一個(gè)單詞。 ?四、RabbitMQ整合1、引入spring-boot-starter-amqp 2、application.yml配置 3、測(cè)試rabbitMQ 1.AmqpAdmin:管理組件 2.rabbitTemplate:消息發(fā)送處理組件 ? 安裝rabbitmq? ?第一個(gè)是端口是暴露給外部的端口,第二個(gè)端口是管理界面的端口 訪問(wèn) 賬號(hào):guest 密碼:guest 信息發(fā)送的結(jié)構(gòu)圖 ?創(chuàng)建交換機(jī)Durable:下次在登錄的時(shí)候還會(huì)存在該虛擬機(jī) ?同理一共添加三個(gè)交換機(jī) ?創(chuàng)建隊(duì)列?同理添加四個(gè)隊(duì)列 ?交換機(jī)進(jìn)行綁定響應(yīng)的隊(duì)列 將相關(guān)隊(duì)列綁定到交換器上?最后將四個(gè)隊(duì)列全部綁定到交換器中 另外一個(gè)也綁定上這四個(gè)queue
?exchange.topic交換器上綁定好四個(gè)隊(duì)列,命名規(guī)則采用*.和.# ?測(cè)試exchange.direct在exchange.direct發(fā)送消息到指定routing key(由于direct交換器模式是單播形式,只有完全對(duì)于了routing key的才能夠匹配上) ?可以看到對(duì)應(yīng)的隊(duì)列中已經(jīng)存在相應(yīng)的消息了 ?進(jìn)入到該隊(duì)列中 ?查看該條數(shù)據(jù) ?測(cè)試exchange.fanout(廣播發(fā)送)?刷新隊(duì)列,發(fā)現(xiàn)每個(gè)隊(duì)列都存在一個(gè)剛剛發(fā)送的消息 ?測(cè)試exchange.topic我們可以根據(jù)之前的規(guī)則,下面的四個(gè)都能匹配上? ?在測(cè)試 ?只有兩個(gè)符合 ? 來(lái)源:https://www./content-4-340951.html |
|
來(lái)自: 印度阿三17 > 《開(kāi)發(fā)》