当前位置: 首页 > news >正文

RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)

四、RabbitMQ 配置

4.1 用户及权限管理

在 RabbitMQ 中,用户管理是保障系统安全和正常运行的重要环节。通过合理的用户及权限设置,可以确保不同的应用或服务在使用 RabbitMQ 时,只能访问其被授权的资源,避免非法操作和数据泄露。

在 Linux 系统下,使用命令行进行用户管理十分便捷。例如,要创建一个新用户 “testuser” 并设置密码为 “testpassword”,可以在命令行中执行:

 

sudo rabbitmqctl add_user testuser testpassword

执行上述命令后,系统会在 RabbitMQ 中创建一个名为 “testuser” 的用户,并设置其密码为 “testpassword” 。如果需要修改该用户的密码,可使用如下命令:

 

sudo rabbitmqctl change_password testuser newpassword

这里将 “testuser” 的密码修改为 “newpassword” 。若要删除这个用户,执行:

 

sudo rabbitmqctl delete_user testuser

RabbitMQ 定义了多种用户角色,每个角色具有不同的权限范围。

  • none:该角色没有任何权限,也无法登录到 Web 管理界面,通常用于一些仅作为消息生产者或消费者,不需要管理权限的场景。
  • management:普通管理员角色,可以查看自己的相关节点信息,列出自己可以通过 AMQP 登录的虚拟机,查看自己虚拟机节点中的队列(queues)、交换机(exchanges)和绑定关系(bindings)信息,还能查看和关闭自己的通道(channels)和连接(connections),以及查看有关自己虚拟机节点的统计信息,包括其他用户在该节点的活动信息。比如,一个应用服务仅需要管理自己创建的队列和交换机,就可以赋予该应用对应的用户 “management” 角色。
  • policymaker:策略制定者角色,在 “management” 角色的基础上,还可以管理(创建、删除)自己的虚拟机节点和参数信息,能够查看和创建、删除自己虚拟主机所属的策略(policies)和参数(parameters)信息 。适用于需要对某些虚拟主机进行策略配置和管理的用户。
  • monitoring:监控者角色,包含 “management” 角色的所有权限,并且可以罗列出所有虚拟主机,包括不能登录的虚拟主机,查看其他用户的连接(connections)和通道(channels)使用情况,以及查看所有虚拟主机的全局统计信息。常用于系统监控和运维人员,以便全面了解系统的运行状态。
  • administrator:超级管理员角色,拥有最高权限,可以创建和删除虚拟主机,可以查看、创建和删除用户,查看创建权限(permissions),关闭所有用户的连接。在生产环境中,一般只有少数关键人员拥有这个角色权限,用于系统的核心管理和配置。

通过以下命令可以为用户设置角色标签,例如将 “testuser” 设置为 “administrator” 角色:

 

sudo rabbitmqctl set_user_tags testuser administrator

4.2 虚拟主机管理

虚拟主机(Virtual Host)是 RabbitMQ 中的一个重要概念,它类似于操作系统中的命名空间,用于隔离不同应用之间的消息队列、交换机和绑定关系。每个虚拟主机都有自己独立的权限和配置,不同虚拟主机之间的资源相互隔离,互不干扰。这样可以在同一个 RabbitMQ 服务器上为多个不同的应用提供服务,确保各个应用的数据和操作的安全性和独立性。

在 Linux 系统中,可以使用命令行对虚拟主机进行管理。创建一个名为 “testvhost” 的虚拟主机,执行:

 

sudo rabbitmqctl add_vhost testvhost

如果需要删除这个虚拟主机,使用:

 

sudo rabbitmqctl delete_vhost testvhost

要查看当前系统中所有的虚拟主机,执行:

 

sudo rabbitmqctl list_vhosts

为了让用户能够访问特定的虚拟主机,还需要为用户分配虚拟主机权限。假设已经创建了用户 “testuser” 和虚拟主机 “testvhost”,要为 “testuser” 分配 “testvhost” 的所有权限(配置、读、写),执行:

 

sudo rabbitmqctl set_permissions -p testvhost testuser ".*" ".*" ".*"

这里的三个 “.*” 分别表示用户在所有资源上拥有可配置权限(如创建 / 删除消息队列、创建 / 删除交换机等)、可写权限(如发送消息)和可读权限(如消息消费、清空队列等) 。如果要查看 “testvhost” 上所有用户的权限信息,执行:

 

sudo rabbitmqctl list_permissions -p testvhost

若要查看 “testuser” 的权限信息,执行:

 

sudo rabbitmqctl list_user_permissions testuser

如果需要清除 “testuser” 在 “testvhost” 上的权限,执行:

 

