1. 程式人生 > >Docker下RabbitMQ四部曲之一:極速體驗(單機和叢集)

Docker下RabbitMQ四部曲之一:極速體驗(單機和叢集)

從本章開始,我們一起在Docker環境實戰RabbitMQ環境部署和對應的Java開發,當前是《Docker下RabbitMQ四部曲》系列的第一篇,整個系列由以下四篇文章組成:
1. 第一篇,即本章,我們用最快的方式體驗RabbitMQ單機環境下生產和消費訊息,然後再體驗RabbitMQ叢集環境下生產和消費訊息;
2. 第二篇,詳細說明如何製作RabbitMQ的docker映象檔案,這個映象支援叢集,也能通過引數來配置記憶體節點、高可用等特性;
3. 第三篇,開發基於SpringBoot的web應用,實現生產和訊息RabbitMQ訊息的功能;
3. 第四篇,實戰高可用,叢集環境中有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

  1. 建立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


2. 在docker-compose.yml檔案所在目錄執行命令docker-compose up -d,即可下載映象並建立容器,下載過程比較耗時請耐心等待,容器一共三個:RabbitMQ、訊息生產者、訊息消費者;

3. 容器建立成功後,網路架構如下圖所示:
這裡寫圖片描述

4. 為了方便後續體驗,將三個容器資訊列表如下:

名稱 作用 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環境已經部署完畢,接下來我們來體驗一番:
1. 假設執行docker的電腦IP地址為192.168.119.155
2. 在瀏覽器輸入,這個請求會使single_producer_1容器向RabbitMQ傳送訊息,如下圖:
這裡寫圖片描述
3. 在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://[email protected]: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


4. 在瀏覽器訪問,會開啟RabbitMQ的管理頁面,需要登入,如下圖,輸入使用者名稱admin,密碼888888
這裡寫圖片描述

5. 登入成功後,點選“Connections”的Tab頁,如下圖,目前single_producer_1和single_consumer_1容器都連線到了RabbitMQ:
這裡寫圖片描述

6. 如下圖紅框所示,在“Exchanges”的Tab頁,可以看到一個fanout型的交換機,名為bolingcavalryFanoutExchange
這裡寫圖片描述

7. 如下圖紅框所示,在“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 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

  1. 建立叢集版對應的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


2. 在docker-compose.yml檔案所在目錄執行命令docker-compose up -d,即可建立容器,容器一共六個:三個RabbitMQ、一個訊息生產者、兩個訊息消費者;
3. 容器建立成功後,網路架構如下圖所示:
這裡寫圖片描述

4. 為了方便後續體驗,將三個容器資訊列表如下:

名稱 作用 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環境已經部署完畢,我們來體驗一番:
1. 假設執行docker的電腦IP地址為192.168.119.155
2. 在瀏覽器輸入,這個請求會使single_producer_1容器向RabbitMQ傳送訊息,如下圖:
這裡寫圖片描述

3. 在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://[email protected]: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


4. 接下來看另一個消費訊息的容器,在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://[email protected]: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


5. 在瀏覽器訪問,會開啟RabbitMQ的管理頁面,需要登入,如下圖,輸入使用者名稱admin,密碼888888
這裡寫圖片描述

6. 登入成功後,在“Overview”的Tab頁,如下圖紅框所示,可見有三個RabbitMQ server,注意綠框中的資訊,一號和三號RabbitMQ都是磁碟型,二號RabbitMQ是記憶體型的:
這裡寫圖片描述

7. 點選“Connections”的Tab頁,如下圖,所有生產者和消費者容器都連線到了RabbitMQ:
這裡寫圖片描述
上圖中表格表明了以下連線關係:
生產者連線一號RabbitMQ、一號消費者連線二號RabbitMQ、二號消費者連線三號RabbitMQ;

8. 如下圖紅框所示,在“Exchanges”的Tab頁,可以看到一個fanout型的交換機,名為bolingcavalryFanoutExchange
這裡寫圖片描述

9. 如下圖紅框所示,在“Queues”的Tab頁,可以看到兩個佇列,分別存在於二號RabbitMQ和三號RabbitMQ:
這裡寫圖片描述

至此,叢集版的RabbitMQ我們就體驗完畢了,本章旨在讓讀者您用最少的操作來完成整個體驗過程,接下來的文章中,我們會一起實戰這些簡單操作背後的技術細節;