liym 2020-06-07
1。RabbitMQ
MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开 发中应用非常广泛。
开发中消息队列通常有如下应用场景: 1、任务异步处理。 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
2.RabbitMQ的基本结构:
组成部分如下:
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
3.消息发布接收流程:
-----发送消息-----
1、生产者和Broker建立TCP连接。
2、生产者和Broker建立通道。
3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
4、Exchange将消息转发到指定的Queue(队列)
----接收消息-----
1、消费者和Broker建立TCP连接
2、消费者和Broker建立通道
3、消费者监听指定的Queue(队列)
4、当有消息到达Queue时Broker默认将消息推送给消费者。
5、消费者接收到消息。
4.启动RabbitMQ
RabbitMQ Service-install :安装服务
RabbitMQ Service-remove 删除服务
RabbitMQ Service-start 启动
RabbitMQ Service-stop 启动
4.1)安装并运行服务
rabbitmq-service.bat install 安装服务 rabbitmq-service.bat stop 停止服务 rabbitmq-service.bat start 启动服务
4.2)安装管理插件
安装rabbitMQ的管理插件,方便在浏览器端管理RabbitMQ
管理员身份运行 rabbitmq-plugins.bat enable rabbitmq_management
4.3)启动成功 登录RabbitMQ
默认端口:15672
进入浏览器,输入:http://localhost:15672
初始账号和密码:guest/guest
4.4)注意事项:
4.4.1、安装erlang和rabbitMQ以管理员身份运行。
4.4.2、当卸载重新安装时会出现RabbitMQ服务注册失败,此时需要进入注册表清理erlang
5.搭建环境
5.1创建maven工程 创建生产者工程和消费者工程,分别加入RabbitMQ java client的依赖。
test-rabbitmq-producer:生产者工程
test-rabbitmq-consumer:消费者工程
<dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.1.0.RELEASE</version> </dependency> </dependencies>
5.2生产者
5.3消费者
5.4过程
1、发送端操作流程
1)创建连接
2)创建通道
3)声明队列
4)发送消息
2、接收端
1)创建连接
2)创建通道
3)声明队列
4)监听队列
5)接收消息
6.RabbitMQ工作模式
有以下几种工作模式 :
1、Work queues 工作队列 轮巡的模式
2、Publish/Subscribe 发布 / 订阅
3、Routing 路由
4、Topics 通配符
5、Header Header转发器
6、RPC 远程过程调用
6.1 Work queues 工作队列
work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。
应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
测试:
1、使用入门程序,启动多个消费者。
2、生产者发送多个消息。
结果:
1、一条消息只会被一个消费者接收;
2、rabbit采用轮询的方式将消息是平均发送给消费者的;
3、消费者在处理完某条消息后,才会收到下一条消息。
6.2 Publish / subscribe 发布/订阅模式
发布订阅模式:
1、一个生产者将消息发给交换机;
2、与交换机绑定的有多个队列,每个消费者都监听自己的队列;
3、生产者将消息发给交换机,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收 到消息;
4、如果消息爱给没有绑定队列的交换机上,消息将丢失;
6.3 Routing 路由模式
路由模式:
1、一个交换机绑定多个队列,每个队列设置routingKey,并且一个队列可以设置多个routingkey
2、每个消费者监听自己的队列
3、生产者将消息发给交换机,发送消息时,需要指定routingKey的值,由交换机根据routingkey的值和那个队列的routingKey星等,
如果相等,则将消息转发到指定的队列。
具备 发布订阅模式-工作队列模式
6.3 Topics 通配符模式
路由模式:
1、一个交换机可以绑定多个队列,每个队列可以设置一个或者多个带统配符的routingkey。
2、生产者将消息发给交换机,由交换机根据routingkey的值来匹配队列,匹配时采用通配符方式,匹配成功的将消息转发到指定的队列。
符号:# 匹配一个或者多个词,每个词中间以.分割
比如inform.# 可以匹配inform.sms、inform.email、inform.email.sms
inform.#.email.# / inform.#.cms.#
符号:* 只能匹配一个词、
比如inform.* 可以匹配inform.sms、inform.email