sudo rabbitmqctl clear_permissions -p testvhost testuser

通过合理的用户及权限管理以及虚拟主机管理,可以根据不同应用的需求,精细地控制对 RabbitMQ 资源的访问,提高系统的安全性和稳定性,为后续的消息队列使用打下坚实的基础。

五、HelloWorld 实践

5.1 开发环境搭建

以 Java 开发环境为例,假设你使用 Maven 来管理项目依赖。首先,打开项目的pom.xml文件,在<dependencies>标签内添加 RabbitMQ 的 Java 客户端依赖:

 

<dependency>

<groupId>com.rabbitmq</groupId>

<artifactId>amqp-client</artifactId>

<version>5.14.2</version>

</dependency>

添加上述依赖后,Maven 会自动从中央仓库下载amqp-client及其相关依赖包。下载完成后,你就可以在项目中使用 RabbitMQ 的 Java API 进行开发了。

5.2 生产者代码实现

生产者的主要职责是创建连接和通道,声明队列,并向队列发送消息。下面是一个简单的 Java 生产者代码示例:

 

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

public class Producer {

// 队列名称

private final static String QUEUE_NAME = "hello_world_queue";

public static void main(String[] args) throws IOException, TimeoutException {

// 创建连接工厂

ConnectionFactory factory = new ConnectionFactory();

// 设置RabbitMQ服务器地址,这里假设是本地服务器

factory.setHost("localhost");

// 设置连接端口,RabbitMQ默认端口为5672

factory.setPort(5672);

// 设置用户名,默认用户名是guest

factory.setUsername("guest");

// 设置密码,默认密码是guest

factory.setPassword("guest");

// 使用try-with-resources语句来管理连接和通道,确保资源自动关闭

try (Connection connection = factory.newConnection();

Channel channel = connection.createChannel()) {

// 声明队列

// 参数1:队列名称

// 参数2:是否持久化,true表示队列会在RabbitMQ重启后依然存在

// 参数3:是否独占,true表示该队列只允许当前连接访问

// 参数4:是否自动删除,true表示当所有消费者断开连接后,队列自动删除

// 参数5:其他参数,这里设置为null

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

// 要发送的消息内容

String message = "Hello, RabbitMQ!";

// 发送消息

// 参数1:交换机名称,这里使用默认交换机,为空字符串

// 参数2:路由键,这里设置为队列名称

// 参数3:其他属性,这里设置为null

// 参数4:消息内容,转换为字节数组发送

channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));

System.out.println(" [x] Sent '" + message + "'");

}

}

}

在这段代码中,首先创建了一个ConnectionFactory对象,并配置了连接 RabbitMQ 服务器所需的参数,如主机地址、端口、用户名和密码。然后通过factory.newConnection()方法建立与 RabbitMQ 服务器的连接,再通过connection.createChannel()方法创建一个通道。接着使用channel.queueDeclare()方法声明一个队列,如果队列已经存在,该方法不会重复创建。最后使用channel.basicPublish()方法将消息发送到指定的队列中。

5.3 消费者代码实现

消费者的主要任务是建立连接和通道,声明队列,并定义一个回调函数来处理接收到的消息。以下是 Java 消费者的代码示例:

 

import com.rabbitmq.client.*;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

public class Consumer {

// 队列名称,必须与生产者使用的队列名称一致

private final static String QUEUE_NAME = "hello_world_queue";

public static void main(String[] args) throws IOException, TimeoutException {

// 创建连接工厂

ConnectionFactory factory = new ConnectionFactory();

// 设置RabbitMQ服务器地址

factory.setHost("localhost");

// 设置连接端口

factory.setPort(5672);

// 设置用户名

factory.setUsername("guest");

// 设置密码

factory.setPassword("guest");

// 建立连接

Connection connection = factory.newConnection();

// 创建通道

Channel channel = connection.createChannel();

// 声明队列,确保队列存在

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

// 定义消息回调处理逻辑

DeliverCallback deliverCallback = (consumerTag, delivery) -> {

// 将接收到的消息字节数组转换为字符串

String message = new String(delivery.getBody(), "UTF-8");

System.out.println(" [x] Received '" + message + "'");

};

// 订阅队列并启动消费

// 参数1:队列名称

// 参数2:是否自动确认消息,true表示消息被接收后自动确认,RabbitMQ会立即从队列中删除该消息;false表示需要手动确认

// 参数3:消息回调函数

channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});

}

}

在这段代码中,同样先创建了ConnectionFactory并配置连接参数,建立连接和创建通道。然后声明队列,确保消费者与生产者操作的是同一个队列。接着定义了一个DeliverCallback接口的实现,用于处理接收到的消息。最后通过channel.basicConsume()方法开始消费队列中的消息,当有新消息到达队列时,会调用定义的回调函数来处理消息。

