👨🏻💻 热爱摄影的程序员
👨🏻🎨 喜欢编码的设计师
🧕🏻 擅长设计的剪辑师
🧑🏻🏫 一位高冷无情的编码爱好者
大家好,我是 DevOps 工程师
欢迎分享 / 收藏 / 赞 / 在看!
这篇 RabbitMQ 教程为学习者提供了全面的内容,从 RabbitMQ 的简介开始,涵盖了消息中间件的概念、RabbitMQ 的安装与使用,以及交换机、队列、路由键等相关概念的介绍。进一步深入,教程探讨了 AMQP 协议、客户端开发向导,以及消息的发送和消费方式。同时,学习者还可以了解消息传输保障、高级特性如死信队列、延迟队列、优先级队列、RPC 实现等。此外,教程还涵盖了 RabbitMQ 的管理、配置、运维、监控和集群管理等重要主题,帮助学习者充分掌握 RabbitMQ 的应用。整篇教程丰富内容详实,适合初学者和有经验的开发者参考学习。
全篇共 11 章,9 万余字。本文:第1章 RabbitMQ 简介。
第1章 RabbitMQ 简介
1.1 什么是消息中间件
消息中间件是一种用于解决分布式系统中消息传递和通信问题的软件解决方案。它允许不同的应用程序之间通过发送和接收消息来进行通信,而不需要直接依赖于彼此的地址或连接细节。消息中间件提供了解耦、可靠性、可扩展性和灵活性等优点,使得系统之间的消息通信更加可靠和高效。
1.2 消息中间件的作用
消息中间件的作用是在分布式系统中实现异步通信,将消息从一个应用程序发送到另一个应用程序,从而解耦了系统之间的依赖关系。它可以帮助应用程序实现解耦、削峰填谷、消息积压、任务调度、事件发布和订阅等功能。通过消息中间件,应用程序可以更加灵活、可扩展和高效地进行通信。
1.3 RabbitMQ 的起源
RabbitMQ 是一种开源的消息中间件软件,最初由 LShift(一家英国公司)开发,并在 2007 年开始开源。它是使用 Erlang 语言编写的,底层基于 AMQP(高级消息队列协议)标准。RabbitMQ 的设计目标是提供可靠、灵活、可扩展和高性能的消息传递机制,以满足各种不同应用场景的需求。
1.4 RabbitMQ 的安装及简单使用
1.4.1 Docker 安装 RabbitMQ
RabbitMQ - download
输入以下命令运行 RabbitMQ 容器
docker run \
--name rabbitmq-common \
-p 5672:5672 -p 15672:15672 \
-d rabbitmq:3.12-management
进入容器,开启管理插件
docker exec -it rabbitmq-common /bin/bash
rabbitmq-plugins enable rabbitmq_management
浏览器输入以下地址访问管理界面,初始用户名和密码都是 guest
http://localhost:15672
1.4.2 生产和消费消息
使用 RabbitMQ 的客户端代码,实现消息的生产和消费。生产者将消息发送到队列中,而消费者则从队列中接收和处理消息。
导入 AMQP 依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
</dependency>
生产者
public class Producter {
// 队列名称
public static final String QUEUE_NAME = "queue_01";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ地址
factory.setHost("127.0.0.1");
// 设置RabbitMQ端口号
factory.setPort(5672);
// 设置用户名
factory.setUsername("guest");
// 设置密码
factory.setPassword("guest");
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个信道
Channel channel = connection.createChannel();
// 声明一个队列
// 参数1:队列名称,参数2:是否持久化(默认存储在内存中,不持久化,存入磁盘中即持久化),参数3:是否独占队列(为 true 即多个消费者可以消费),参数4:是否自动删除队列,参数5:其他参数
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 发送消息到队列中
String message = "Hello RabbitMQ";
// 参数1:交换机名称,参数2:队列映射的路由key,参数3:消息的其他属性,参数4:消息体
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("Producter Send +'" + message + "'");
}
}
在 Web 控制台可以看到我们定义的队列名称
消费者
public class Consumer {
// 队列名称
public static final String QUEUE_NAME = "queue_01";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ地址
factory.setHost("127.0.0.1");
// 设置RabbitMQ端口号
factory.setPort(5672);
// 设置用户名
factory.setUsername("guest");
// 设置密码
factory.setPassword("guest");
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个信道
Channel channel = connection.createChannel();
// 消费者关联队列
// 参数1:队列名称,参数2:是否自动确认消息(true 表示自动确认消息),参数3:接收消息并处理的回调方法,参数4:取消消息时的回调方法
channel.basicConsume(QUEUE_NAME, true, (consumerTag, message) -> {
// consumerTag:消费者标签,message:消息
// 接收消息并处理
System.out.println("Consumer Receive +'" + new String(message.getBody()) + "'");
}, consumerTag -> {
// consumerTag:消费者标签
// 取消消息时执行
System.out.println("Consumer Canceled");
});
}
}
在 Web 控制台可以看到消费者已经消费了队列上的消息
1.5 小结
本章介绍了 RabbitMQ 的简介,包括消息中间件的概念、RabbitMQ 的起源和安装,以及简单的消息生产和消费操作。下一章将深入了解 RabbitMQ 的相关概念及其运转流程。