除了之前講到的緩存,我們還會用到消息隊列來存儲一些消息,為了提升系統的異步性能等等;
消息服務有兩個概念需要知道:消息代理-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