写点什么

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

作者:程序员欣宸
  • 2022 年 5 月 26 日
  • 本文字数:4494 字

    阅读完需:约 15 分钟

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=888888producer:  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=888888consumer:  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、消息生产者、消息消费者;

  • 容器创建成功后,网络架构如下图所示:


  • 为了方便后续体验,将三个容器信息列表如下:


体验单机版 RabbitMQ

  • 单机版的 RabbitMQ 环境已经部署完毕,接下来我们来体验一番:

  • 假设运行 docker 的电脑 IP 地址为 192.168.119.155

  • 在浏览器输入 http://192.168.119.155:18080/send/aaa/bbb,这个请求会使 single_producer_1 容器向 RabbitMQ 发送消息,如下图:

  • 在 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=02018-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


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


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


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


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

清空单机版 RabbitMQ 的所有容器

  • 在刚才创建的 docker-compose.yml 文件所在目录下执行命令 docker-compose down,即可将刚才创建的三个容器彻底清除,如下所示:


root@maven:/usr/local/work/github/blog_demos/rabbitmq_docker_files/single# docker-compose downStopping single_producer_1 ... doneStopping single_consumer_1 ... doneStopping single_rabbitmq_1 ... doneRemoving single_producer_1 ... doneRemoving single_consumer_1 ... doneRemoving 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、一个消息生产者、两个消息消费者;

  • 容器创建成功后,网络架构如下图所示:


  • 为了方便后续体验,将三个容器信息列表如下:


体验集群版 RabbitMQ

  • 集群版的 RabbitMQ 环境已经部署完毕,我们来体验一番:

  • 假设运行 docker 的电脑 IP 地址为 192.168.119.155

  • 在浏览器输入 http://192.168.119.155:18080/send/aaa/bbb,这个请求会使 single_producer_1 容器向 RabbitMQ 发送消息,如下图:


  • 在 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


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


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



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


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


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


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

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 2022 年 05 月 26 日阅读数: 79
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Docker下RabbitMQ四部曲之一:极速体验(单机和集群)_Java_程序员欣宸_InfoQ写作社区