快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统

news2025/1/23 4:33:27

在现代的分布式系统中,消息队列(Message Queue)是实现异步通信、解耦系统组件、提高系统可扩展性和可靠性的重要工具。RabbitMQ 是一个广泛使用的开源消息代理软件,它实现了高级消息队列协议(AMQP),并提供了丰富的功能和灵活的配置选项。下面将介绍 RabbitMQ 的基本概念,并详细说明如何使用 Docker 快速安装和运行 RabbitMQ。

在这里插入图片描述

1. RabbitMQ 简介

1.1 什么是 RabbitMQ?

RabbitMQ 是一个开源的消息代理软件,它支持多种消息协议,包括 AMQP(Advanced Message Queuing Protocol)、MQTT、STOMP 等。RabbitMQ 的主要功能是接收、存储和转发消息,使得不同的应用程序可以通过消息队列进行异步通信。

1.2 RabbitMQ 的核心概念

  1. Producer(生产者):发送消息的应用程序。
  2. Consumer(消费者):接收消息的应用程序。
  3. Queue(队列):存储消息的缓冲区。生产者将消息发送到队列,消费者从队列中接收消息。
  4. Exchange(交换机):决定消息如何路由到队列。RabbitMQ 提供了多种类型的交换机,如 direct、topic、fanout 和 headers。
  5. Binding(绑定):定义了交换机和队列之间的关系,决定了消息如何从交换机路由到队列。
  6. Channel(信道):在连接内部建立的虚拟连接,用于发送和接收消息。
  7. Connection(连接):应用程序与 RabbitMQ 之间的 TCP 连接。

1.3 RabbitMQ 的优势

  • 异步通信:RabbitMQ 允许生产者和消费者异步工作,提高系统的响应速度和吞吐量。
  • 解耦系统:通过消息队列,不同的系统组件可以独立开发和部署,减少系统间的耦合。
  • 可扩展性:RabbitMQ 支持集群和负载均衡,可以轻松扩展以处理更多的消息。
  • 可靠性:RabbitMQ 提供了持久化、消息确认、事务等机制,确保消息的可靠传递。

2. 使用 Docker 安装 RabbitMQ

Docker 是一个开源的容器化平台,它可以将应用程序及其依赖项打包到一个轻量级的容器中,使得应用程序可以在任何环境中一致地运行。使用 Docker 安装 RabbitMQ 可以简化部署过程,避免复杂的依赖关系和环境配置问题。

2.1 拉取 RabbitMQ Docker 镜像

Docker Hub 上提供了官方的RabbitMQ镜像,我们可以直接拉取并使用它。

docker pull rabbitmq:3-management

rabbitmq:3-management 是带有管理插件的 RabbitMQ 镜像,它包含了 RabbitMQ 的管理界面,方便我们进行管理和监控。

2.2 运行 RabbitMQ 容器

拉取镜像后,我们可以使用以下命令运行 RabbitMQ 容器:

docker run -d --name=rabbitmq --restart=always -p 5672:5672 -p 15672:15672 rabbitmq:3-management
  • -d:以 detached 模式运行容器,即在后台运行。
  • --name=rabbitmq:为容器指定一个名称 rabbitmq
  • --restart=always:设置容器在系统重启后自动启动,除非手动停止。
  • -p 5672:5672:将容器的 5672 端口(AMQP 端口)映射到主机的 5672 端口。
  • -p 15672:15672:将容器的 15672 端口(管理界面端口)映射到主机的 15672 端口。

2.3 访问 RabbitMQ 管理界面

容器启动后,你可以通过浏览器访问 RabbitMQ 的管理界面:

http://192.168.200.138:15672/#/

默认的用户名和密码是 guestguest。你可以通过管理界面查看队列、交换机、连接等信息,并进行配置和管理。

在这里插入图片描述

2.4 使用 RabbitMQ

现在,你已经成功安装并运行了 RabbitMQ。你可以使用各种编程语言的客户端库(如 Python 的 pika、Java 的 RabbitMQ Java Client 等)来连接 RabbitMQ,并发送和接收消息。

