如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
简介
消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。
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 服务器
首先,让我们安装先决条件:
apt-get install curl gnupg apt-transport-https -y
我们现在准备好分别为 RabbiMQ 主存储库、ErLang 和 RabbitMQ PackageCloud 存储库添加存储库签名密钥:
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 版本的存储库:
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
保存该文件,你就可以更新存储库列表了:
apt-get update -y
更新存储库列表后,继续安装所需的 ErLang 软件包:
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 服务器及其依赖项:
apt-get install rabbitmq-server -y --fix-missing
如果一切顺利,你应该看到一个正在运行的 rabbitmq-server 进程:
systemctl status rabbitmq-server

恭喜,你现在已成功安装 RabbitMQ!现在是学习如何使用它的时候了。
第二步:启用 RabbitMQ 管理控制台
RabbitMQ 有一个管理控制台插件,允许你通过基于 Web 的界面执行各种管理和监控任务。你可以管理交换机、队列、绑定、用户和其他 RabbitMQ 对象,以及监控内存使用率、消息速率、连接和其他进程等内容。
要检查所有可用的 RabbitMQ 插件的列表,请运行以下命令:
rabbitmq-plugins list

如你所见,所有插件当前均已禁用。你可以使用以下命令启用 RabbitMQ 管理插件:
rabbitmq-plugins enable rabbitmq_management

你现在可以连接到 RabbitMQ Web 界面。要获得访问权限,请打开你的 Web 浏览器并键入 URL http://你的服务器IP:15672:

默认用户名和密码为 guest,但是,你只能从 localhost 使用用户 guest 连接到你的 RabbitMQ 服务器。任何其他用户都不会受到这种限制。
如果你不知道你的 IP 地址,请键入以下命令来找出它:
hostame -I
第三步:设置 RabbitMQ 管理用户
建议在设置 RabbitMQ 服务器时创建一个新用户并为其分配管理权限。你可以使用 rabbitmqctl add_user 命令添加新用户。选择一个唯一的用户名并设置一个安全的密码以继续:
rabbitmqctl add_user thebigrabbit MyS3cur3Passwor_d

接下来,使用以下命令为创建的用户设置管理员标记:
rabbitmqctl set_user_tags thebigrabbit administrator
出于安全原因,还建议删除默认用户 guest:
rabbitmqctl delete_user guest
请随意检查用户列表,以确保你的配置正确:
rabbitmqctl list_users

你现在可以看到只有一个用户 thebigrabbit 带有标记 administrator,并且没有可用的默认用户 guest。目前为止一切顺利。
第四步:创建 RabbitMQ 虚拟主机
RabbitMQ 在虚拟主机级别管理用户权限。RabbitMQ 中的虚拟主机提供不同资源的逻辑分组和分隔。此类资源可能包括连接、交换机、队列、绑定、用户权限和一些其他 RabbitMQ 对象。
要添加新的虚拟主机,请继续执行以下命令:
rabbitmqctl add_vhost cherry_broker
你可以将各种配置设置应用于虚拟主机,例如设置最大并发客户端连接数、配置最大队列数等。现在让我们列出服务器上所有可用的虚拟主机:
rabbitmqctl list_vhosts

如你所见,你的服务器上当前有两个可用的虚拟主机 - / 和 cherry_broker。你可以使用以下命令删除默认虚拟主机:
rabbitmqctl delete_vhost /
第五步:为虚拟主机分配用户权限
接下来,你需要在新创建的虚拟主机上为你的管理用户设置特定的用户权限。用于设置用户权限的基本命令模式如下:
sudo rabbitmqctl set_permissions -p <virtual_host> <user_name> <permissions>
要在虚拟主机 cherry_broker 上为用户 thebigrabbit 设置完全权限,请运行以下命令:
sudo rabbitmqctl set_permissions -p cherry_broker thebigrabbit ".*" ".*" ".*"
更具体地说:
p用于定义虚拟主机。- 第一个权限参数“.*”授予对所有虚拟主机实体的配置权限。它允许你声明交换机、队列等。
- 第二个权限参数“.*”授予对所有虚拟主机实体的写入权限。它允许你创建绑定、发布消息等。
- 第三个权限参数“.*”授予读取权限。它允许你读取队列、使用消息等。
你可以使用以下命令查看你刚刚在虚拟主机上设置的权限:
sudo rabbitmqctl list_permissions -p cherry_broker

第六步:通过 Web 管理控制台设置 RabbitMQ
你现在可以使用你新创建的用户名和密码连接到 Web 管理控制台:

成功验证后,你应该看到类似的 RabbitMQ 仪表板:

第七步:在 Python 中发送和使用 RabbitMQ 消息
即使有许多适用于 RabbitMQ 的 SDK,我们仍将在此教程中使用 Python。首先,我们需要安装 RabbitMQ 开发团队推荐的 pika Python 客户端。使用 pip install 继续安装:
pip install pika --upgrade
我们现在准备好开始编写我们的 Python 开发脚本。我们将在远程 Linux 主机上运行这些脚本,该主机将连接到标准端口 5672 上的 RabbitMQ 服务器以发送和使用消息。我们将使用 producer.py 和 consumer.py 脚本来说明消息代理的工作原理。
现在让我们定义我们的 producer.py 脚本,其工作是生成消息并将它们推送到 RabbitMQ:
#!/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 使用消息:
#!/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 terminaldef 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 productionchannel.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 consumechannel.start_consuming()if __name__ == '__main__':try:main()except KeyboardInterrupt:print("Interrupted")try:sys.exit(0)except SystemExit:os._exit(0)
我们现在可以通过运行我们的 producer 脚本来发送我们的第一条消息:
python3 producer.py

