Docker下RabbitMQ四部曲之一:极速体验(单机和集群)

简介: 《Docker下RabbitMQ四部曲》系列的开篇,先用最短时间和最少操作体验基本功能

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos
  • 从本章开始,我们一起在Docker环境实战RabbitMQ环境部署和对应的Java开发,当前是《Docker下RabbitMQ四部曲》系列的第一篇,整个系列由以下四篇文章组成:
  1. 第一篇,即本章,我们用最快的方式体验RabbitMQ单机环境下生产和消费消息,然后再体验RabbitMQ集群环境下生产和消费消息;
  2. 第二篇,详细说明如何制作RabbitMQ的docker镜像文件,这个镜像支持集群,也能通过参数来配置内存节点、高可用等特性;
  3. 第三篇,开发基于SpringBoot的web应用,实现生产和消息RabbitMQ消息的功能;
  4. 第四篇,实战高可用,集群环境中有RabbitMQ宕机,验证此时消息的生产和消费是否正常;

环境信息

  • 本次实战的环境信息如下:
  1. 操作系统:Ubuntu 16.04.3 LTS
  2. docker版本:17.03.2-ce, build f5ec1e2
  3. docker-compose版本:1.18.0, build 8dd22a9
  4. RabbitMQ版本:3.7.5-rc.1
  5. RabbitMQ环境的Erlang版本:19.3.6.5

本章概要

  • 本章的实战步骤简述如下:
  1. 部署单机版RabbitMQ、生产消息的web应用、消费消息的web应用;
  2. 检查RabbitMQ的基本情况、生产和消费消息;
  3. 部署集群版RabbitMQ、生产消息的web应用、消费消息的web应用;
  4. 检查RabbitMQ的基本情况、生产和消费消息;

部署单机版RabbitMQ

  • 创建docker-compose.yml文件,内容如下:
rabbitmq:
  image: bolingcavalry/rabbitmq-server:0.0.3
  hostname: rabbitmq
  ports:
    - "15672:15672"
  environment:
    - RABBITMQ_DEFAULT_USER=admin
    - RABBITMQ_DEFAULT_PASS=888888
producer:
  image: bolingcavalry/rabbitmqproducer:0.0.2-SNAPSHOT
  hostname: producer
  links:
    - rabbitmq:rabbitmqhost
  ports:
      - "18080:8080"
  environment:
   - mq.rabbit.address=rabbitmqhost:5672
   - mq.rabbit.username=admin
   - mq.rabbit.password=888888
consumer:
  image: bolingcavalry/rabbitmqconsumer:0.0.5-SNAPSHOT
  hostname: consumer
  links:
    - rabbitmq:rabbitmqhost
  environment:
   - mq.rabbit.address=rabbitmqhost:5672
   - mq.rabbit.username=admin
   - mq.rabbit.password=888888
   - mq.rabbit.queue.name=consumer.queue
  • 在docker-compose.yml文件所在目录执行命令docker-compose up -d,即可下载镜像并创建容器,下载过程比较耗时请耐心等待,容器一共三个:RabbitMQ、消息生产者、消息消费者;
  • 容器创建成功后,网络架构如下图所示:

image.png

  • 为了方便后续体验,将三个容器信息列表如下:
名称 作用 IP地址
single_rabbitmq_1 RabbitMQ服务器 172.17.0.2
single_producer_1 生产消息的web应用 172.17.0.4
single_consumer_1 消费消息的web应用 172.17.0.3

体验单机版RabbitMQ

  • 单机版的RabbitMQ环境已经部署完毕,接下来我们来体验一番:
  • 假设运行docker的电脑IP地址为192.168.119.155
  • 在浏览器输入http://192.168.119.155:18080/send/aaa/bbb,这个请求会使single_producer_1容器向RabbitMQ发送消息,如下图:

image.png

  • 在docker机器上输入命令docker logs -f single_consumer_1,可以看到容器的日志,如下所示,receive message : hello, aaa, bbb就是容器从RabbitMQ收到的消息:
2018-05-12 10:40:23.851  INFO 1 --- [cTaskExecutor-2] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [rabbitmqhost:5672]
2018-05-12 10:40:23.878  WARN 1 --- [172.17.0.2:5672] c.r.c.impl.ForgivingExceptionHandler     : An unexpected connection driver error occured (Exception message: Socket closed)
2018-05-12 10:40:28.890  INFO 1 --- [cTaskExecutor-2] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@25023b5b: tags=[{}], channel=null, acknowledgeMode=AUTO local queue size=0
2018-05-12 10:40:28.892  INFO 1 --- [cTaskExecutor-3] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [rabbitmqhost:5672]
2018-05-12 10:40:28.900  INFO 1 --- [cTaskExecutor-3] o.s.a.r.c.CachingConnectionFactory       : Created new connection: connectionFactory#29f69090:4/SimpleConnection@1fff76dd [delegate=amqp://admin@172.17.0.2:5672/, localPort= 36948]
2018-05-12 11:40:57.048  INFO 1 --- [cTaskExecutor-3] c.b.r.receiver.FanoutReceiver            : receive message : hello, aaa, bbb, 2018-05-12 11:40:56
  • 在浏览器访问http://192.168.119.155:15672,会打开RabbitMQ的管理页面,需要登录,如下图,输入用户名admin,密码888888

