基于Dokcer安装RabbitMQ
一、RabbitMQ介绍
1.1 现存问题
- 服务调用:两个服务调用时,我们可以通过传统的HTTP方式,让服务A直接去调用服务B的接口,但是这种方式是同步的方式,虽然可以采用SpringBoot提供的@Async注解实现异步调用,但是这种方式无法确保请求一定回访问到服务B的接口。那如何保证服务A的请求信息一定能送达到服务B去完成一些业务操作呢?| 如何实现异步调用
- 海量请求:在我们在做一些秒杀业务时,可能会在某个时间点突然出现大量的并发请求,这可能已经远远超过服务器的并发瓶颈,这时我们需要做一些削峰的操作,也就是将大量的请求缓冲到一个队列中,然后慢慢的消费掉。如何提供一个可以存储千万级别请求的队列呢?
- 在微服务架构下,可能一个业务会出现同时调用多个其他服务的场景,而且这些服务之间一般会用到Feign的方式进行轻量级的通讯,如果存在一个业务,用户创建订单成功后,还需要去给用户添加积分、通知商家、通知物流系统、扣减商品库存,而在执行这个操作时,如果任意一个服务出现了问题,都会导致整体的下单业务失败,并且会导致给用户反馈的时间延长。这时就造成了服务之间存在一个较高的耦合性的问题。如何可以降低服务之间的耦合性呢?
1.2 处理问题
RabbitMQ就可以解决上述的全部问题
- 服务之间如何想实现可靠的异步调用,可以通过RabbitMQ的方式实现,服务A只需要保证可以把消息发送到RabbitMQ的队列中,服务B就一定会消费到队列中的消息只不过会存在一定的延时。| 异步访问
- 忽然的海量请求可以存储在RabbitMQ的队列中,然后由消费者慢慢消费掉,RabbitMQ的队列本身就可以存储上千万条消息
- 在调用其他服务时,如果允许延迟效果的出现,可以将消息发送到RabbitMQ中,再由消费者慢慢消费| 服务解耦
1.3 RabbitMQ介绍
百度百科:
> RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
首先RabbitMQ基于AMQP协议开发,所以很多基于AMQP协议的功能RabbitMQ都是支持的,比如SpringCloud中的消息总线bus
其次RabbitMQ是基于Erlang编写,这是也是RabbitMQ天生的优势,Erlang被称为面向并发编程的语言,并发能力极强,在众多的MQ中,RabbitMQ的延迟特别低,在微秒级别,所以一般的业务处理RabbitMQ比Kafka和RocketMQ更有优势。
最后RabbitMQ提供自带了图形化界面,操作方便,还自带了多种集群模式,可以保证RabbitMQ的高可用,并且SpringBoot默认就整合RabbitMQ,使用简单方便。
二、RabbitMQ安装
2.1 安装RabbitMQ
直接使用docker-compose.yml文件即可安装RabbitMQ服务
cd /opt/
mkdir docker
cd docker/
vim docker-compose.yml
docker-compose.yml
version: '3.1'
services:
rabbitmq:
restart: always
image: daocloud.io/library/rabbitmq:3.8.8
volumes:
- ./data/:/var/lib/rabbitmq/
- ./log/:/var/log/rabbitmq/log/
ports:
- 15672:15672
- 5672:5672
执行 docker-compose up -d
运行
测试效果:curl localhost:5672
查看效果 |
---|
2.2 开启图形化界面
默认情况下,当前镜像的图形化界面默认没有开启,需要进入到容器内部开启图形化管理界面
启动图形化界面插件 |
---|
通过浏览器访问15672,查看图形化界面
查看登录页面 |
---|
默认用户和密码均为:guest,查看首页
查看首页 |
---|
【解决Stats in management UI are disabled on this node问题】
docker exec -it {rabbitmq容器id} /bin/bash
cat /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf
cd /etc/rabbitmq/conf.d/
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
exit
docker exec -it {rabbitmq容器名称或者id} rabbitmq-plugins enable rabbitmq_management
docker restart {rabbitmq容器id}
三、RabbitMQ构架
RabbitMQ的架构可以查看官方地址:https://rabbitmq.com/tutorials/amqp-concepts.html
官方简单架构 |
---|
可以看出RabbitMQ中主要分为三个角色:
- Publisher:消息的发布者,将消息发布到RabbitMQ中的Exchange
- RabbitMQ服务:Exchange接收Publisher的消息,并且根据Routes策略将消息转发到Queue中
- Consumer:消息的消费者,监听Queue中的消息并进行消费
官方提供的架构图相对简洁,我们可以自己画一份相对完整一些的架构图:
RabbitMQ架构图 |
---|
可以看出Publisher和Consumer都是单独和RabbitMQ服务中某一个Virtual Host建立Connection的客户端
后续通过Connection可以构建Channel通道,用来发布、接收消息
一个Virtual Host中可以有多个Exchange和Queue,Exchange可以同时绑定多个Queue
在基于架构图查看图形化界面,会更加清晰
图形化界面信息 |
---|