消息代理(message broker)和目的地(destination)當消息發送者發送消息之後,將由消息代理接管,消息代理保證消息傳遞到指定目的地。java
主題(topic):發佈(publish)/訂閱(subscribe)消息通訊
web
消息發送者發送消息,消息代理將其放入一個隊列中,消息接收者從隊列中獲取消息內容,消息讀取後被移出隊列
消息只有惟一的發送者和接受者,但並非說只能有一個接收者spring
發送者(發佈者)發送消息到主題,多個接收者(訂閱者)監聽(訂閱)這個主題,那麼就會在消息到達時同時收到消息docker
基於JVM消息代理的規範。ActiveMQ、HornetMQ是JMS實現json
高級消息隊列協議,也是一個消息代理的規範,兼容JMS
RabbitMQ是AMQP的實現
瀏覽器
spring-jms提供了對JMS的支持
spring-rabbit提供了對AMQP的支持
須要ConnectionFactory的實現來鏈接消息代理
提供JmsTemplate、RabbitTemplate來發送消息
@JmsListener(JMS)、@RabbitListener(AMQP)註解在方法上監聽消息代理髮布的消息
@EnableJms、@EnableRabbit開啓支持服務器
JmsAutoConfiguration
RabbitAutoConfiguration網絡
RabbitMQ簡介:
核心概念
Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其餘消息的優先權)、delivery-mode(指出該消息可能須要持久性存儲)等。app
Publisher
消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。異步
Exchange
交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。
Exchange有4種類型:direct(默認),fanout, topic, 和headers,不一樣類型的Exchange轉發消息的策略有所區別
Queue
消息隊列,用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一直在隊列裏面,等待消費者鏈接到這個隊列將其取走。
Binding
綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵將交換器和消息隊列鏈接起來的路由規則,因此能夠將交換器理解成一個由綁定構成的路由表。
Exchange 和Queue的綁定能夠是多對多的關係。
Connection
網絡鏈接,好比一個TCP鏈接。
Channel
信道,多路複用鏈接中的一條獨立的雙向數據流通道。信道是創建在真實的TCP鏈接內的虛擬鏈接,AMQP 命令都是經過信道發出去的,不論是發佈消息、訂閱隊列仍是接收消息,這些動做都是經過信道完成。由於對於操做系統來講創建和銷燬 TCP 都是很是昂貴的開銷,因此引入了信道的概念,以複用一條 TCP 鏈接。
Consumer
消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。
Virtual Host
虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。每一個 vhost 本質上就是一個 mini 版的 RabbitMQ 服務器,擁有本身的隊列、交換器、綁定和權限機制。vhost 是 AMQP 概念的基礎,必須在鏈接時指定,RabbitMQ 默認的 vhost 是 / 。
Broker
表示消息隊列服務器實體
AMQP 中的消息路由
AMQP 中消息的路由過程和 Java 開發者熟悉的 JMS 存在一些差異,AMQP 中增長了 Exchange 和 Binding 的角色。生產者把消息發佈到 Exchange 上,消息最終到達隊列並被消費者接收,而 Binding 決定交換器的消息應該發送到那個隊列。
Exchange 類型
Exchange分發消息時根據類型的不一樣分發策略有區別,目前共四種類型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由鍵, headers 交換器和 direct 交換器徹底一致,但性能差不少,目前幾乎用不到了,因此直接看另外三種類型:
消息中的路由鍵(routing key)若是和 Binding 中的 binding key 一致, 交換器就將消息發到對應的隊列中。路由鍵與隊列名徹底匹配,若是一個隊列綁定到交換機要求路由鍵爲「dog」,則只轉發 routing key 標記爲「dog」的消息,不會轉發「dog.puppy」,也不會轉發「dog.guard」等等。它是徹底匹配、單播的模式。
流程
/** * 自動配置 * 一、RabbitAutoConfiguration * 二、有自動配置了鏈接工廠ConnectionFactory; * 三、RabbitProperties 封裝了 RabbitMQ的配置 * 四、 RabbitTemplate :給RabbitMQ發送和接受消息; * 五、 AmqpAdmin : RabbitMQ系統管理功能組件; * AmqpAdmin:建立和刪除 Queue,Exchange,Binding * 六、@EnableRabbit + @RabbitListener 監聽消息隊列的內容 * */ @EnableRabbit //開啓基於註解的RabbitMQ模式 @SpringBootApplication public class Springboot02AmqpApplication {
1.引入 spring-boot-starter-amqp
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2.application.yml配置
spring.rabbitmq.host=192.168.1.110 spring.rabbitmq.username=guest spring.rabbitmq.password=guest #spring.rabbitmq.virtual-host=
3.測試RabbitMQ
@Test public void contextLoads() { //Message須要本身構造一個;定義消息體內容和消息頭 //rabbitTemplate.send(exchage,routeKey,message); //object默認當成消息體,只須要傳入要發送的對象,自動序列化發送給rabbitmq; //rabbitTemplate.convertAndSend(exchage,routeKey,object); Map<String,Object> map = new HashMap<>(); map.put("msg","這是第一個消息"); map.put("data", Arrays.asList("helloworld",123,true)); //對象被默認序列化之後發送出去 rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",new Book("西遊記","吳承恩")); }
4.AmqpAdmin:管理組件
//接受數據,如何將數據自動的轉爲json發送出去 @Test public void receive(){ Object o = rabbitTemplate.receiveAndConvert("atguigu.news"); System.out.println(o.getClass()); System.out.println(o); }
5.RabbitTemplate:消息發送處理組件
/** * 廣播 */ @Test public void sendMsg(){ rabbitTemplate.convertAndSend("exchange.fanout","",new Book("紅樓夢","曹雪芹")); }
注意:在運行前咱們須要在docker中安裝rabbit
以後,咱們在瀏覽器上進行打開其對應的web界面
個人對應的是:192.168.1.110:15672