image.png

  • 登录成功后,点击“Connections”的Tab页,如下图,目前single_producer_1和single_consumer_1容器都连接到了RabbitMQ:

image.png

  • 如下图红框所示,在“Exchanges”的Tab页,可以看到一个fanout型的交换机,名为bolingcavalryFanoutExchange

image.png

  • 如下图红框所示,在“Queues”的Tab页,可以看到一个队列,名为consumer.queue

image.png

  • 至此,单机版的RabbitMQ我们就体验完毕了,接下来开始体验集群版的RabbitMQ;

清空单机版RabbitMQ的所有容器

  • 在刚才创建的docker-compose.yml文件所在目录下执行命令docker-compose down,即可将刚才创建的三个容器彻底清除,如下所示:
root@maven:/usr/local/work/github/blog_demos/rabbitmq_docker_files/single# docker-compose down
Stopping single_producer_1 ... done
Stopping single_consumer_1 ... done
Stopping single_rabbitmq_1 ... done
Removing single_producer_1 ... done
Removing single_consumer_1 ... done
Removing single_rabbitmq_1 ... done

部署集群版RabbitMQ

  • 创建集群版对应的docker-compose.yml文件,内容如下:
version: '2'
services:
  rabbit1:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit1
    ports:
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=888888
  rabbit2:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit2
    depends_on:
      - rabbit1
    links:
      - rabbit1
    environment:
     - CLUSTERED=true
     - CLUSTER_WITH=rabbit1
     - RAM_NODE=true
    ports:
      - "15673:15672"
  rabbit3:
    image: bolingcavalry/rabbitmq-server:0.0.3
    hostname: rabbit3
    depends_on:
      - rabbit2
    links:
      - rabbit1
      - rabbit2
    environment:
      - CLUSTERED=true
      - CLUSTER_WITH=rabbit1
    ports:
      - "15675:15672"
  producer:
    image: bolingcavalry/rabbitmqproducer:0.0.2-SNAPSHOT
    hostname: producer
    depends_on:
      - rabbit3
    links:
      - rabbit1:rabbitmqhost
    ports:
      - "18080:8080"
    environment:
      - mq.rabbit.address=rabbitmqhost:5672
      - mq.rabbit.username=admin
      - mq.rabbit.password=888888
  consumer1:
    image: bolingcavalry/rabbitmqconsumer:0.0.5-SNAPSHOT
    hostname: consumer1
    depends_on:
      - producer
    links:
      - rabbit2:rabbitmqhost
    environment:
     - mq.rabbit.address=rabbitmqhost:5672
     - mq.rabbit.username=admin
     - mq.rabbit.password=888888
     - mq.rabbit.queue.name=consumer1.queue
  consumer2:
    image: bolingcavalry/rabbitmqconsumer:0.0.5-SNAPSHOT
    hostname: consumer2
    depends_on:
      - consumer1
    links:
      - rabbit3:rabbitmqhost
    environment:
      - mq.rabbit.address=rabbitmqhost:5672
      - mq.rabbit.username=admin
      - mq.rabbit.password=888888
      - mq.rabbit.queue.name=consumer2.queue
  • 在docker-compose.yml文件所在目录执行命令docker-compose up -d,即可创建容器,容器一共六个:三个RabbitMQ、一个消息生产者、两个消息消费者;
  • 容器创建成功后,网络架构如下图所示:

image.png

  • 为了方便后续体验,将三个容器信息列表如下:
名称 作用 IP地址
cluster_rabbit1_1 一号RabbitMQ服务器 172.17.0.2
cluster_rabbit2_1 二号RabbitMQ服务器 172.17.0.3
cluster_rabbit3_1 三号RabbitMQ服务器 172.17.0.6
cluster_producer_1 生产消息的web应用 172.17.0.4
cluster_consumer1_1 一号消费消息的web应用 172.17.0.5
cluster_consumer2_1 二号消费消息的web应用 172.17.0.7

体验集群版RabbitMQ

  • 集群版的RabbitMQ环境已经部署完毕,我们来体验一番:
  • 假设运行docker的电脑IP地址为192.168.119.155
  • 在浏览器输入http://192.168.119.155:18080/send/aaa/bbb,这个请求会使single_producer_1容器向RabbitMQ发送消息,如下图:

image.png

  • 在docker机器上输入命令docker logs -f cluster_consumer1_1,可以看到容器cluster_consumer1_1的日志,如下所示,receive message : hello, aaa, bbb就是容器从RabbitMQ收到的消息:
