简介
消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。
RabbitMQ 是一种流行的开源消息代理,它根据预定义的规则存储和传递两个或多个服务之间的异步消息。它是一种中间软件,可确保你的系统更可靠、更具可扩展性且始终可用。例如,RabbitMQ 可用于通过将繁重的任务委派给当时空闲的其他服务来减少系统负载。
本教程的目标是手把手教你如何在 Linux 服务器上安装 RabbitMQ,以便开始使用这个出色的软件。
准备工作
服务器准备
必要前提:
- 一个充满求知欲的大脑。
- 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。
我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。
注册链接: https://rainyun.ivwv.site
创建雨云服务器
以下步骤仅供参考,请根据实际需求选择配置。
- 点击 云产品 → 云服务器 → 立即购买。
- 选择距离你较近的区域,以保证低延迟。
- 按照自己需求选择配置,选择Ubuntu 22.04 版本,按照自己需求是否预装Docker。
- 最后按照提示进行购买。
- 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
- 我们使用
PowerShell
进行SSH
远程连接到服务器,Win+R
打开运行窗口,输入powershell
后点击确定。
- 输入
ssh root@你的服务器IP
例如ssh root@154.9.227.239
回车后,首次需要输入yes
,再次回车后即可登录服务器。
- 到此为止,我们的云服务器就远程连接上了。
安装和配置步骤
第一步:安装 RabbitMQ 服务器
首先,让我们安装先决条件:
bash
apt-get install curl gnupg apt-transport-https -y
我们现在准备好分别为 RabbiMQ 主存储库、ErLang 和 RabbitMQ PackageCloud 存储库添加存储库签名密钥:
bash
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
curl -1sLf "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf77f1eda57ebb1cc" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg > /dev/null
curl -1sLf "https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.packagecloud.rabbitmq.gpg > /dev/null
在 /etc/apt/sources.list.d/rabbitmq.list
创建一个新文件,并为 ErLang 和 RabbitMQ 分别添加以下适用于 Ubuntu 22.04 jammy
版本的存储库:
bash
deb [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu jammy main
deb-src [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu jammy main
deb [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ jammy main
deb-src [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ jammy main
保存该文件,你就可以更新存储库列表了:
bash
apt-get update -y
更新存储库列表后,继续安装所需的 ErLang 软件包:
bash
apt-get install -y erlang-base \\
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \\
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \\
erlang-runtime-tools erlang-snmp erlang-ssl \\
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
最后,我们可以安装 RabbitMQ 服务器及其依赖项:
bash
apt-get install rabbitmq-server -y --fix-missing
如果一切顺利,你应该看到一个正在运行的 rabbitmq-server 进程:
bash
systemctl status rabbitmq-server
恭喜,你现在已成功安装 RabbitMQ!现在是学习如何使用它的时候了。
第二步:启用 RabbitMQ 管理控制台
RabbitMQ 有一个管理控制台插件,允许你通过基于 Web 的界面执行各种管理和监控任务。你可以管理交换机、队列、绑定、用户和其他 RabbitMQ 对象,以及监控内存使用率、消息速率、连接和其他进程等内容。
要检查所有可用的 RabbitMQ 插件的列表,请运行以下命令:
bash
rabbitmq-plugins list
如你所见,所有插件当前均已禁用。你可以使用以下命令启用 RabbitMQ 管理插件:
bash
rabbitmq-plugins enable rabbitmq_management
你现在可以连接到 RabbitMQ Web 界面。要获得访问权限,请打开你的 Web 浏览器并键入 URL http://你的服务器IP:15672
:
默认用户名和密码为 guest
,但是,你只能从 localhost 使用用户 guest
连接到你的 RabbitMQ 服务器。任何其他用户都不会受到这种限制。
如果你不知道你的 IP 地址,请键入以下命令来找出它:
bash
hostame -I
第三步:设置 RabbitMQ 管理用户
建议在设置 RabbitMQ 服务器时创建一个新用户并为其分配管理权限。你可以使用 rabbitmqctl add_user
命令添加新用户。选择一个唯一的用户名并设置一个安全的密码以继续:
bash
rabbitmqctl add_user thebigrabbit MyS3cur3Passwor_d
接下来,使用以下命令为创建的用户设置管理员标记:
bash
rabbitmqctl set_user_tags thebigrabbit administrator
出于安全原因,还建议删除默认用户 guest
:
bash
rabbitmqctl delete_user guest
请随意检查用户列表,以确保你的配置正确:
bash
rabbitmqctl list_users
你现在可以看到只有一个用户 thebigrabbit
带有标记 administrator
,并且没有可用的默认用户 guest
。目前为止一切顺利。
第四步:创建 RabbitMQ 虚拟主机
RabbitMQ 在虚拟主机级别管理用户权限。RabbitMQ 中的虚拟主机提供不同资源的逻辑分组和分隔。此类资源可能包括连接、交换机、队列、绑定、用户权限和一些其他 RabbitMQ 对象。
要添加新的虚拟主机,请继续执行以下命令:
bash
rabbitmqctl add_vhost cherry_broker
你可以将各种配置设置应用于虚拟主机,例如设置最大并发客户端连接数、配置最大队列数等。现在让我们列出服务器上所有可用的虚拟主机:
bash
rabbitmqctl list_vhosts
如你所见,你的服务器上当前有两个可用的虚拟主机 - /
和 cherry_broker
。你可以使用以下命令删除默认虚拟主机:
bash
rabbitmqctl delete_vhost /
第五步:为虚拟主机分配用户权限
接下来,你需要在新创建的虚拟主机上为你的管理用户设置特定的用户权限。用于设置用户权限的基本命令模式如下:
bash
sudo rabbitmqctl set_permissions -p <virtual_host> <user_name> <permissions>
要在虚拟主机 cherry_broker
上为用户 thebigrabbit
设置完全权限,请运行以下命令:
bash
sudo rabbitmqctl set_permissions -p cherry_broker thebigrabbit ".*" ".*" ".*"
更具体地说:
p
用于定义虚拟主机。- 第一个权限参数".*"授予对所有虚拟主机实体的配置权限。它允许你声明交换机、队列等。
- 第二个权限参数".*"授予对所有虚拟主机实体的写入权限。它允许你创建绑定、发布消息等。
- 第三个权限参数".*"授予读取权限。它允许你读取队列、使用消息等。
你可以使用以下命令查看你刚刚在虚拟主机上设置的权限:
bash
sudo rabbitmqctl list_permissions -p cherry_broker
第六步:通过 Web 管理控制台设置 RabbitMQ
你现在可以使用你新创建的用户名和密码连接到 Web 管理控制台:
成功验证后,你应该看到类似的 RabbitMQ 仪表板:
第七步:在 Python 中发送和使用 RabbitMQ 消息
即使有许多适用于 RabbitMQ 的 SDK,我们仍将在此教程中使用 Python。首先,我们需要安装 RabbitMQ 开发团队推荐的 pika
Python 客户端。使用 pip install
继续安装:
bash
pip install pika --upgrade
我们现在准备好开始编写我们的 Python 开发脚本。我们将在远程 Linux 主机上运行这些脚本,该主机将连接到标准端口 5672 上的 RabbitMQ 服务器以发送和使用消息。我们将使用 producer.py
和 consumer.py
脚本来说明消息代理的工作原理。
现在让我们定义我们的 producer.py
脚本,其工作是生成消息并将它们推送到 RabbitMQ:
python
#!/usr/bin/env python
import pika
# If you want to have a more secure SSL authentication, use ExternalCredentials object instead
credentials = pika.PlainCredentials(username='thebigrabbit', password='MyS3cur3Passwor_d', erase_on_connect=True)
parameters = pika.ConnectionParameters(host='5.199.168.22', port=5672, virtual_host='cherry_broker', credentials=credentials)
# We are using BlockingConnection adapter to start a session. It uses a procedural approach to using Pika and has most of the asynchronous expectations removed
connection = pika.BlockingConnection(parameters)
# A channel provides a wrapper for interacting with RabbitMQ
channel = connection.channel()
# Check for a queue and create it, if necessary
channel.queue_declare(queue='hello')
# For the sake of simplicity, we are not declaring an exchange, so the subsequent publish call will be sent to a Default exchange that is predeclared by the broker
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
# Safely disconnect from RabbitMQ
connection.close()
保存它并创建一个 consumer.py
脚本,其工作是从 RabbitMQ 使用消息:
python
#!/usr/bin/env python
import pika, sys, os
# Here we define the main script that will be executed forever until a keyboard interrupt exception is received
def main():
credentials = pika.PlainCredentials('thebigrabbit', 'MyS3cur3Passwor_d')
parameters = pika.ConnectionParameters(host='5.199.168.22', port=5672, virtual_host='cherry_broker', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='hello')
# Since RabbitMQ works asynchronously, every time you receive a message, a callback function is called. We will simply print the message body to the terminal
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
# Consume a message from a queue. The auto_ack option simplifies our example, as we do not need to send back an acknowledgement query to RabbitMQ which we would normally want in production
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
# Start listening for messages to consume
channel.start_consuming()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print("Interrupted")
try:
sys.exit(0)
except SystemExit:
os._exit(0)
我们现在可以通过运行我们的 producer 脚本来发送我们的第一条消息:
bash
python3 producer.py
你可以双击 Web 管理控制台以查看带有单条消息的队列 hello
,该消息已准备好被使用:
现在让我们运行 consumer 脚本以接收此消息:
如你所见,在接收到 KeyboardInterrupt 信号 (CTRL + C) 之前,已成功使用了消息 Hello World!
。
如果你检查了 Web 管理控制台,你将看到一个空的 hello
队列:
结论
在本指南中,你已经了解了很多关于 RabbitMQ、它的优点以及可能的用例。你现在可以继续进一步开发,以在生产环境中实施你所需的消息代理用例。请查看官方 RabbitMQ 和 Pika 文档,以获取沿途的任何其他信息。
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site