RabbitMQ概念,安装及整合springboot

1.MQ的基本概念

1.1什么是MQ

  • MQ(Message Queue):消息队列,是基础数据结构中“先进先出”的一种数据机构通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取信息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接受,没有业务逻辑的侵入,轻松的实现系统的解耦,别名为“消息中间件”,通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。

1.2常见MQ的认识及比较

比较常见及主流的消息中间件有ActiveMQ、RabbitMQ,Kafka、RocketMQ等

  • ActiveMQ:Apache出品,能力强劲的开源消息总线,它是一个完全支持JMS规范的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎
  • Kafka:Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache*项目,Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务
  • RocketMQ:阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式应用系统的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个copy,它对消息的可靠传输及事务性做了优化,被广泛应用于交易、充值、流计算、消息推送、日志流式处理等场景
  • RabbitMQ:它是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP主要特征是面向消息、队列、路由、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求在其次。RabbitMQ比Kafka可靠性高,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性、可靠性要求稍低的场景使用比如ELK日志收集

1.3AMQP和JMS

  • AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。
  • JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

两者的区别:

JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式

JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。

JMS规定了两种消息模式;而AMQP的消息模式更加丰富

2.RabbitMQ的安装

2.1下载Erlang的rpm包

RabbitMQ是Erlang语言编写,所以Erang环境必须要有,注:Erlang环境一定要与RabbitMQ版本匹配:https://www.rabbitmq.com/which-erlang.html

Erlang下载地址:https://packagecloud.io/rabbitmq/erlang/(根据自身需求及匹配关系,下载对应rpm包),不过这个地址下载特别慢,另外一个下载地址:https://www.erlang-solutions.com/resources/download.html

2.2下载RabbitMQ的rpm包

RabbitMQ下载地址:https://www.rabbitmq.com/releases/rabbitmq-server/(根据自身需求及匹配关系,下载对应rpm包)

2.3下载socat的rpm包

rabbitmq安装依赖于socat,所以需要下载socat。socat下载地址:http://repo.iotti.biz/CentOS/6/x86_64/socat-1.7.3.2-1.el6.lux.x86_64.rpm

