SpringBoot使用RabbitMQ消息隊列

RabbitMQ簡介

AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。spring

RabbitMQ基本概念

clipboard.png

1.Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其餘消息的優先權)、delivery-mode(指出該消息可能須要持久性存儲)等。
2.Publisher
消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。
3.Exchange
交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。
4.Binding
綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列鏈接起來的路由規則,因此能夠將交換器理解成一個由綁定構成的路由表。
5.Queue
消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者鏈接到這個隊列將其取走。
6.Connection
網絡鏈接,好比一個TCP鏈接。
7.Channel
信道,多路複用鏈接中的一條獨立的雙向數據流通道。信道是創建在真實的TCP鏈接內地虛擬鏈接,AMQP 命令都是經過信道發出去的,無論是發佈消息、訂閱隊列仍是接收消息,這些動做都是經過信道完成。由於對於操做系統來講創建和銷燬 TCP 都是很是昂貴的開銷,因此引入了信道的概念,以複用一條 TCP 鏈接。
8.Consumer
消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。
9.Virtual Host
虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。每一個 vhost 本質上就是一個 mini 版的 RabbitMQ 服務器,擁有本身的隊列、交換器、綁定和權限機制。vhost 是 AMQP 概念的基礎,必須在鏈接時指定,RabbitMQ 默認的 vhost 是 / 。
10.Broker
表示消息隊列服務器實體。安全

Exchange 類型

Exchange分發消息時根據類型的不一樣分發策略有區別,目前共四種類型:direct、fanout、topic、headers 。下面只講前三種模式。
1.Direct模式
消息中的路由鍵(routing key)若是和 Binding 中的 binding key 一致, 交換器就將消息發到對應的隊列中。路由鍵與隊列名徹底匹配
2.Topic模式性能優化

topic 交換器經過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配,此時隊列須要綁定到一個模式上。它將路由鍵和綁定鍵的字符串切分紅單詞,這些單詞之間用點隔開。它一樣也會識別兩個通配符:符號「#」和符號「」。#匹配0個或多個單詞,匹配一個單詞。服務器

3.Fanout模式x
每一個發到 fanout 類型交換器的消息都會分到全部綁定的隊列上去。fanout 交換器不處理路由鍵,只是簡單的將隊列綁定到交換器上,每一個發送到交換器的消息都會被轉發到與該交換器綁定的全部隊列上。很像子網廣播,每臺子網內的主機都得到了一份複製的消息。fanout 類型轉發消息是最快的。微信

SpringBoot整合RabbitMQ

在 pom.xml 中添加 spring-boot-starter-amqp的依賴網絡

clipboard.png

在 application.yml文件中配置rabbitmq相關內容架構

clipboard.png

使用Direct模式

1.配置隊列併發

clipboard.png

2.建立一個User實體類app

clipboard.png

3.接收者分佈式

clipboard.png

4.發送者

clipboard.png

5.測試,訪問http://localhost:8080/sendDirectQueue,查看日誌輸出

clipboard.png

6.日誌輸出

clipboard.png

注意:發送者與接收者的Queue名字必定要相同,不然接收收不到消息

使用Topic模式

1.配置隊列

clipboard.png

2.建立一個User實體類(和上面同樣)

3.接收者

clipboard.png

4.發送者

clipboard.png

5.測試,訪問http://localhost:8080/sendTopic,查看日誌輸出

clipboard.png

6.日誌輸出

clipboard.png

由日誌記錄能夠看出lzc.message能夠被receiveTopic1和receiveTopic2所接收,而lzc.lzc只能被receiveTopic2接收。

使用Fanout模式

1.配置隊列

clipboard.png

2.建立一個User實體類(和上面同樣)

3.接收者

clipboard.png

4.發送者

clipboard.png

5.測試,訪問http://localhost:8080/sendFanout,查看日誌輸出

clipboard.png

6.日誌輸出

clipboard.png

由日誌輸出能夠看出,兩個接收者都接收到了消息,由於交換機FANOUT_EXCHANGE綁定了兩個隊列。

在此我向你們推薦一個架構學習交流羣。交流學習羣號:478030634 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

注:關注做者微信公衆號,瞭解更多分佈式架構、微服務、netty、MySQL、spring、性能優化、等知識點。公衆號:《Java爛豬皮》

圖片描述

相關文章
相關標籤/搜索