MQ:全称是MessageQueue,消息队列。
在两个系统中间传递消息,从而满足一些业务需求,
它对我们总体架构的作用有:
解耦:提高系统容错性和可维护性
异步:提升用户体验和系统吞吐量
削峰:提高系统稳定性
常用的MQ产品包括Kafka、RabbitMQ和RocketMQ。我们对这三个产品做下简单的比较。
MQ | 优点 | 缺点 |
---|---|---|
Kafka | 吞吐量大,性能好,集群高可用 | 会丢数据,功能单一 |
RabbitMQ | 消息可靠性高,功能全面 | 吞吐量比较低,消息积累会影响性能 |
RocketMQ | 高吞吐,高性能,高可用,功能全面 | 客户端只支持JAVA |
RabbitMQ有着很高的消息可靠性,所以被广泛应用在金融、银行相关的系统中。
RabbitMQ 采用 Erlang 语言开发。
RabbitMQ的相关概念:
Broker :接收和分发消息的应用
Virtual host :虚拟主机
Connection : 连接
Channel : 每个线程创建单独的 channel 进行通讯连接,减少建立连接的开销
Exchange : 交换机,message 到达 broker 的第一站
Queue : 队列,消息最终被送到这里等待 consumer 取走
Binding : 设置不同的 routing key ,用于 message 的指定分发
从图中更容易去理解它的概念,
下面是它的结构图:
RabbitMQ 提供了 6 种工作模式:
本次安装以CentOS7的系统为例
1、去官网下载软件包: 有三个文件
erlang18.31.el7.centos.x86_64.rpm
socat1.7.3.25.el7.lux.x86_64.rpm
rabbitmqserver3.6.51.noarch.rpm
2、安装Erlang
#安装命令
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
3、安装RabbitMQ包
#安装命令
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
#安装命令
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
4、开启管理界面及配置
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,修改用户名guest
5、启动命令
# 启动
service rabbitmq-server start
# 停止
service rabbitmq-server stop
# 重启
service rabbitmq-server restart
RabbitMQ在安装好后,可以访问链接:http://ip地址:15672,
注意:端口号是15672,
如果使用腾讯云或者阿里云的服务器,一定记得开放 15672端口 否则无法访问。
如果你使用的本地虚拟机,执行关闭防火墙命令
#关闭防火墙
systemctl stop firewalld
访问成功后的界面: (它自带了guest/guest的 用户名和密码)
登录成功后,你可以看到它有6个导航入口。可以在 Admin栏 创建管理自定义用户。
在这里可以创建用户信息:
设置完用户名密码后,在Tags设置用户身份:
1、 超级管理员(administrator) 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进操作 。
2、 监控者(monitoring) 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用 情况,磁盘使用情况等)
3、 策略制定者(policymaker) 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上 图红框标识的部分)。
4、 普通管理者(management) 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他(None) 无法登陆管理控制台,通常就是普通的生产者和消费者。
在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个 VirtualHost之间是相互隔离的。
相当于mysql中可以有多个db数据库,每个数据库是独立的,方便业务之间的隔离。
创建Virtual Host:
点击创建好的名字,然后进入Virtual Host管理页面,设置指定的用户去管理这个Virtual Host
我在这里只介绍一下跟spring项目的集成,
RabbitMQ可以使用原生Java,也可以集成在SpringBoot中使用。
首先提前准备好两个项目,一个是生产者producer、另一个消费者consumer。
1.在pom文件中 添加RabbitMQ的依赖
com.rabbitmq
amqp-client
5.3.0
org.springframework.amqp
spring-rabbit
2.0.5.RELEASE
2.配置文件
创建 spring-rabbitmq-producer.xml 文件
<context:property-placeholder location="classpath:rabbitmq.properties"/>
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"/>
<rabbit:admin connection-factory="connectionFactory"/>
<rabbit:queue id="spring_fanout_queue_1" name="spring_fanout_queue_1" auto-declare="true"/>
<rabbit:queue id="spring_fanout_queue_2" name="spring_fanout_queue_2" auto-declare="true"/>
<rabbit:fanout-exchange id="spring_fanout_exchange" name="spring_fanout_exchange" auto-declare="true">
<rabbit:bindings>
<rabbit:binding queue="spring_fanout_queue_1" />
<rabbit:binding queue="spring_fanout_queue_2"/>
rabbit:bindings>
rabbit:fanout-exchange>
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
创建:rabbitmq.properties 文件
这个文件中设置连接RabbitMQ的相关信息
rabbitmq.host=192.168.1.167
rabbitmq.port=5672
rabbitmq.username=songpangyu
rabbitmq.password=123456
rabbitmq.virtual-host=/pangyu
3.编写Java代码
public class ProducerTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testFanout() {
this.rabbitTemplate.convertAndSend("spring_fanout_exchange", "", "spring fanout....");
}
}
创建spring-rabbitmq-consumer.xml
<context:property-placeholder location="classpath:rabbitmq.properties"/>
<rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
port="${rabbitmq.port}"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
virtual-host="${rabbitmq.virtual-host}"/>
<bean id="fanoutListener1" class="com.demo.rabbitmq.listener.FanoutListener"/>
<rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
<rabbit:listener ref="fanoutListener1" queue-names="spring_fanout_queue_1"/>
rabbit:listener-container>
也需要创建:rabbitmq.properties 文件
这个文件中设置连接RabbitMQ的相关信息
rabbitmq.host=192.168.1.167
rabbitmq.port=5672
rabbitmq.username=songpangyu
rabbitmq.password=123456
rabbitmq.virtual-host=/pangyu
创建监听类,去消费消息
public class FanoutListener implements MessageListener {
@Override
public void onMessage(Message message) {
//打印消息
System.out.println(new String(message.getBody()));
}
}
rabbitMQ提供多种工作模式 , 常见的有:
RabbitMQ在搭建集群的时候,可以配合HAProxy来完成负载均衡。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、 快速并且可靠的一种解决方案。