一、AMQP協(xié)議
高級(jí)消息隊(duì)列協(xié)議,一種約定俗成的規(guī)范。主要適用的消息中間件為RabbitMq、ActiveMq。
發(fā)布者(Publisher)發(fā)布消息(Message),經(jīng)由交換機(jī)(Exchange)。
交換機(jī)根據(jù)路由規(guī)則將收到的消息分發(fā)給與該交換機(jī)綁定的隊(duì)列(Queue)。
最后 AMQP 代理會(huì)將消息投遞給訂閱了此隊(duì)列的消費(fèi)者,或者消費(fèi)者按照需求自行獲取。

二、RabbitMQ概念
RabbitMQ是一個(gè)消息中間件,可以接收、存儲(chǔ)并轉(zhuǎn)發(fā)消息,由以高性能、健壯以及可伸縮性出名的 Erlang 寫成。
它類似于我們生活中的快遞站點(diǎn),當(dāng)你要發(fā)送包裹時(shí),你把你的包裹放在快遞站點(diǎn),快遞員最終會(huì)把你的快遞送到收件人那里。
應(yīng)用場(chǎng)景:
- 異步處理。把消息放入消息中間件中,等到需要的時(shí)候再去處理。
- 流量削峰。例如秒殺活動(dòng),在短時(shí)間內(nèi)訪問(wèn)量急劇增加,使用消息隊(duì)列,當(dāng)消息隊(duì)列滿了就拒絕響應(yīng),跳轉(zhuǎn)到錯(cuò)誤頁(yè)面,這樣就可以使得系統(tǒng)不會(huì)因?yàn)槌?fù)載而崩潰。
- 應(yīng)用解耦。假設(shè)某個(gè)服務(wù)A需要給許多個(gè)服務(wù)(B、C、D)發(fā)送消息,當(dāng)某個(gè)服務(wù)(例如B)不需要發(fā)送消息了,服務(wù)A需要改代碼再次部署;當(dāng)新加入一個(gè)服務(wù)(服務(wù)E)需要服務(wù)A的消息的時(shí)候,也需要改代碼重新部署;另外服務(wù)A也要考慮其他服務(wù)掛掉,沒(méi)有收到消息怎么辦?要不要重新發(fā)送呢?是不是很麻煩,使用MQ發(fā)布訂閱模式,服務(wù)A只生產(chǎn)消息發(fā)送到MQ,B、C、D從MQ中讀取消息,需要A的消息就訂閱,不需要了就取消訂閱,服務(wù)A不再操心其他的事情,使用這種方式可以降低服務(wù)或者系統(tǒng)之間的耦合。
三、RabbitMQ安裝
RabbitMQ依賴于erlang語(yǔ)言,所以安裝之前需要先安裝erlang語(yǔ)言環(huán)境
erlang下載地址: https://www.erlang-solutions.com/downloads/
rabbitmq下載地址:https://github.com/rabbitmq/rabbitmq-server/releases
本文采用的版本
rabbitmq:3.8.19
erlang:23.2
準(zhǔn)備好對(duì)應(yīng)的rmp安裝包后,我們就可以開(kāi)始了

1.安裝erlang
安裝所需環(huán)境
yum -y install unixODBC
yum -y install socat
安裝erlang
rpm -Uvh esl-erlang_23.2-1_centos_7_amd64.rpm
檢測(cè)是否安裝成功
[root@localhost soft]# erl
Erlang/OTP 23 [erts-11.1.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Eshell V11.1.4 (abort with ^G)
1>
2.安裝rabbitmq
rpm -Uvh rabbitmq-server-3.8.19-1.el7.noarch.rpm
rabbitmq現(xiàn)已安裝在您的系統(tǒng)上。
操作rabbitmq命令:
# 加入開(kāi)機(jī)自啟
systemctl enable rabbitmq-server
# 啟動(dòng)rabbitmq
systemctl start rabbitmq-server
# 停止rabbitmq
systemctl stop rabbitmq-server
# 重啟rabbitmq
systemctl restart rabbitmq-server
# 檢查rabbitmq運(yùn)行狀態(tài)
systemctl status rabbitmq-server
成功啟動(dòng)后,狀態(tài)如下:
[root@localhost soft]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2021-07-20 17:17:39 CST; 21s ago
Main PID: 6590 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─6590 /usr/lib/erlang/erts-11.1.4/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sbwtdio none -- -root /usr/lib/erlang -prog...
├─6605 erl_child_setup 32768
├─6639 /usr/lib/erlang/erts-11.1.4/bin/epmd -daemon
├─6664 inet_gethost 4
└─6665 inet_gethost 4
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: TLS Library: OpenSSL - OpenSSL 1.0.2k-fips 26 Jan 2017
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Doc guides: https://rabbitmq.com/documentation.html
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Support: https://rabbitmq.com/contact.html
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Tutorials: https://rabbitmq.com/getstarted.html
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Monitoring: https://rabbitmq.com/monitoring.html
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Logs: /var/log/rabbitmq/rabbit@localhost.log
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
7月 20 17:17:30 localhost.localdomain rabbitmq-server[6590]: Config file(s): (none)
7月 20 17:17:38 localhost.localdomain rabbitmq-server[6590]: Starting broker... completed with 0 plugins.
7月 20 17:17:39 localhost.localdomain systemd[1]: Started RabbitMQ broker.
3.修改防火墻和SELinux規(guī)則
如果您已運(yùn)行防火墻 ,運(yùn)行以下命令開(kāi)放端口。如果沒(méi)有開(kāi)啟防火墻,可以忽略此步驟。
firewall-cmd –zone=public –permanent –add-port=4369/tcp
firewall-cmd –zone=public –permanent –add-port=25672/tcp
firewall-cmd –zone=public –permanent –add-port=5671-5672/tcp
firewall-cmd –zone=public –permanent –add-port=15672/tcp
firewall-cmd –zone=public –permanent –add-port=61613-61614/tcp
firewall-cmd –zone=public –permanent –add-port=1883/tcp
firewall-cmd –zone=public –permanent –add-port=8883/tcp
firewall-cmd –reload
如果您啟用SELinux,則必須運(yùn)行以下命令以允許RabbitMQ服務(wù)。
setsebool -P nis_enabled 1
4.開(kāi)啟rabbitmq的web控制臺(tái)
啟動(dòng)RabbitMQ Web管理控制臺(tái)
rabbitmq-plugins enable rabbitmq_management
訪問(wèn)RabbitMQ的管理面板http://IP:15672/

默認(rèn)用戶的用戶名密碼為guest/guest,如果直接使用此用戶登錄,會(huì)提示User can only log in via localhost

解決方案:
第一種
創(chuàng)建/etc/rabbitmq/rabbitmq.config文件并添加以下內(nèi)容
[{rabbit, [{loopback_users, []}]}].
然后重啟rabbitmq服務(wù)即可
第二種
直接添加其他用戶
# 添加用戶并設(shè)置密碼
rabbitmqctl add_user admin 123456
# 給用戶添加標(biāo)簽
rabbitmqctl set_user_tags admin administrator
# 給用戶設(shè)置權(quán)限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
完成后可直接用創(chuàng)建的用戶登錄

