除了以前講到的緩存,咱們還會用到消息隊列來存儲一些消息,爲了提高系統的異步性能等等;html
消息服務有兩個概念須要知道:消息代理-message broker,目的地-destination。消息發送由代理接管並傳遞到指定目的地:web
—— 消息只有惟一的發送和接受者,消息從隊列中取出就不在了。redis
目的地有兩種形式:queue-點對點的消息隊列、topic-發佈(publish)和訂閱(subscribe)的消息通訊主題;spring
—— 發送一個消息主題,多個訂閱者經過監聽得知消息的發佈並取得;0docker
我要介紹的以AMQP協議的RabbitMQ爲例:json
Message-消息,它是由幾個屬性組成的,具有消息頭和消息體;windows
Publish-消息生產者,向交換器發佈消息的一個應用程序;瀏覽器
Exchange-交換器,接收消息,並把消息路由給服務器中的隊列,屬於分配的角色; Exchange有四種類型:direct、fanout、topic和headers。這四種轉發消息的策略有區別:緩存
Queue-消息隊列,保存消息的容器,一個Broker中能夠有多個消息隊列;服務器
Binding-綁定,將Exchange和Queue綁定;
Connection-網絡鏈接,好比Tcp鏈接;
Channel-信道,創建在TCP鏈接中的虛擬的,雙向數據流通道;AMQP命令就是經過信道將消息發送、發佈、訂閱和接收的;
Consumer-消息接收者,也叫消息的消費者,用來接收和獲取消息的一端應用;
Virtual Host-虛擬主機,每一個虛擬主機相對獨立,至關於一個獨立的mini的RabbitMQ服務器,默認是「/」;
Broker-消息隊列服務器實體;
這些基本概念的關係如圖:(不細說)
2、運行機制:
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)
這裏介紹兩種安裝和啓用的方法:(windows和docker)
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
使用上邊的方法,咱們成功的安裝和啓動了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鍵的輸入,按照以前說過的規則來寫:
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