微服务学习(1):RabbitMQ的安装与简单应用

目录

RabbitMQ是什么

为什么要使用RabbitMQ

RabbitMQ的安装

RabbitMQ架构及其对应概念

队列的主要作用

交换机的主要作用

RabbitMQ的应用

通过控制面板操作(实现收发消息)


RabbitMQ是什么

RabbitMQ是一个开源的消息队列软件(消息代理),实现了高级消息队列协议(AMQP)。它允许不同应用系统之间、以及分散系统中的各个组件之间通过消息传递进行通信和数据交换,从而实现松耦合的系统设计。RabbitMQ支持多种消息协议,易于在分布式系统中使用,具有高可用性和可扩展性。

为什么要使用RabbitMQ

使用RabbitMQ在项目中,主要是为了优化系统间通信的方式,特别是在处理同步调用和异步调用时具有明显的优势。

  1. 提高系统的响应速度:对于一些不需要立即返回结果的操作,通过RabbitMQ实现异步调用可以显著减少用户的等待时间。例如,用户注册成功后发送欢迎邮件,这类操作可以通过消息队列异步执行,避免了同步等待导致的延迟。

  2. 解耦系统组件:通过消息队列,生产者(发送方)和消费者(接收方)之间实现了松耦合。这意味着它们可以独立地扩展和修改,而不会互相影响。比如订单系统与库存系统,通过RabbitMQ进行交互,即使将来库存系统的接口发生变化,只要消息格式不变,订单系统无需做任何修改。

  3. 增强系统的可靠性和稳定性:当使用同步调用时,如果被调用的服务不可用,则可能导致整个流程失败。而使用RabbitMQ进行异步调用,消息可以先存储在队列中,待服务恢复后再进行处理,从而提高了系统的容错能力。

  4. 支持负载均衡和扩展性:RabbitMQ允许同一类型的消息被多个消费者消费,这样可以根据实际需要动态增加或减少消费者来应对不同的负载情况,实现资源的有效利用。

RabbitMQ的安装

基于Docker来安装RabbitMQ,使用下面的命令即可:

java 复制代码
docker run \
 -e RABBITMQ_DEFAULT_USER=mqtest \
 -e RABBITMQ_DEFAULT_PASS=123456 \
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3.8-management

安装命令中有两个映射的端口:

15672:RabbitMQ提供的管理控制台的端口

5672:RabbitMQ的消息发送处理接口

安装完成后,启动RabbitMQ

java 复制代码
docker start mq

docker logs -f mq

我们访问 http://192.168.12.101:15672即可看到管理控制台。(注意:填写你自己的虚拟机地址)

首次访问需要登录,默认的用户名(mqtest)和密码(123456)在配置文件中,可以修改。

登录后页面如图所示:

RabbitMQ架构及其对应概念

RabbitMQ对应的架构如图:

publisher:生产者,也就是发送消息的一方

consumer:消费者,也就是消费消息的一方

queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理

exchange:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。

virtual host:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange、queue

队列的主要作用

消息存储:队列是存储消息的地方。生产者将消息发送到队列中,消费者从队列中读取消息进行处理。

保证消息顺序:在一个队列内部,消息的处理遵循先进先出(FIFO)原则,确保了消息被按照发送的顺序消费。

负载均衡:当有多个消费者订阅同一个队列时,队列可以实现负载均衡的功能,即每个消息只会被一个消费者接收并处理,从而分散工作负载。

交换机的主要作用

路由选择:交换机决定了消息应该被发送到哪些队列。它根据一定的规则(例如消息的路由键和绑定到交换机的队列的绑定键之间的匹配关系)来决定消息的去向。

直连交换机(Direct Exchange):通过精确匹配路由键将消息路由到队列。

扇形交换机(Fanout Exchange):忽略路由键,将消息广播给所有绑定到该交换机的队列。

主题交换机(Topic Exchange):允许使用通配符对路由键进行模式匹配,以更灵活的方式路由消息。

RabbitMQ的应用

通过控制面板操作(实现收发消息)

(1)我们打开Queues选项卡,新建一个队列:填写name,然后点击Add queue.

(2)点击Exchanges选项卡,点击amq.fanout交换机,进入交换机详情页,然后点击Bindings菜单,在表单中填写要绑定的队列名称,点击Bind。

(3)再次回到exchange页面,找到刚刚绑定的amq.fanout,点击进入详情页,再次发送一条消息:

回到Queues页面,可以发现hello.queueTest中已经有一条消息了,点击队列名称,进入详情页,查看队列详情,这次我们点击get message,可以看到消息到达队列了。

解读:实现交换机发送信息到绑定的队列上了。

相关推荐
encoding-console21 分钟前
Centos7部署k8s(单master节点安装)
docker·云原生·容器·kubernetes·部署·集群·centos7
reddingtons1 小时前
在 Ubuntu 下通过 Docker 部署 Caddy 和 PHP-FPM 服务器
服务器·ubuntu·docker
酥暮沐2 小时前
Docker 学习(一)
运维·docker·容器
charlie1145141912 小时前
从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构
嵌入式硬件·学习·架构·教程·imx6ull
gentle coder3 小时前
【MQ】RabbitMq的可靠性保证
java·分布式·rabbitmq
hzj63 小时前
极简RabbitMQ快速学习
分布式·学习·rabbitmq
道法自然,人法天4 小时前
RabbitMQ——消息发送的双重保障机制
分布式·rabbitmq
web_132334214364 小时前
深入解析HDFS:定义、架构、原理、应用场景及常用命令
hadoop·hdfs·架构
wy02_4 小时前
【微服务】优惠券(有限)秒杀的实现思路--使用Redis预扣减优惠券库存,结合Redisson锁保证并发安全,通过异步消息队列更新数据库库存
数据库·redis·微服务
智慧城市20304 小时前
228页PPT丨制造业核心业务流程优化咨询全案(战略营销计划生产研发质量),附核心系统集成架构技术支撑体系,2月26日资料已更新
架构