一、入門概述
1、MQ的產生背景
系統之間直接調用存在的問題?
微服務架構後,鏈式調用是我們在寫程序時候的一般流程,爲了完成一個整體功能會將其拆分成多個函數(或子模塊),比如模塊A調用模塊B,模塊B調用模塊C,模塊C調用模塊D。但在大型分佈式應用中,系統間的RPC交互繁雜,一個功能背後要調用上百個接口並非不可能,從單機架構過渡到分佈式微服務架構的通例。這些架構會有哪些問題?
(1) 系統之間接口耦合比較嚴重
每新增一個下游功能,都要對上游的相關接口進行改造;
舉個例子:如果系統A要發送數據給系統B和系統C,發送給每個系統的數據可能有差異,因此係統A對要發送給每個系統的數據進行了組裝,然後逐一發送;
當代碼上線後又新增了一個需求:把數據也發送給D,新上了一個D系統也要接受A系統的數據,此時就需要修改A系統,讓他感知到D系統的存在,同時把數據處理好再給D。在這個過程你會看到,每接入一個下游系統,都要對系統A進行代碼改造,開發聯調的效率很低。其整體架構如下圖:
(2) 面對大流量併發時,容易被沖垮
每個接口模塊的吞吐能力是有限的,這個上限能力如果是堤壩,當大流量(洪水)來臨時,容易被沖垮。
舉個例子秒殺業務:上游系統發起下單購買操作,就是下單一個操作,很快就完成。然而,下游系統要完成秒殺業務後面的所有邏輯(讀取訂單,庫存檢查,庫存凍結,餘額檢查,餘額凍結,訂單生產,餘額扣減,庫存減少,生成流水,餘額解凍,庫存解凍)。
(3) 等待同步存在性能問題
RPC接口上基本都是同步調用,整體的服務性能遵循“木桶理論”,即整體系統的耗時取決於鏈路中最慢的那個接口。比如A調用B/C/D都是50ms,但此時B又調用了B1,花費2000ms,那麼直接就拖累了整個服務性能。
根據上述的幾個問題,在設計系統時可以明確要達到的目標:
1,要做到系統解耦,當新的模塊接進來時,可以做到代碼改動最小;能夠解耦
2,設置流量緩衝池,可以讓後端系統按照自身吞吐能力進行消費,不被沖垮;能削峯
3,強弱依賴梳理能將非關鍵調用鏈路的操作異步化並提升整體系統的吞吐能力;能夠異步
2 、MQ的主要作用
(1) 異步。調用者無需等待。
(2) 解耦。解決了系統之間耦合調用的問題。
(3) 消峯。抵禦洪峯流量,保護了主業務。
3、 MQ的定義
面向消息的中間件(message-oriented middleware)MOM能夠很好的解決以上問題。是指利用高效可靠的消息傳遞機制與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。通過提供消息傳遞和消息排隊模型在分佈式環境下提供應用解耦,彈性伸縮,冗餘存儲、流量削峯,異步通信,數據同步等功能。
大致的過程是這樣的:發送者把消息發送給消息服務器,消息服務器將消息存放在若干隊列/主題topic中,在合適的時候,消息服務器回將消息轉發給接受者。在這個過程中,發送和接收是異步的,也就是發送無需等待,而且發送者和接受者的生命週期也沒有必然的關係;尤其在發佈pub/訂閱sub模式下,也可以完成一對多的通信,即讓一個消息有多個接受者。
4、MQ的特點
(1) 採用異步處理模式
消息發送者可以發送一個消息而無須等待響應。消息發送者將消息發送到一條虛擬的通道(主題或者隊列)上;
消息接收者則訂閱或者監聽該愛通道。一條消息可能最終轉發給一個或者多個消息接收者,這些消息接收者都無需對消息發送者做出同步迴應。整個過程都是異步的。
案例:
也就是說,一個系統跟另一個系統之間進行通信的時候,假如系統A希望發送一個消息給系統B,讓他去處理。但是系統A不關注系統B到底怎麼處理或者有沒有處理好,所以系統A把消息發送給MQ,然後就不管這條消息的“死活了”,接着系統B從MQ裏面消費出來處理即可。至於怎麼處理,是否處理完畢,什麼時候處理,都是系統B的事兒,與系統A無關。
(2) 應用系統之間解耦合
發送者和接受者不必瞭解對方,只需要確認消息。
發送者和接受者不必同時在線。
(3) 整體架構
(4) MQ的缺點
兩個系統之間不能同步調用,不能實時回覆,不能響應某個調用的回覆。
二、ActiveMQ的安裝及控制檯
**環境及工具說明:**阿里雲服務器+centos7+xshell+jdk8(要提前準備好)
1、安裝
1.2 下載安裝壓縮包
官網地址: http://activemq.apache.org/
點擊下面,開始下載。
下載完之後,將壓縮包上傳到lunix系統中。
# 創建一個新的文件夾,將壓縮包上傳到文件夾中
[root@izbp1bbjc5qwrrd5z2ezayz opt]# mkdir myacitvemq
[root@izbp1bbjc5qwrrd5z2ezayz opt]# ls
containerd myacitvemq
上傳完之後進行解壓縮:
# 解壓
[root@izbp1bbjc5qwrrd5z2ezayz opt]# cd myacitvemq/
[root@izbp1bbjc5qwrrd5z2ezayz myacitvemq]# ls
apache-activemq-5.15.13-bin.tar.gz
[root@izbp1bbjc5qwrrd5z2ezayz myacitvemq]# tar -zvxf apache-activemq-5.15.13-bin.tar.gz
進入bin目錄啓動:
[root@izbp1bbjc5qwrrd5z2ezayz bin]# pwd
/opt/myacitvemq/apache-activemq-5.15.13/bin
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq start
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/opt/myacitvemq/apache-activemq-5.15.13//data/activemq.pid' (pid '20324')
# 出現上述信息表示啓動成功,或者查看一下:
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ps -ef|grep activemq
root 13419 1 0 Jul02 ? 00:01:53 /usr/local/jdk/jdk1.8/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myactivemq/apache-activemq-5.15.13//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/opt/myactivemq/apache-activemq-5.15.13//tmp -Dactivemq.classpath=/opt/myactivemq/apache-activemq-5.15.13//conf:/opt/myactivemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myactivemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myactivemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myactivemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myactivemq/apache-activemq-5.15.13//data -jar /opt/myactivemq/apache-activemq-5.15.13//bin/activemq.jar start
root 20379 19695 0 10:41 pts/0 00:00:00 grep --color=auto activemq
# 停止
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq stop
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Waiting at least 30 seconds for regular process termination of pid '21116' :
Java Runtime: Oracle Corporation 1.8.0_231 /usr/local/jdk/jdk1.8/jre
Heap sizes: current=63360k free=62653k max=1013632k
JVM args: -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myacitvemq/apache-activemq-5.15.13//conf/login.config -Dactivemq.classpath=/opt/myacitvemq/apache-activemq-5.15.13//conf:/opt/myacitvemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myacitvemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myacitvemq/apache-activemq-5.15.13//data
Extensions classpath:
[/opt/myacitvemq/apache-activemq-5.15.13/lib,/opt/myacitvemq/apache-activemq-5.15.13/lib/camel,/opt/myacitvemq/apache-activemq-5.15.13/lib/optional,/opt/myacitvemq/apache-activemq-5.15.13/lib/web,/opt/myacitvemq/apache-activemq-5.15.13/lib/extra]
ACTIVEMQ_HOME: /opt/myacitvemq/apache-activemq-5.15.13
ACTIVEMQ_BASE: /opt/myacitvemq/apache-activemq-5.15.13
ACTIVEMQ_CONF: /opt/myacitvemq/apache-activemq-5.15.13/conf
ACTIVEMQ_DATA: /opt/myacitvemq/apache-activemq-5.15.13/data
Connecting to pid: 21116
.Stopping broker: localhost
# 啓動時指定日誌的位置,非常重要。啓動後控制檯無消息顯示
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ./activemq start > /opt/myacitvemq/apache-activemq-5.15.13/data/myactivemq.log
# 查看,啓動成功
[root@izbp1bbjc5qwrrd5z2ezayz bin]# ps -ef | grep activemq
root 22153 1 21 11:12 pts/0 00:00:07 /usr/local/jdk/jdk1.8/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/myacitvemq/apache-activemq-5.15.13//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/opt/myacitvemq/apache-activemq-5.15.13//tmp -Dactivemq.classpath=/opt/myacitvemq/apache-activemq-5.15.13//conf:/opt/myacitvemq/apache-activemq-5.15.13//../lib/: -Dactivemq.home=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.base=/opt/myacitvemq/apache-activemq-5.15.13/ -Dactivemq.conf=/opt/myacitvemq/apache-activemq-5.15.13//conf -Dactivemq.data=/opt/myacitvemq/apache-activemq-5.15.13//data -jar /opt/myacitvemq/apache-activemq-5.15.13//bin/activemq.jar start
root 22221 19695 0 11:12 pts/0 00:00:00 grep --color=auto activemq
[root@izbp1bbjc5qwrrd5z2ezayz bin]# cd ..
[root@izbp1bbjc5qwrrd5z2ezayz apache-activemq-5.15.13]# ls
activemq-all-5.15.13.jar bin conf data docs examples lib LICENSE NOTICE README.txt tmp webapps webapps-demo
[root@izbp1bbjc5qwrrd5z2ezayz apache-activemq-5.15.13]# cd data
# 已經生成了指定的日誌文件
[root@izbp1bbjc5qwrrd5z2ezayz data]# ls
activemq.log activemq.pid activemq.pid.stop audit.log kahadb myactivemq.log
# 查看生成的日誌內容,其實就是原本顯示在控制檯的內容輸出到日誌上去了。
[root@izbp1bbjc5qwrrd5z2ezayz data]# cat myactivemq.log
INFO: Loading '/opt/myacitvemq/apache-activemq-5.15.13//bin/env'
INFO: Using java '/usr/local/jdk/jdk1.8/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details
INFO: pidfile created : '/opt/myacitvemq/apache-activemq-5.15.13//data/activemq.pid' (pid '22153')
2、進入管理界面
訪問activemq管理頁面地址:http://IP地址:8161/
初始賬號和密碼都是admin
請注意: 使用前務必將端口開放,要不然會被訪問拒絕!!!
點擊Manage ActiveMQ broker可以進入消息的管理界面:
功能欄就是對應的首頁,隊列和話題等相關功能。後面會詳細講解到。
到這裏的話,基本的安裝就完成了。下一章會講解一下最基礎的使用。