大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
【亲测宝藏】发现一个让 AI 学习秒变轻松的神站!不用啃高数、不用怕编程,高中生都能看懂的人工智能教程来啦!
👉点击跳转,和 thousands of 小伙伴一起用快乐学习法征服 AI,说不定下一个开发出爆款 AI 程序的就是你!
在分布式系统中,服务间的通信往往面临三大挑战:耦合紧密(一个服务故障牵连全链路)、流量波动(峰值请求压垮下游)、同步阻塞(等待响应导致性能损耗)。而消息队列(MQ)作为“异步通信中间商”,完美解决了这些问题——其中RabbitMQ凭借其灵活的路由机制、丰富的功能特性,成为众多开发者的首选。
RabbitMQ是一款开源的AMQP(高级消息队列协议)实现,服务器端基于Erlang语言开发(天生支持高并发和分布式),客户端支持Python、Java、.NET、Go等几乎所有主流编程语言。它的核心优势在于:
官网:http://www.rabbitmq.com/ 入门教程:RabbitMQ官方教程
要掌握RabbitMQ,首先得理清它的“零件”。我们可以把RabbitMQ想象成一个“邮局系统”:生产者是寄件人,消费者是收件人,RabbitMQ则是邮局,负责消息的存储、路由和投递。以下是核心组件的详细解析:
用一个“用户注册”场景举例,完整流程如下:
// 1. 建立连接(通过连接工厂)
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("rabbitmq-host");
factory.setUsername("admin");
factory.setPassword("password");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 2. 声明交换器(类型为Topic,持久化)
channel.exchangeDeclare(
"user.exchange", // 交换器名称
"topic", // 类型
true // 是否持久化
);
// 3. 声明队列(邮件队列,持久化)
channel.queueDeclare(
"email.queue", // 队列名称
true, // 是否持久化
false, // 非排他(多消费者可共享)
false, // 不自动删除
null // 额外参数
);
// 4. 绑定交换器与队列(BindingKey为"user.#",匹配所有user开头的路由键)
channel.queueBind(
"email.queue", // 队列名称
"user.exchange", // 交换器名称
"user.#" // 绑定键
);// 发送"用户注册成功"消息
String message = "{\"userId\":1001, \"username\":\"test\"}"; // 消息体
channel.basicPublish(
"user.exchange", // 目标交换器
"user.register", // 路由键(匹配"user.#")
MessageProperties.PERSISTENT_TEXT_PLAIN, // 持久化消息
message.getBytes()
);
System.out.println("已发送消息:" + message);// 发送"用户注册成功"消息
String message = "{\"userId\":1001, \"username\":\"test\"}"; // 消息体
channel.basicPublish(
"user.exchange", // 目标交换器
"user.register", // 路由键(匹配"user.#")
MessageProperties.PERSISTENT_TEXT_PLAIN, // 持久化消息
message.getBytes()
);
System.out.println("已发送消息:" + message);// 监听队列,自动确认消息(生产环境建议手动确认)
channel.basicConsume(
"email.queue", // 监听的队列
true, // 自动确认(消息处理后通知MQ删除)
(consumerTag, delivery) -> {
String msg = new String(delivery.getBody());
System.out.println("收到消息,发送邮件:" + msg);
// 业务逻辑:调用邮件API发送欢迎邮件
},
consumerTag -> {} // 取消消费的回调
);#拉取镜像
docker pull rabbitmq:management
docker run -d --hostname rabbit_host1 --name ccc_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management#介绍 -d 以守护进程⽅式在后台运⾏ -p 15672:15672 management 界⾯管理访问端⼝ -p 5672:5672 amqp 访问端⼝ –name:指定容器名 –hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的别名,并且将显示在容器的bash中 -e 参数 RABBITMQ_DEFAULT_USER ⽤户名 RABBITMQ_DEFAULT_PASS 密码
通过docker logs查看启动日志

访问自己的ip:15672

输入我们前面的用户名和密码,成功进入管理界面

RabbitMQ凭借灵活的路由机制、强大的隔离性和丰富的功能,成为分布式系统中消息通信的首选工具。掌握核心概念(Exchange类型、信道、虚拟主机)和工作流程,能帮助我们更好地设计异步通信架构,解决服务耦合、流量波动等问题。
后续将深入讲解RabbitMQ的高级特性(持久化、确认机制、死信队列),敬请关注!
觉得有用请点赞收藏! 如果有相关问题,欢迎评论区留言讨论~