2018-05-12 11:59:17.112  INFO 1 --- [cTaskExecutor-4] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [rabbitmqhost:5672]
2018-05-12 11:59:17.172  INFO 1 --- [cTaskExecutor-4] o.s.a.r.c.CachingConnectionFactory       : Created new connection: connectionFactory#55040f2f:6/SimpleConnection@723a07 [delegate=amqp://admin@172.17.0.3:5672/, localPort= 48294]
2018-05-12 12:11:12.187  INFO 1 --- [cTaskExecutor-4] c.b.r.receiver.FanoutReceiver            : receive message : hello, aaa, bbb, 2018-05-12 12:11:12
  • 接下来看另一个消费消息的容器,在docker机器上输入命令docker logs -f cluster_consumer2_1,可以看到容器cluster_consumer2_1的日志,如下所示,也受到一条消息,这证明fanout模式的交换机中的消息已成功被两个消费者消费:
2018-05-12 11:59:12.199  INFO 1 --- [cTaskExecutor-3] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [rabbitmqhost:5672]
2018-05-12 11:59:12.263  INFO 1 --- [cTaskExecutor-3] o.s.a.r.c.CachingConnectionFactory       : Created new connection: connectionFactory#568bf312:4/SimpleConnection@11a59930 [delegate=amqp://admin@172.17.0.6:5672/, localPort= 55972]
2018-05-12 12:11:12.187  INFO 1 --- [cTaskExecutor-3] c.b.r.receiver.FanoutReceiver            : receive message : hello, aaa, bbb, 2018-05-12 12:11:12
  • 在浏览器访问http://192.168.119.155:15672,会打开RabbitMQ的管理页面,需要登录,如下图,输入用户名admin,密码888888

image.png

  • 登录成功后,在“Overview”的Tab页,如下图红框所示,可见有三个RabbitMQ server,注意绿框中的信息,一号和三号RabbitMQ都是磁盘型,二号RabbitMQ是内存型的:

image.png

  • 点击“Connections”的Tab页,如下图,所有生产者和消费者容器都连接到了RabbitMQ:

image.png

上图中表格表明了以下连接关系:
生产者连接一号RabbitMQ、一号消费者连接二号RabbitMQ、二号消费者连接三号RabbitMQ;

  • 如下图红框所示,在“Exchanges”的Tab页,可以看到一个fanout型的交换机,名为bolingcavalryFanoutExchange

image.png

  • 如下图红框所示,在“Queues”的Tab页,可以看到两个队列,分别存在于二号RabbitMQ和三号RabbitMQ:

image.png

  • 至此,集群版的RabbitMQ我们就体验完毕了,本章旨在让读者您用最少的操作来完成整个体验过程,接下来的文章中,我们会一起实战这些简单操作背后的技术细节;

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
425 5
|
7月前
|
Prometheus 监控 Cloud Native
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
561 79
|
6月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
就这样,你成功地用魔法召唤出了RabbitMQ,还把它和你的应用程序连接了起来。现在,消息会像小溪流水一样,在你的系统中自由流淌。别忘了,兔子们不喜欢孤独,他们需要你细心的关怀,不时地监控它们,确保他们的世界运转得井井有条。
396 18
|
9月前
|
边缘计算 负载均衡 NoSQL
FreeMQTT Plus: 一个新型 MQTT Broker 集群的实现
FreeMQTT Plus 是一款基于 MQTT 协议的高性能消息中间件,采用分布式架构解决单点瓶颈问题。其核心由 Nginx 负载均衡器、黑(A)节点(MQTT Broker)、白(B)节点(消息路由)和日志(L)节点组成。通过无主从设计,支持高可用性、负载均衡与灵活扩展。针对会话同步、消息路由等挑战,FreeMQTT Plus 利用 MQTT5 特性定义元命令,实现节点间高效通信,无需依赖第三方组件。适用于物联网海量设备接入与高并发场景,为未来边缘计算和多级集群部署提供坚实基础。
1495 74
|
10月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
1373 91
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
645 161
|
Prometheus 监控 Cloud Native
如何监控Docker Swarm集群的性能?
如何监控Docker Swarm集群的性能?
604 64
|
12月前
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
2630 2
|
12月前
|
消息中间件 RocketMQ
2024最全RocketMQ集群方案汇总
在研究RocketMQ集群方案时,发现网上存在诸多不一致之处,如组件包含NameServer、Broker、Proxy等。通过查阅官方文档,了解到v4.x和v5.x版本的差异。v4.x部署模式包括单主、多主、多主多从(异步复制、同步双写),而v5.x新增Local与Cluster模式,主要区别在于Broker和Proxy是否同进程部署。Local模式适合平滑升级,Cluster模式适合高可用需求。不同模式下,集群部署方案大致相同,涵盖单主、多主、多主多从等模式,以满足不同的高可用性和性能需求。
1681 0
|
5月前
|
消息中间件 数据管理 Serverless
阿里云消息队列 Apache RocketMQ 创新论文入选顶会 ACM FSE 2025
阿里云消息团队基于 Apache RocketMQ 构建 Serverless 消息系统,适配多种主流消息协议(如 RabbitMQ、MQTT 和 Kafka),成功解决了传统中间件在可伸缩性、成本及元数据管理等方面的难题,并据此实现 ApsaraMQ 全系列产品 Serverless 化,助力企业提效降本。