以下是一个简单的 Java 示例:

2.4.1 使用 Maven 管理依赖

如果你使用 Maven 来管理项目依赖,可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.20.0</version>
</dependency>
2.4.2 编写 Java 程序发送消息

接下来,我们将编写一个简单的 Java 程序,使用 RabbitMQ 发送消息。

创建生产者类

创建一个名为 RabbitMQProducer.java 的 Java 类,并编写以下代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQProducer {

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.200.138");
        factory.setPort(5672);
        factory.setVirtualHost("/test");
        factory.setUsername("test");
        factory.setPassword("test");

        // 创建连接和信道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        try {
            // 声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            // 发送消息
            String message = "Hello, RabbitMQ!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        } finally {
            // 关闭通道和连接
            channel.close();
            connection.close();
        }
    }
}
2.4.3 代码解释
  1. 连接工厂ConnectionFactory 用于创建与 RabbitMQ 的连接。我们设置了连接的主机地址、端口、虚拟主机、用户名和密码。
  2. 连接和信道:通过 factory.newConnection() 创建连接,并通过 connection.createChannel() 创建信道。
  3. 声明队列:使用 channel.queueDeclare() 声明一个名为 hello 的队列。如果队列不存在,RabbitMQ 会自动创建它。
  4. 发送消息:使用 channel.basicPublish() 方法将消息发送到队列。消息的内容是字符串 "Hello, RabbitMQ!"
  5. 关闭信道和连接:在 finally 块中关闭信道和连接,确保资源被正确释放。
2.4.4 运行程序

编译并运行 RabbitMQProducer 类。如果一切正常,你将在控制台看到以下输出:

 [x] Sent 'Hello, RabbitMQ!'

在这里插入图片描述

2.4.5 验证消息

你可以通过 RabbitMQ 的管理界面来验证消息是否成功发送。访问 http://192.168.200.138:15672/#/,使用默认的用户名和密码 guest 登录,然后在管理界面中查看队列 hello 中的消息。

在这里插入图片描述

3. 总结

RabbitMQ 是一个功能强大且灵活的消息代理软件,适用于各种分布式系统中的异步通信需求。通过 Docker,我们可以快速、一致地部署和管理 RabbitMQ,避免了复杂的依赖关系和环境配置问题。希望本文能够帮助你快速上手 RabbitMQ,并在实际项目中发挥其强大的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…

UE5 像素流进行内网https证书创建

确定证书需求 内网 HTTPS 通信通常需要以下内容&#xff1a; 自签名证书&#xff08;适用于内网环境&#xff0c;不需要通过公开的证书颁发机构 CA&#xff09; 或者通过内部的企业 CA 签发的证书&#xff08;更安全&#xff09;。 生成自签名证书 使用工具&#xff08;如 Ope…

44页PDF | 信息化战略规划标准框架方法论与实施方法(限免下载)

一、前言 这份报告详细介绍了企业信息化战略规划的标准框架、方法论以及实施方法&#xff0c;强调了信息化规划应以业务战略和IT战略为驱动力&#xff0c;通过构筑企业架构&#xff08;EA&#xff09;来连接长期战略和信息化建设。报告提出了信息化规划原则&#xff0c;探讨了…

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

任务管理法宝:甘特图详解

在项目管理中&#xff0c;如何清晰、直观地展示项目的进度和任务分配&#xff1f; 甘特图作为一种经典的项目管理工具&#xff0c;提供了有效的解决方案。无论是团队合作还是个人项目管理&#xff0c;甘特图都能帮助你轻松追踪各项任务的进展。今天&#xff0c;我们将详细介绍…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

PyQt 中的无限循环后台任务

在 PyQt 中实现一个后台无限循环任务&#xff0c;需要确保不会阻塞主线程&#xff0c;否则会导致 GUI 无响应。常用的方法是利用 线程&#xff08;QThread&#xff09; 或 任务&#xff08;QRunnable 和 QThreadPool&#xff09; 来运行后台任务。以下是一些实现方式和关键点&a…

云计算vsphere 服务器上添加主机配置

这里是esxi 主机 先把主机打开 然后 先开启dns 再开启 vcenter 把每台设备桌面再vmware workstation 上显示 同上也是一样 &#xff0c;因为在esxi 主机的界面可能有些东西不好操作 我们选择主机和集群 左边显示172.16.100.200

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

Envoy-istio

最近研究envoy-istio&#xff0c;发现这个博客&#xff0c;觉得很不错&#xff0c;这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七&#xff1a;envoy的http流量管理基础 envoy部分六&#xff1a;envoy的集群管理 envoy部分五&#xff…

甘特图的绘制步骤:教你如何绘制甘特图

甘特图是项目管理中一种极为重要的可视化工具&#xff0c;它以直观的方式展示项目进度&#xff0c;包括任务的开始时间、结束时间、持续时长以及任务之间的先后顺序。在当今的项目管理领域&#xff0c;Excel 和专业的项目管理软件是制作甘特图的两大常用途径&#xff0c;它们各…

C++模拟堆

模板题目 图片来源Acwing 堆的基础知识 代码实现 #include<iostream> #include<algorithm>using namespace std;const int N 1e5 10; int a[N]; int n, m;void down(int u) {int t u;if (2 * u < n && a[2 * u] < a[u]){t 2 * u;}if (2 * u …

牛客linux

1、 统计文件的行数 # 方法 1 wc -l ./nowcoder.txt | awk {print $1} # 方法 2 &#xff0c;awk 可以打印所有行的行号, 或者只打印最后一行 awk {print NR} ./nowcoder.txt |tail -n 1 awk END{print NR} ./nowcoder.txt # 方法 3 grep -c 、-n等等 grep -c "" ./…

【unity小技巧】在 Unity 中,Application获取各种文件路径或访问不同类型的存储路径

文章目录 前言1. **Application.persistentDataPath**2. **Application.dataPath**3. **Application.streamingAssetsPath**4. **Application.temporaryCachePath**5. **Application.consoleLogPath**6. **Application.userDataPath**7. **Application.streamingAssetsPath 与 …

汇编语言学习-二

好吧&#xff0c;已经隔了两天&#xff0c;下完班看了两天&#xff0c;在电脑上装了虚拟机版的MS_DOS,主要是怕折腾坏我的电脑系统&#xff1b; 这个第二天应该是称为第二章更为合适&#xff0c;目前第二章已经看完&#xff0c;基本的命令也是敲了敲&#xff1b; 下面就进行一…

游戏引擎学习第33天

仓库: https://gitee.com/mrxiao_com/2d_game 位置表示的回顾 在之前的工作中&#xff0c;已经实现了将单位从像素空间转移到真实的空间&#xff0c;这样可以确保所有的动作和物体都按米为单位来进行。这个转变让游戏中的物体不再是基于像素的&#xff0c;而是按照真实世界的…

泷羽sec-burp(3)decodor comparer logger模块使用 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

vue-cli创建项目报错:command failed: npm install --loglevel error

网上解决方法有很多&#xff0c;对于我都没用。 最后用这个方法起了作用&#xff1a; 尝试将npm源设置为HTTP&#xff0c;慎用&#xff0c;可能不安全 npm config set registry http://registry.npm.taobao.org/ 改为http就顺利创建项目了。

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《船舶物资与市场》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《船舶物资与市场》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国船舶集团有限公司 主办单…

超详细MacBook Pro(M1)配置GO语言环境(图文超详细版)

前提 当我第一次使用MacBook配置Go语言环境时&#xff0c;网上的资料错综复杂&#xff0c;部分资料对于第一次使用MacBook的小白们非常不友好&#xff0c;打开终端时&#xff0c;终端的位置对应的访达中的位置不是很清楚&#xff0c;因此才有了这篇文章&#xff0c;该文章通过…