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
- 建立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
- 建立叢集版對應的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我們就體驗完畢了,本章旨在讓讀者您用最少的操作來完成整個體驗過程,接下來的文章中,我們會一起實戰這些簡單操作背後的技術細節;