一.rabbitmq簡介
1.RabbitMQ介紹
RabbitMQ 即一個消息隊列,主要是用來實現(xiàn)應用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。
消息中間件最主要的作用是解耦,中間件最標準的用法是生產者生產消息傳送到隊列,消費者從隊列中拿取消息并處理,生產者不用關心是誰來消費,消費者不用關心誰在生產消息,從而達到解耦的目的。在分布式的系統(tǒng)中,消息隊列也會被用在很多其它的方面,比如:分布式事務的支持,RPC的調用等等。
RabbitMQ是實現(xiàn)AMQP(高級消息隊列協(xié)議)的消息中間件的一種,最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲轉發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗。RabbitMQ主要是為了實現(xiàn)系統(tǒng)之間的雙向解耦而實現(xiàn)的。當生產者大量產生數(shù)據(jù)時,消費者無法快速消費,那么需要一個中間層。保存這個數(shù)據(jù)。
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協(xié)議,是應用層協(xié)議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現(xiàn),服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。
2.運行機制
通常我們談到隊列服務, 會有三個概念: 發(fā)消息者、隊列、收消息者,RabbitMQ 在這個基本概念之上, 多做了一層抽象, 在發(fā)消息者和 隊列之間, 加入了交換器 (Exchange). 這樣發(fā)消息者和隊列就沒有直接聯(lián)系, 轉而變成發(fā)消息者把消息給交換器, 交換器根據(jù)調度策略再把消息再給隊列。
左側 P 代表 生產者,也就是往 RabbitMQ 發(fā)消息的程序。
中間即是 RabbitMQ,其中包括了 交換機 和 隊列。
右側 C 代表 消費者,也就是往 RabbitMQ 拿消息的程序。
那么,其中比較重要的概念有 4 個,分別為:虛擬主機,交換機,隊列,和綁定。
(1)虛擬主機:一個虛擬主機持有一組交換機、隊列和綁定。為什么需要多個虛擬主機呢?很簡單,RabbitMQ當中,用戶只能在虛擬主機的粒度進行權限控制。因此,如果需要禁止A組訪問B組的交換機/隊列/綁定,必須為A和B分別創(chuàng)建一個虛擬主機。每一個RabbitMQ服務器都有一個默認的虛擬主機“/”。
(2)交換機:Exchange 用于轉發(fā)消息,但是它不會做存儲,如果沒有 Queue bind 到 Exchange 的話,它會直接丟棄掉 Producer 發(fā)送過來的消息。? 這里有一個比較重要的概念:路由鍵(routing_key)。消息到交換機的時候,交互機會轉發(fā)到對應的隊列中,那么究竟轉發(fā)到哪個(3)隊列,就要根據(jù)該路由鍵。
(4)綁定:也就是交換機需要和隊列相綁定,這其中如上圖所示,是多對多的關系。
交換機的重要功能
交換機的功能主要是接收消息并且轉發(fā)到綁定的隊列,交換機不存儲消息,在啟用ack模式后,交換機找不到隊列會返回錯誤。交換機有四種類型:Direct, topic, Headers and Fanout
Direct:direct 類型的行為是”先匹配, 再投送”. 即在綁定時設定一個routing_key, 消息的routing_key匹配時, 才會被交換器投送到綁定的隊列中去.
Topic:按規(guī)則轉發(fā)消息(最靈活)
Headers:設置header attribute參數(shù)類型的交換機
Fanout:轉發(fā)消息到所有綁定隊列(廣播:忽略routing_key )
3.總結
RabbitMQ簡單來說,就是生產者發(fā)送消息到虛擬主機,虛擬主機把消息交給指定的交換機,交換機按照規(guī)則扔給消息隊列進行存儲,消息隊列等待消費者來消費。
由此我想到了商品買賣:廠家生產商品賣給批發(fā)部,批發(fā)部交給指定的超市出售,超市按照售價擺放在門店,并等待顧客上門購買。
二.rabbitmq在linux上的安裝
因為RabbitMQ是由erlang語言寫的,就像Java程序需要jdk環(huán)境一樣,運行RabbitMQ也需要erlang環(huán)境。
1.安裝erlang
環(huán)境:Centos7.4
下載地址:http://erlang.org/download/
在Linux終端運行命令行
下載:
wget http://erlang.org/download/otp_src_18.3.tar.gz
下載一定要認準otp_src_字樣。
解壓:
tar-zxvf otp_src_18.3.tar.gz
進入解壓后的根目錄:
./configure--prefix=/usr/local/erlang--enable-hipe--enable-threads--enable-smp-support--enable-kernel-poll--without-javac
make&&make install
上面有點慢。
把erlang加入環(huán)境變量:
vi/etc/profile
exportERLANG=/usr/local/erlang/erlangexportPATH=$ERLANG/bin:$PATH
使環(huán)境變量生效
source/etc/profile
然后,我們測試下是否安裝成功:
[root@yueshutong~]# erlErlang/OTP18[erts-7.3][source][64-bit][async-threads:10][hipe][kernel-poll:false]Eshell V7.3(abortwith^G)1>
2.安裝RabbitMQ
下載地址:http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/
下載:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-generic-unix-3.6.1.tar.xz
對于下載xz包進行解壓,首先先下載xz壓縮工具:
yum install xz
對rabbitmq包進行解壓:
xz-d xz-d rabbitmq-server-generic-unix-3.6.1.tar.xz
tar-xvf rabbitmq-server-generic-unix-3.6.1.tar
隨后在sbin目錄啟用MQ管理方式:
./rabbitmq-plugins enable rabbitmq_management? #啟動后臺管理
./rabbitmq-server-detached #后臺運行rabbitmq
添加用戶和權限 默認網頁guest用戶是不允許訪問的,需要增加一個用戶修改一下權限,代碼如下:
添加用戶:
./rabbitmqctl add_user admin admin
添加權限:
./rabbitmqctl set_permissions-p"/"admin".*"".*"".*"
修改用戶角色:
./rabbitmqctl set_user_tags admin administrator
然后就可以遠程訪問了,然后可直接配置用戶權限等信息。
3.驗證
訪問http://ip:15672/,輸入admin用戶密碼,登錄成功!