SpringBoot日記——MQ消息隊列整合(一)


  除了之前講到的緩存,我們還會用到消息隊列來存儲一些消息,為了提升系統的異步性能等等;

  消息服務有兩個概念需要知道:消息代理-message broker,目的地-destination。消息發送由代理接管並傳遞到指定目的地:

    —— 消息只有唯一的發送和接受者,消息從隊列中取出就不在了。

  目的地有兩種形式:queue-點對點的消息隊列、topic-發布(publish)和訂閱(subscribe)的消息通信主題;

    —— 發送一個消息主題,多個訂閱者通過監聽得知消息的發布並取得;0

  我要介紹的以AMQP協議的RabbitMQ為例:

RabbitMQ

  

  一、基本概念及結構關系:

  Message-消息,它是由幾個屬性組成的,具備消息頭和消息體;

  Publish-消息生產者,向交換器發布消息的一個應用程序;

  Exchange-交換器,接收消息,並把消息路由給服務器中的隊列,屬於分配的角色; Exchange有四種類型:direct、fanout、topic和headers。這四種轉發消息的策略有區別:

  Queue-消息隊列,保存消息的容器,一個Broker中可以有多個消息隊列;

  Binding-綁定,將Exchange和Queue綁定;

  Connection-網絡連接,比如Tcp連接;

  Channel-信道,建立在TCP連接中的虛擬的,雙向數據流通道;AMQP命令就是通過信道將消息發送、發布、訂閱和接收的;

  Consumer-消息接收者,也叫消息的消費者,用來接收和獲取消息的一端應用;

  Virtual Host-虛擬主機,每個虛擬主機相對獨立,相當於一個獨立的mini的RabbitMQ服務器,默認是“/”;

  Broker-消息隊列服務器實體;

  這些基本概念的關系如圖:(不細說)

  

 

  二、運行機制:

  Exchange我們上邊介紹了,有4種策略類型,其中header是對消息中的header進行匹配的,使用相對少。下邊主要介紹另外三種都是匹配路由鍵(routing key)的:

    direct:以單播的模式,如果發送的路由鍵和我們綁定的key一致,那么就發送到該隊列中。比如我們發送aaa,那么就只有介紹aaa的Queue的key才會接收和取走這條消息,即完全匹配、1v1收發;

    fanout:廣播模式發送消息到每一個消息隊列中,無論路由鍵是什么。比如我們發送aaa,那么無論有多少個消息隊列,我們都發;

    topic:將我們發出的消息,按照匹配規則模糊的來收發。比如,我們發送aaa.bb,那么我們就發送到aaa.#和*.bb中,而不會發送到其他比如ccc.#的消息隊列中;

        (*匹配一個單詞,#匹配0或多個單詞-比如aa.bb.cc)

    

RabbitMQ的安裝測試

  這里介紹兩種安裝和啟用的方法:(windows和docker)

  1.windows環境下的安裝和使用:

  1)、在windows環境下,我們需要先依賴一個ErLang的語言開發包,下載地址:http://www.erlang.org/downloads,根據你的系統選擇32或64位版本的安裝

  然后配置一下環境變量:

  ERLANG_HOME = C:\Program Files\er21.0  (你的安裝目錄)
  Path 中加入 %ERLANG_HOME%\bin;

  測一下是否安裝成功,如下圖,OK(輸入:erl)

  2)、下載和安裝RabbitMQ,下載地址:http://www.rabbitmq.com/download.html ,選擇windows版本

  同樣安裝和配置環境變量:

  RABBITMQ_SERVER = C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.1  (安裝目錄)
  在path中加入:%RABBITMQ_SERVER%\sbin;

  然后安裝插件-用來實現界面管理的,在命令行中輸入: rabbitmq-plugins.bat enable rabbitmq_management  (圖片是網上扒的,不要在意細節~)

  啟動MQ服務,為了防止異常情況,我們這里要求使用管理員模式的命令行窗口輸入:

net stop RabbitMQ && net start RabbitMQ

  如果想停止服務:rabbitmq-service stop

 

  2.docker下的安裝和使用:

  1)、首先鏈接服務器,然后檢查鏡像,如果沒有MQ的,我們去官方hub網站查看一下,我們選擇標簽中帶有management的進行下載,這個是帶有web管理界面的;

  在服務器中鍵入該命令進行下載:

docker pull registry.docker-cn.com/library/rabbitmq:3-management

  這樣,鏡像就安裝好了。那么我們來啟動這個mq服務:(mq默認端口就是這兩個)

docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq df0ee1f2343b

 

使用RabbitMQ的web管理界面

  使用上邊的方法,我們成功的安裝和啟動了MQ服務,那么我們來使用web管理界面來檢查下,是否可以使用吧。

  在瀏覽器的地址欄輸入(默認賬戶密碼是guest/guest,有需要自己再添加設置)

  ip:15672
  如果是windows本地搭建:localhost:15672
  如果是docker搭建的:xx.xx.xx.xx:15672  ip是服務器地址,可以通過ip addr查看你服務器的ip地址

  登錄以后,可以看到我們之前講的那些字段,然后添加我們需要的東西就可以了,下邊不具體介紹,幾個圖自己領會一下吧~

  步驟:添加Exchange、添加Queue、進入Exchange綁定Queue、在Exchange內發送消息、到Queue中獲取該消息

   這里單獨說一下關於topic鍵的輸入,按照之前說過的規則來寫:

 

    將RabbitMQ整合到SpringBoot中

  web客戶端我們應該有一些了解了,那如何在代碼中應用呢?先來看如何做關聯,很簡單,在pom.xml中加入這一段:

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

  1)、關於使用,這里其實跟redis緩存一樣,我們使用注解:

@EnableRabbit    //使用rabbitMQ的注解
@RabbitListener  //監聽rabbitMQ消息

  同樣,為了得到的數據是json格式的,我們直接自己自定義一個類:

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableRabbit  //啟動rabbit注解
public class MyAMQPConfig {
  // 將消息以json格式傳遞
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

  來測試一下,我們添加的MQ是否可用吧:……有點長,換下一篇文章=。=b

 

  


免責聲明!

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



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