目录
Windows安装RabbitMQ
环境工具下载
rabbitMQ是Erlang语言开发的所以先下载Erlang;
RabbitMQ官网地址: https://www.rabbitmq.com/
Erlang下载: https://www.erlang.org/downloads
Erlang环境安装
直接运行: otp_win64_23.0.exe 程序一直next即可,如需改变安装位置自行选择,安装完成后对系统环境变量新增ERLANG_HOME地址为:
C:\Program Files\erl-23.0
双击系统变量path,点击“新建”,将%ERLANG_HOME%\bin加入到path中。
win+R键,输入cmd,再输入erl,看到erlang版本号就说明erlang安装成功了。
RabbitMQ安装
直接运行: rabbitmq-server-3.8.8 程序一直next即可,如需改变安装位置自行选择.
RabbitMQ Web管理端安裝
进入安装后的RabbitMQ的sbin目录中(C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.8\sbin)
Cmd命令执行: rabbitmq-plugins enable rabbitmq_managementr
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.8\sbin>rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@LX-P1DMPLUV:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@LX-P1DMPLUV...
Plugin configuration unchanged
常用命令:
# 启动RabbitMQ
rabbitmq-service start
# 停止RabbitMQ
rabbitmq-service stop
# 启用RabbitMQ Web可视化界面插件
rabbitmq-plugins enable rabbitmq_management
# 停用RabbitMQ Web可视化界面插件
rabbitmq-plugins disable rabbitmq_management
# 查看RabbitMQ状态
rabbitmqctl status
访问管理端页面,默认账号密码为: guest
可视化界面: http://127.0.0.1:15672/#/
RabbitMQ新增超级管理员
进入安装后的RabbitMQ的sbin目录中(C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.8\sbin)
<# 创建用户root用户 密码为123456
rabbitmqctl add_user root 123456
# 为该用户分配所有权限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
# 设置该用户为管理员角色
rabbitmqctl set_user_tags root administrator
RabbitMQ特点
RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点:
- 可靠性:支持持久化,传输确认,发布确认等保证了MQ的可靠性。
- 灵活的分发消息策略:在消息进入MQ前由Exchange(交换机)进行路由消息。
- 分发消息策略:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群:多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 多种协议:RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端:RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制:RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
RabbitMQ 3种常用交换机
- Direct Exchange 直连型交换机:根据消息携带的路由键将消息投递给对应队列。
- Fanout Exchange 扇型交换机:这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。
- Topic Exchange 主题交换机:这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的
RabbitMQ 5种常用模式
- Simple Work Queue 简单工作队列:该模式是很少用到的一个场景,一般都会通过Exchange进行消息分配到队列从而为以后扩展预留一个入口。
- Publish/Subscribe 发布订阅模式:该模式性能最好,拿到消息直接放入队列。
- Routing 路由模式:该模式通过routing key 进行全字匹配,匹配上将相关消息放入相关队列。
- Topics 主题模式:该模式通过routng key进行模糊匹配,匹配上将相关信息放入相关队列。
- Header 模式:通过message header头部信息进行比对,可以根据定义全匹配、部分匹配等规则。
RabbitMQ名词解释
- Producer/Publisher:生产者,投递消息的一方。
- Consumer:消费者,接收消息的一方。
- Message消息:实际的数据,如demo中的order订单消息载体。
- Queue队列:是RabbitMQ的内部对象,用于存储消息,最终将消息传输到消费者。
- Exchange交换机:在RabbitMQ中,生产者发送消息到交换机,由交换机将消息路由到一个或者多个队列中
- RoutingKey路由键:生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则。
- Binding绑定:RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确地将消息路由到队列。
MQ适用场景
异步处理场景
如当一个站点新增用户时需要走以下流程:验证账号信息->用户入库->发送注册成功欢迎邮箱给用户;
从该流程中分析用户注册成功后首先期望的是能够成功登录上站点,而对于能否收到注册成功的邮件对于用户而言并不重要,
而邮件发送对于如遇到网络问题可能导致发送邮件缓慢从来导致整个用户注册流程响应很慢;
对于通知邮件发送对于功能而言并不重要的时候,这个时候就可以将该业务放在MQ中异步执行从而可以从一定程度上提升整个流程的性能。
应用解耦
如当一个站点新增用户时需要走以下流程:验证账号信息->用户入库->发送注册成功欢迎邮箱给用户;
通常通过系统划分会划分为:用户模块,消息模块;
以Spring Cloud的为例按照原始做法会在用户入库成功后会通过Feign调用消息模块的发送邮件接口,但是如果消息模块全集群宕机就会导致Feign请求失败从而导致业务不可用;
使用MQ就不会造成上述的问题,因为我们在用户注册完成后想消息模块对应的邮件发送业务队列去发送消息即可,队列会监督消息模块完成,如果完不成队列会一直监督,直到完成为止
流量削峰
秒杀和抢购等场景经常使用 MQ 进行流量削峰。活动开始时流量暴增,用户的请求写入 MQ,超过 MQ 最大长度丢弃请求,业务系统接收 MQ 中的消息进行处理,达到流量削峰、保证系统可用性的目的。
影响:MQ是排队执行的所以对性能有一定的影响,并且请求过多后会导致请求被丢弃问题
消息通讯
点对点或者订阅发布模式,通过消息进行通讯。如微信的消息发送与接收、聊天室等。
SpringBoot中使用RabbitMQ
工程创建&准备
说明该工程按照包区分同时担任生产者与消费者
POM导入依赖:
<dependencies>
<!-- RabbitMQ依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- 导入Web服务方便测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 代码简化工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建SpringBoot启动类:
@SpringBootApplication
public class SimpleRabbitMQCaseApplication {
public static void main(String[] args) {
SpringApplication.