根据自身需求下载对应系统socat依赖:(http://repo.iotti.biz/CentOS/)

2.4上传并安装rpm包

2.4.1上传下载好的rpm包

RabbitMQ概念,安装及整合springboot

2.4.2按顺序分别安装Erlang、Socat、RabbitMQ

安装Erlang依赖

rpm -ivh --nodeps esl-erlang_22.0.7-1_centos_6_amd64.rpm --nosignature

或者

yum install esl-erlang_22.0.7-1_centos_6_amd64.rpm

RabbitMQ概念,安装及整合springboot

安装socat:

rpm -ivh socat-1.7.3.2-1.el6.lux.x86_64.rpm

安装RabbitMQ:

rpm -ivh rabbitmq-server-3.7.17-1.el6.noarch.rpm

RabbitMQ概念,安装及整合springboot

2.5 开启管理界面并配置

2.5.1开启管理界面:rabbitmq-plugins enable rabbitmq_management

RabbitMQ概念,安装及整合springboot

2.5.2配置远程可使用guest登录mq

cd /usr/share/doc/rabbitmq-server-3.7.17

cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

2.5.3修改配置文件:

vi /etc/rabbitmq/rabbitmq.config

修改前:

RabbitMQ概念,安装及整合springboot

 修改后:

RabbitMQ概念,安装及整合springboot

2.6 启动服务

进入到RabbitMQ安装目录下的sbin目录(由于没有配置环境变量,所以进入sbin目录),执行启动命令“./rabbitmq-server”,启动成功出现如下界面

RabbitMQ概念,安装及整合springboot

2.7 访问

访问RabbitMQ的web页面需要开启防火墙允许通道(也可以直接关闭防火墙,但是不建议这么做),开启15672和5672端口通道

RabbitMQ概念,安装及整合springboot

RabbitMQ概念,安装及整合springboot

最后再通过IP:15672访问RabbitMQ的web界面。

登录默认账户guest/guest,也可以自定义账户,登录成功显示界面如下:

RabbitMQ概念,安装及整合springboot

3.RabbitMQ的几种模式

RabbitMQ的六种工作模式:

  1. Hello World(简单模式)
  2. Work queues
  3. Publish/Subscribe
  4. Routing
  5. Topics
  6. RPC(几乎用不上,暂不介绍)

3.1Hello World模式

RabbitMQ概念,安装及整合springboot

上图模型中,P:生产者,要发送消息的程序,C:消费者,消息接收的程序,等待接收消息,红色部分为消息队列,类似一个邮箱,可以缓存消息,生产者向其中投递消息,消费者从其中取出消息

3.2 Work queues模式

RabbitMQ概念,安装及整合springboot

Work queues也被称为(Task queues)任务模型。当消息处理比较耗时的时候,可能生产消息的速度远远大于消息的消费速度,长此以往,消息会堆积的越来越多,无法及时处理。此时就可以使用Work queues模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的。

3.3 Publish/Subscribe模式

RabbitMQ概念,安装及整合springboot

RabbitMQ 消息模型的核心理念是:生产者不会直接发送任何消息给队列。事实上,生产者甚至不知道消息是否已经被投递到队列。

生产者只需要把消息发送给一个交换器(exchange)。交换器非常简单,它一边从发布者方接收消息,一边把消息推送到队列。交换器必须知道如何处理它接收到的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。这些规则是通过交换器类型(exchange type)来定义的。

有几个可供选择的交换器类型:direct, topic, headers 和 fanout。我们在这里主要说明最后一个 ——fanout。fanout exchange 很简单,你可能从名字上就能猜测出来,它把消息发送给它所知道的所有队列。这正是我们所需要的。

3.4​​​​​​​ Routing模式

RabbitMQ概念,安装及整合springboot

在fanout模式中,一条消息,会被所有订阅的队列都消费消息,但是,在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用到direct类型的交换器(Exchange)

在direct模型下:

  1. 队列与交换器的绑定不能是任意绑定了,而是要指定一个RoutingKey(路由key)
  2. 消息的发送方在向Exchange发送消息时,也必须指定消息的路由key
  3. Exchange不再把消息交给每一个绑定的队列,而是根据消息的路由key进行判断,只有队列的路由key与消息的路由key完全一致,才会接收到消息。如上图,C1其所在队列指定了需要路由key为error的消息,C2其所在队列指定了需要路由key为info,error,warning的消息

3.5 ​​​​​​​Topics模式

RabbitMQ概念,安装及整合springboot

Topics模式其实也是Routing模式的一种特殊情形,只是官网上单独分开了,这种模式的特殊在于Topic类型的Exchange可以让队列绑定路由key的时候使用通配符,也可以称为通配符模式。约定的规则如下(参照上图):

  1. routing key 为一个句点号. 分隔的字符串(我们将被句点号. 分隔开的每一段独立的字符串称为一个单词),如 “stock.usd.nyse”、”nyse.vmw”、”quick.orange.rabbit”
  2. binding key 与 routing key 一样也是句点号. 分隔的字符串
  3. binding key 中可以存在两种特殊字符 * 与#,用于做模糊匹配,其中 * 用于匹配一个单词,#用于匹配多个单词(可以是零个)

4.Spring Boot整合RabbitMQ

在基础工程中使用RabbitMQ的几种模式会稍微麻烦一点,而实际中大多也是直接使用spingboot整合RabbitMQ来使用,因为Springboot本身就很好的集成了RabbitMQ,这也是它使用广泛的一大原因。以下通过示例来说明在springboot工程中RabbitMQ的使用方法。

4.1创建springboot工程,添加依赖

RabbitMQ概念,安装及整合springboot

​​​​​​​4.2修改配置文件

在web界面配置好虚拟机和用户后,项目中添加对应配置文件

RabbitMQ概念,安装及整合springboot

RabbitMQ概念,安装及整合springboot

 

​​​​​​​4.3简单测试类

RabbitMQ概念,安装及整合springboot

​​​​​​​4.4添加消费者

RabbitMQ概念,安装及整合springboot

 

4.5启动测试类测试查看结果

执行测试类后可以看到web界面中创建了一个hello的队列,且从控制台中可以看到消息得到了消费

RabbitMQ概念,安装及整合springboot

RabbitMQ概念,安装及整合springboot

类似的,其他几种模式,使用配置一样,并在生产者测试类里添加相应的代码,添加对应的消费者,如下:

RabbitMQ概念,安装及整合springboot

工作模式消费者:

RabbitMQ概念,安装及整合springboot

Fanout模式消费者:

RabbitMQ概念,安装及整合springboot

Routing模式消费者:

RabbitMQ概念,安装及整合springboot

Topics模式消费者:

RabbitMQ概念,安装及整合springboot

分别运行测试类,可以在控制台上看到消费的打印信息,最后在web界面上也可以看到成功后自动创建的队列信息:

RabbitMQ概念,安装及整合springboot