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

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

1.安裝erlang
安裝所需環(huán)境
yum -y install unixODBC
yum -y install socat
安裝erlang
rpm -Uvh esl-erlang_23.2-1_centos_7_amd64.rpm
檢測是否安裝成功
[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命令:
# 加入開機自啟
systemctl enable rabbitmq-server
# 啟動rabbitmq
systemctl start rabbitmq-server
# 停止rabbitmq
systemctl stop rabbitmq-server
# 重啟rabbitmq
systemctl restart rabbitmq-server
# 檢查rabbitmq運行狀態(tài)
systemctl status rabbitmq-server
成功啟動后,狀態(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ī)則
如果您已運行防火墻 ,運行以下命令開放端口。如果沒有開啟防火墻,可以忽略此步驟。
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,則必須運行以下命令以允許RabbitMQ服務。
setsebool -P nis_enabled 1
4.開啟rabbitmq的web控制臺
啟動RabbitMQ Web管理控制臺
rabbitmq-plugins enable rabbitmq_management
訪問RabbitMQ的管理面板http://IP:15672/

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

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

