RabbitMQ簡介與概念

簡介
RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue Protocol)的開源.
AMQP ———高級消息隊列協議,也是一個消息代理的規範,兼容JMS。 RabbitMQ是AMQP的實現

AMQP 中消息的路由過程和 Java 開發者熟悉的 JMS 存在一些差別,AMQP 中增加了Exchange Binding 的角色。生產者把消息發佈到 Exchange 上,消息最終到達隊列並被消費者接收,而 Binding 決定交換器的消息應該發送到那個隊列。
在這裏插入圖片描述

消息服務中兩個重要概念
消息代理(message broker) 目的地(destination)
當消息發送者發送消息以後,將由消息代理接管,消息代理保證消息傳遞到指定目的地

消息隊列主要有兩種形式的目的地

  1. 隊列(queue):點對點消息通信(point-to-point)
    – 消息發送者發送消息,消息代理將其放入一個隊列中,消息接收者從隊列中獲取消息內容,消息讀取後被移出 隊列
    – 消息只有唯一的發送者和接受者,但並不是說只能有一個接收者
  2. 主題(topic):發佈(publish)/訂閱(subscribe)消息
    – 發送者(發佈者)發送消息到主題就會在消息到達時同時收到

核心概念
Message
消息,消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組
成,這些屬性包括routing-key(路由鍵)、priority(相對於其他消息的優先權)、delivery-mode(指出
該消息可能需要持久性存儲)等。

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
表示消息隊列服務器實體

SpringBoot 整合RabbitMQ

  1. 引入 spring-boot-starter-amqp
     <!--rabbitmq-->
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
  1. application.properties配置
	spring.rabbitmq.host=127.0.0.1
	spring.rabbitmq.port=5672
	spring.rabbitmq.username=guest
	spring.rabbitmq.password=guest
	spring.rabbitmq.virtual-host=/

注:mq對象序列化默認是jdk的序列化工具,改成Jackson2JsonMessageConverter

    @Bean("rabbitTemplate")
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate= new RabbitTemplate(connectionFactory);
        //序列化
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章