你可以双击 Web 管理控制台以查看带有单条消息的队列 hello,该消息已准备好被使用:

现在让我们运行 consumer 脚本以接收此消息:

如你所见,在接收到 KeyboardInterrupt 信号 (CTRL + C) 之前,已成功使用了消息 Hello World!。
如果你检查了 Web 管理控制台,你将看到一个空的 hello 队列:

结论
在本指南中,你已经了解了很多关于 RabbitMQ、它的优点以及可能的用例。你现在可以继续进一步开发,以在生产环境中实施你所需的消息代理用例。请查看官方 RabbitMQ 和 Pika 文档,以获取沿途的任何其他信息。
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site
我的博客:https://blog.ivwv.site
相关文章:
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…...
【OpenGL ES】GLSL基础语法
1 前言 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符(in、out、inout)、函数参数限定符等内容,另外提供了一个 include 工具,方便多文件管理 glsl 代码&a…...
如何使用交叉编译器调试C语言程序在安卓设备中运行
一、前言 随着移动设备的普及与技术的飞速发展,越来越多的开发者面临着在Android设备上运行和调试C语言等程序的需求。然而,在软件开发的世界里,不同硬件架构对程序运行的要求千差万别,这无疑增加了开发的复杂性。特别是在移动计…...
Java全栈项目 - 智能考勤管理系统
项目介绍 智能考勤管理系统是一个基于 Java 全栈技术开发的现代化企业考勤解决方案。该系统采用前后端分离架构,实现了员工考勤、请假管理、统计分析等核心功能,旨在帮助企业提高人力资源管理效率。 技术栈 后端技术 Spring Boot 2.6.xSpring Securi…...
Linux Shell : Process Substitution
注:本文为 “Process Substitution” 相关文章合辑。 英文引文机翻,未校。 Process Substitution. 进程替换允许使用文件名引用进程的输入或输出。它采取以下形式 <(list)or >(list)进程 list 异步运行,其输入或输出显示为文件名。…...
JOGL 从入门到精通:开启 Java 3D 图形编程之旅
一、引言 Java 作为一门广泛应用的编程语言,在图形编程领域也有着强大的工具和库。JOGL(Java OpenGL)便是其中之一,它为 Java 开发者提供了访问 OpenGL(Open Graphics Library)功能的接口,使得…...
汽车网络安全基线安全研究报告
一、引言 随着汽车行业朝着智能网联方向飞速发展,汽车网络安全已成为保障用户安全和行业健康发展的关键要素。本报告将深入探讨汽车网络安全相关内容,以及国际、国内重要的汽车网络安全标准基线和相应防护措施等内容。 二、汽车网络安全的重要性 &…...
Eclipse 修改项目栏字体大小
1、菜单栏选择window->preference,然后选择General->Appearance->Colors and Fonts,在搜索栏输入"tree",点击"Edit"修改字体。 2、修改字体,选择"四号字体",点击"确定&qu…...
【PCIe 总线及设备入门学习专栏 5.1 -- PCIe 引脚 PRSNT 与热插拔】
文章目录 OverviewPRSNT 与热插拔PRSNT 硬件设计 Overview Spec 定义的热插拔是把一个PCIe卡(设备)从一个正在运行的背板或者系统中插入/或者移除。这个过程需要不影响系统的其他功能。插入的新的设备可以正确工作。 显然,这里面需要考虑的问…...
【YOLO】YOLOv5原理
概述 YOLOv5的主要架构 Backbone(主干网络):负责提取输入图像的多层次特征 Neck(颈部网络):进行特征融合和多尺度特征处理,通常包含FPN(特征金字塔网络)和PAN࿰…...
uniapp中wx.getFuzzyLocation报错如何解决
一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下: uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度: res.longitude);console.log(当前位置的纬度: r…...
opencv图像直方图
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本直方图计算 // 灰度图直方图 cv::Mat calculateGrayscaleHistogram(const cv::Mat& image) {cv::Mat histogram;int histSize 256; // 灰度级别float range[] {0, 256};const float* histRange …...
OpenCV计算机视觉 03 椒盐噪声的添加与常见的平滑处理方式(均值、方框、高斯、中值)
上一篇文章:OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理 目录 添加椒盐噪声 图像平滑常见处理方式 均值滤波 (blur) 方框滤波 (boxFilter) 高斯滤波 (GaussianBlur) 中值滤波 (medianBlur) 添加椒盐噪声 def add_peppersalt_noise(image, n…...
【嵌入式C语言】内存分布
内存分布 内存分布图内存的属性:只读空间只读空间的特点编程注意事项 栈空间栈的工作原理栈的特点栈溢出与堆的区别 堆空间堆的特点内存分配函数内存泄漏总结 内存分布图 内存的属性: 在C语言中,内存的属性主要取决于它是如何分配的以及它在…...
【brainpan靶场渗透】
文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP:192.168.20.146 靶机 IP:192.168.20.155 二、信息收集 似乎开放了9999,10000端口,访问页面没有太多内容,扫描一下目录 dirs…...
Java实现观察者模式
一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...
通过百度api处理交通数据
通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...
探索CSDN博客数据:使用Python爬虫技术
探索CSDN博客数据:使用Python爬虫技术 在数字化的浪潮中,数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台,汇聚了海量的技术博客与文章,成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…...
b站ip属地评论和主页不一样怎么回事
在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…...
如何查看服务器内存占用情况?
如何查看服务器的内存占用情况?你知道内存使用情况对服务器性能的重要性吗?内存是服务器运行的核心资源之一,了解内存的占用情况可以帮助你优化系统性能。 要查看服务器的内存占用情况,首先需要确定你使用的是哪种操作系统。不同…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
