SpringBoot+RabbitMQ 快速入門


開始使用

下載安裝

官網下載很慢,win64-CSDN指路,Erlang22.2 RabbitMQ 3.8.2
后面就是一步步安裝就好,注意,安裝時以管理員權限運行安裝程序。

安裝rabbitmq_management可視化插件

  • 啟動RabbitMQ服務

  • 打開開始菜單的RabbitMQ Command命令行工具,輸入rabbitmq-plugins list查詢可安裝插件

  • 輸入rabbitmq-plugins enable rabbitmq_management安裝插件

  • 重啟服務

  • 訪問 http://localhost:15672/ 默認用戶名密碼 guest guest

介紹

消息隊列

  • RabbitMQ 即一個消息隊列,主要是用來實現應用程序的異步和解耦,同時也能起到消息緩沖,消息分發的作用。

  • 消息中間件最主要的作用是解耦,中間件最標准的用法是生產者生產消息傳送到隊列,消費者從隊列中拿取消息並處理,生產者不用關心是誰來消費,消費者不用關心誰在生產消息,從而達到解耦的目的。

  • 在分布式的系統中,消息隊列也會被用在很多其它的方面,比如:分布式事務的支持,RPC 的調用等等。

RabbitMQ 介紹

  • RabbitMQ 主要是為了實現系統之間的雙向解耦而實現的。當生產者大量產生數據時,消費者無法快速消費,那么需要一個中間層。保存這個數據;

  • AMQP,即 Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。

  • RabbitMQ 是實現 AMQP(高級消息隊列協議)的消息中間件的一種,消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。

  • RabbitMQ 是一個開源的 AMQP 實現,服務器端用Erlang語言編寫,用於在分布式系統中存儲轉發消息;

相關概念

通常我們談到隊列服務, 會有三個概念: 發消息者、隊列、收消息者,RabbitMQ 在這個基本概念之上, 多做了一層抽象, 在發消息者和 隊列之間, 加入了交換器 (Exchange).
發消息者和隊列沒有直接聯系, 發消息者把消息給交換器, 交換器根據調度策略再把消息再給隊列。

其中比較重要的概念有 4 個,分別為:虛擬主機,交換機,隊列,和綁定。

  • 虛擬主機:一個虛擬主機持有一組交換機、隊列和綁定。為什么需要多個虛擬主機呢?很簡單, RabbitMQ 當中,用戶只能在虛擬主機的粒度進行權限控制。 因此,如果需要禁止A組訪問B組的交換機/隊列/綁定,必須為A和B分別創建一個虛擬主機。每一個 RabbitMQ 服務器都有一個默認的虛擬主機“/”。

  • 交換機:Exchange 用於轉發消息,但是它不會做存儲 ,如果沒有 Queue bind 到 Exchange 的話,它會直接丟棄掉 Producer 發送過來的消息。 這里有一個比較重要的概念:路由鍵 。消息到交換機的時候,交互機會轉發到對應的隊列中,那么究竟轉發到哪個隊列,就要根據該路由鍵。

  • 綁定:也就是交換機需要和隊列相綁定,這其中如上圖所示,是多對多的關系。

RabbitMQ的交換機

交換機的功能主要是接收消息並且轉發到綁定的隊列,交換機不存儲消息,在啟用ack模式后,交換機找不到隊列會返回錯誤。交換機有四種類型:Direct, topic, Headers and Fanout

  • Direct:direct 類型的行為是”先匹配, 再投送”. 即在綁定時設定一個 routing_key, 消息的routing_key 匹配時, 才會被交換器投送到綁定的隊列中去.
  • Topic:按規則轉發消息(最靈活)
  • Headers:設置 header attribute 參數類型的交換機
  • Fanout:轉發消息到所有綁定隊列

Direct 交換機