5.4 运行与测试

  1. 运行生产者:在开发工具(如 IntelliJ IDEA、Eclipse 等)中,直接运行Producer类的main方法。运行后,控制台会输出[x] Sent 'Hello, RabbitMQ!',表示生产者已经成功将消息发送到 RabbitMQ 的队列中。
  1. 运行消费者:同样在开发工具中运行Consumer类的main方法。运行后,消费者会开始监听队列中的消息。当生产者发送消息后,消费者的控制台会输出[x] Received 'Hello, RabbitMQ!',这表明消费者已经成功从队列中接收到生产者发送的消息。

通过以上步骤,你已经成功实现了 RabbitMQ 的 HelloWorld 示例,验证了消息的发送和接收功能。在实际应用中,可以根据业务需求进一步扩展和优化生产者和消费者的逻辑,例如添加消息持久化、错误处理、事务等功能,以满足更复杂的业务场景。

六、总结与展望

通过本文的学习,我们对 RabbitMQ 有了一个较为全面的初步认识。从 RabbitMQ 的概念入手,了解到它在分布式系统中作为消息队列的重要作用,实现了服务解耦、异步处理和流量削峰等关键功能。在安装与配置环节,我们详细学习了在 Windows 和 Linux 系统下安装 Erlang 和 RabbitMQ 的步骤,以及开启 Web 管理插件、进行用户及权限管理、虚拟主机管理等重要配置操作 ,这些是使用 RabbitMQ 的基础。

在 HelloWorld 实践部分,我们以 Java 为例,成功搭建了开发环境,实现了生产者和消费者的代码编写,并进行了运行与测试,验证了消息的发送和接收功能,迈出了使用 RabbitMQ 进行应用开发的第一步。

然而,RabbitMQ 的强大之处远不止于此。它还拥有众多高级特性等待我们去探索。比如消息的可靠投递机制,包括 confirm 确认模式和 return 退回模式,这能确保消息在发送过程中不丢失或投递失败;Consumer Ack 消费者手动应答模式,让消费者在处理完消息后向 RabbitMQ 发送 ack,保证消息的消费可靠性 。消费端限流机制可防止消费者因处理能力不足而导致消息过载,TTL(存活时间 / 过期时间)设置能避免消息在队列中长时间滞留,死信队列则可以集中处理无法正常消费的消息,延迟队列可用于实现定时任务、延迟重试等功能。

在实际应用场景中,RabbitMQ 也有着广泛的应用。在电商系统中,它可以用于订单处理、库存管理、物流配送等模块之间的消息通信;在内容发布平台,可用于文章发布后的一系列异步操作,如生成索引、发送推送通知等;在日志处理系统中,能实现日志的异步收集和分析。

未来,随着分布式系统和微服务架构的不断发展,RabbitMQ 的应用前景将更加广阔。希望读者能够基于本文的基础,进一步深入学习 RabbitMQ 的高级特性和应用场景,将其灵活运用到实际项目开发中,提升系统的性能和稳定性。

相关文章:

  • maven项目, idea右上角一直显示gradle的同步标识, 如何去掉
  • Restfull API 风格规则以及特点
  • Unity Image组件无法阻挡手势的解决办法
  • JS逆向实战四:某查查请求头逆向解密
  • 鸿蒙OSUniApp开发富文本编辑器组件#三方框架 #Uniapp
  • STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比
  • 【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
  • ConfigMap 和 Secret 是否支持热更新
  • Screen Mirroring App:轻松实现手机与电视的无缝投屏
  • 【C/C++】深度探索c++对象模型_笔记
  • elasticsearch硬件与资源配置优化
  • Docker 疑难杂症解决指南:从入门到进阶的全面剖析
  • 【leetcode】349. 两个数组的交集
  • 银行卡真伪验证助力金融合规-银行卡实名认证接口
  • 联排半孔PCB如何进行SMT贴片?
  • MySQL增删查改进阶
  • Python机器学习笔记(二十二、模型评估-交叉验证)
  • 【消息队列】RabbitMQ基本认识
  • Qml自定义组件之车辆风扇展示
  • TypeScript装饰器:从入门到精通
  • 网约车座椅靠背张贴“差评者得癌症”,如祺出行:未收到投诉无法处理
  • 首个偏头痛急性治疗药物可缓解前期症状
  • 体坛联播|C罗儿子完成国家队首秀,德约结束与穆雷合作
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人
  • 5月12日-14日,上海小升初民办初中进行网上报名