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