Direct Exchange 是 RabbitMQ 默認的交換機模式,也是最簡單的模式,根據key全文匹配去尋找隊列。

  • X - Q1 就有一個 binding key,名字為 orange;
  • X - Q2 就有 2 個 binding key,名字為 black 和 green。
  • 當消息中的 路由鍵 和 這個 binding key 對應上的時候,那么就知道了該消息去到哪一個隊列中。

Topic 交換機

Topic Exchange 轉發消息主要是根據通配符。 在這種交換機下,隊列和交換機的綁定會定義一種路由模式,那么,通配符就要在這種路由模式和路由鍵之間匹配后交換機才能轉發消息。

這種交換機模式下:

  • 路由鍵必須是一串字符,用句號(.) 隔開,比如說 agreements.us,或者 agreements.eu.stockholm 等。
  • 路由模式中的星號(),主要用於匹配路由鍵指定位置的一個單詞,比如說,一個路由模式是這樣子:agreements..b.,那么就只能匹配這樣的路由鍵:第一個單詞是 agreements,第四個單詞是 b。
  • 路由模式中的井號(#)就表示相當於一個或者多個單詞,例如一個匹配模式是 agreements.eu.berlin.#,那么,以agreements.eu.berlin 開頭的路由鍵都是可以的。

具體代碼發送的時候還是一樣,第一個參數表示交換機,第二個參數表示路由鍵,第三個參數即消息。如下:

       rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", "this is RabbitMQ!");

topic 和 direct 類似, 只是匹配上支持了”模式”, 在”點分”的 routing_key 形式中, 可以使用兩個通配符:

  • *表示一個詞.
  • #表示零個或多個詞.

Headers交換機

headers 也是根據規則匹配, 相較於 direct 和 topic 固定地使用 routing_key , headers 則是一個自定義匹配規則的類型.

在隊列與交換器綁定時, 會設定一組鍵值對規則, 消息中也包括一組鍵值對( headers 屬性), 當這些鍵值對有一對, 或全部匹配時, 消息被投送到對應隊列.

Fanout交換機

Fanout Exchange 消息廣播的模式,不管路由鍵或者是路由模式,會把消息發給綁定給它的全部隊列,如果配置了 routing_key 會被忽略。

Spring Boot 集成 RabbitMQ

開始使用

配置Pom包,主要是添加spring-boot-starter-amqp的支持

    <dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

配置文件

    spring:
      rabbitmq:
        host: 127.0.0.1
        port: 5672
        username: guest
        password: guest
        publisher-confirms: true
        virtual-host: /

隊列配置

    @Configuration
    public class SimpleRabbitConfig {

        // 設置一個簡單的隊列
        @Bean
        public Queue queue() {
            return new Queue("helloMQ");
        }
    }

消息發送者(生產者)

rabbitTemplate 是 Spring Boot 提供的默認實現

    @Component
    public class SimpleSender {

        @Autowired
        private AmqpTemplate rabbitMQTemplate;

        public void send() {
            String context = "helloMQ " + new Date().getTime();
            rabbitMQTemplate.convertAndSend("helloMQ", context);
        }
    }

消息接收者

    @Component
    @RabbitListener(queues = {"helloMQ"})
    public class HelloReceiver {

        @RabbitHandler
        public void process(String hello) {
            System.out.println("Receiver  : " + hello);
        }
    }

測試

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = SenderApplication.class)
    public class RabbitMQTest {

        @Autowired
        private SimpleSender simpleSender;
    
        @Test
        public void hello() throws Exception {
            for (int i = 0; i < 10; i++) {
                simpleSender.send();
                Thread.sleep(1000);
            }
        }
    }

注意,發送者和接收者的queue name必須一致,不然不能接收

結尾

RabbitMQ與Springboot的其他配合使用方法:包括一對多、多對多、各種交換機實踐、發送對象。

由於篇幅有限,需要的話可以移步本人的GitHub倉庫,代碼已上傳自取哦。地址:https://github.com/caotinging


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM