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

在现代的分布式系统中,消息队列(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.xdnf.cn/news/33436.html

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

相关文章

字符串函数和内存函数

字符串函数 1、strlcpy 【字符串拷贝】 &#xff08;将原字符串中的字符拷贝到目标字符数组中&#xff0c;包括终止符号\0&#xff0c;并在这里停止&#xff1b;为了避免越界&#xff0c;目标字符串数组应该足够大去接收&#xff09;&#x1f446; &#xff08;返回值是 dest…

【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方

文章目录 机器学习入门&#xff1a;从零开始学习基础与应用前言第一部分&#xff1a;什么是机器学习&#xff1f;1.1 机器学习的定义1.1.1 举个例子&#xff1a;垃圾邮件分类器 1.2 机器学习的核心思想1.2.1 数据驱动的模式提取1.2.2 为什么机器学习比传统方法更灵活&#xff1…

Dataset用load_dataset读图片和对应的caption的一个坑

代码&#xff1a; data_files {} if args.train_data_dir is not None:data_files["train"] os.path.join(args.train_data_dir, "**")dataset load_dataset("imagefolder",data_filesdata_files,cache_dirargs.cache_dir,) 数据&#xff1…

SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)

SpringBoot连接多数据源MySQL、SqlServer等&#xff08;MyBatisPlus测试&#xff09; 在实际的项目开发中&#xff0c;我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源&#xff0c;实例将会使用连接MySQL、SqlSe…

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

认识自定义协议

经过前面的介绍&#xff0c;我们知道TCP/IP协议有一组五层模型&#xff0c;从上往下为应用层、传输层、网络层、数据链路层和物理层&#xff0c;且在网络中传输的数据都必须经过这几层模型的封装和分用&#xff0c;作为程序员&#xff0c;我们最经常打交道的就是应用层。程序员…

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…

电商项目-微服务网关限流

一、微服务网关限流 我们之前说过&#xff0c;网关可以做很多的事情&#xff0c;比如&#xff0c;限流&#xff0c;当我们的系统被频繁的请求 的时候&#xff0c;就有可能将系统压垮&#xff0c;所以为了解决这个问题&#xff0c;需要在每一个微服务中做限流 操作&#xff0c;但…

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…

模拟机器故障

模拟机器故障情况 #!/bin/bashdeclare -a aryfor i in seq 40 49 doary[$i]" "echo -en "\e[$i;5m ${ary[]}\e[;0m"donedeclare -a ary for s in seq 1 10000 dofor i in seq 40 49doary[$i]" "echo -en "\e[$i;5m ${ary[]}\e[;0m" …

创建的空 OpenCV 安卓应用程序以支持摄像头

在本节中&#xff0c;我们将扩展上一节中创建的空 OpenCV 应用程序以支持摄像头。我们将获取摄像头帧并将其显示在屏幕上。 告诉系统我们需要相机权限。将以下代码添加到文件MyApplication/app/src/main/AndroidManifest.xml&#xff1a; <uses-permission android:name&qu…

JAVA 架构师面试 100套含答案:JVM+spring+ 分布式 + 并发编程》...

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

Web3与区块链如何通过智能合约实现自动化生态?

Web3和区块链正在重塑互联网的未来&#xff0c;其核心在于去中心化和用户数据自主权。而作为区块链技术的重要组成部分&#xff0c;智能合约通过自动执行预设规则&#xff0c;大大提升了效率和安全性。本文将探讨Web3与区块链如何通过智能合约实现生态的自动化。 什么是智能合约…

【机器学习】机器学习的基本分类-监督学习-随机森林(Random Forest)

随机森林是一种基于集成学习&#xff08;Ensemble Learning&#xff09;思想的算法&#xff0c;由多个决策树构成。它通过结合多棵决策树的预测结果来提升模型的泛化能力和准确性&#xff0c;同时减少过拟合的风险。 1. 随机森林的核心思想 多样性&#xff1a; 随机森林通过引…

MongoDB集群的介绍与搭建

一.MongoDB集群的介绍 注意&#xff1a;Mongodb是一个比较流行的NoSQL数据库&#xff0c;它的存储方式是文档式存储&#xff0c;并不是Key-Value形式&#xff1b; MongoDB集群的优势主要体现在以下几个方面&#xff1a; (1)高可用性 MongoDB集群支持主从复制和故障转移机制&…

防抖与节流

防抖 当某个事件触发时&#xff0c;等待一段时间再执行函数。如果在这段时间内事件再次被触发&#xff0c;那么就重新计时&#xff0c;换句话说&#xff0c;防抖可以确保函数在事件结束后才被执行&#xff0c;避免了多次触发。 应用场景&#xff1a; 搜索框输入&#xff1a;…

DKMS介绍

文章目录 一、安装DKMS二、DKMS使用示例1. 源码准备2. 增加dkms.conf3. 添加模块4. 编译模块5. 安装模块 三、基于DKMS的deb安装包制作 Dynamic Kernel Module Support&#xff08;DKMS)是一个用于动态管理内核模块的框架&#xff0c;由DELL创建的项目&#xff0c;它可以帮我们…

【LeetCode】498.对角线遍历

无论何时何地&#xff0c;我都认为对于一道编程题&#xff0c;思考解法的时间用于是实际动手解决问题的2倍&#xff01;如果敲键盘编码需要5min&#xff0c;那么思考解法的过程至少就需要10分钟。 1. 题目 2. 思想 其实这就是一道模拟题&#xff0c;难度中等。做这种题的关键就…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…

使用 libssh2_session_set_timeout 设置 SSH 会话超时时间

使用 libssh2_session_set_timeout 设置 SSH 会话超时时间 函数原型参数说明返回值示例代码注意事项libssh2_session_set_timeout 是 libssh2 库中的一个函数,用于设置 SSH 会话的超时时间。这对于防止网络延迟或连接中断导致的长时间挂起非常有用。 函数原型 int libssh2_se…