# 用 Docker 玩 RabbitMQ ###### tags: `Docker` `RabbitMQ` ## 前置步驟 有安裝docker環境即可 # 實作步驟 [TOC] # 一、建立RabbitMQ ## 1. 拉取 RabbitMQ image 這邊使用 management 的版本 ```shell= docker pull rabbitmq:management ``` 運行結果 ![](https://i.imgur.com/Bd4iWod.png) ## 2. 運行 RabbitMQ ```shell= docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management ``` * 參數解釋: 1. --name:容器名稱 2. -d:背景執行 3. -p:5672應用訪問使用,15672為後台網站及API呼叫使用 4. -rm:結束後立即移除 運行結果如下 > 如果想看運行紀錄也可以使用`docker logs rabbitmq` ![](https://i.imgur.com/PAMxjgw.png) # 二、基本檢視和操作 這邊我們要主要實作`Publish/Subscribe` 的操作,其行為如下圖 ![](https://i.imgur.com/LVFsjj4.png) X為Exchanges則紅色部分為Queues,詳情可參考最下方參考來源。 ## 1. 進入管理頁面 因為我們是使用`management`版本的所以可以透過網址進入頁面,其預設帳密皆為`guest` http://localhost:15672/ ![](https://i.imgur.com/ePlUoWQ.png) 登入後可以看到一下畫面,之後就可以來執行相關設定了 ![](https://i.imgur.com/QUGuCZt.png) ## 2. 建立Queues用來存放資料 這邊我們建立兩個Queue來接收資料,其設定如下圖即可 ![](https://i.imgur.com/cVJCVzl.png) 圖片可以看到我們建立了 my_queue_01 和my_queue_02 兩個Queue用來接收資料 ![](https://i.imgur.com/xrEd6Mw.png) 接下來就換到Exchanges設定 ## 3. 建立 Exchanges 當作資料交換站 ### 3-1. 建立 Exchange 這邊使用以下參數建立Exchanges ![](https://i.imgur.com/gRFGM3S.png) 完成後會看到下方多了一筆我們新增的Exchange ![](https://i.imgur.com/gyqiUvH.png) ### 3-2. 設定 Exchange 對應 Queue 點及我們新增的Exchange可以進入設定頁面,這邊我們要做的事情是綁定Exchange和Queue之間關聯,設定也如下圖,這邊使用`direct`的方式就是直接丟給指定的`Queue` > 其 "Routing key" 用來指定推向哪些Queue使用 ![](https://i.imgur.com/GsEJpLo.png) 設定完成後則顯示在Bindings資料裡面 ![](https://i.imgur.com/htad7YT.png) ## 4. 進行測試 我們使用Postmat進行測試,其API使用可參考[RabbitMQ Management HTTP API](https://pulse.mozilla.org/api/index.html)這邊就不多做說明。 目前我們要執行的行為是,發送訊息到`my_exchange`並且指定`my_queue_01`讓其可以獲得訊息,其Postman的參數和測試結果如下 > 回傳訊息如果`Routed:true`代表有將訊息傳送到Queue。 ![](https://i.imgur.com/gQn2jgF.png) 回到管理畫面查看會看到該Queue已接收到對應的訊息了 ![](https://i.imgur.com/TiCok1N.png) 最後附上Postman腳本: ```json= { "info": { "_postman_id": "fd9082b2-243a-4197-a674-866de3187f9a", "name": "MQ Test", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "RabbitMQ Test Publish", "event": [ { "listen": "prerequest", "script": { "exec": [ "" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Basic Z3Vlc3Q6Z3Vlc3Q=" } ], "body": { "mode": "raw", "raw": "{\r\n \"properties\":{},\r\n \"routing_key\":\"mq_Queues\",\r\n \"payload\": \"my payload message\",\r\n \"payload_encoding\":\"string\"\r\n}" }, "url": { "raw": "http://localhost:15672/api/exchanges/%2F/mq_exchange/publish", "protocol": "http", "host": [ "localhost" ], "port": "15672", "path": [ "api", "exchanges", "%2F", "mq_exchange", "publish" ] } }, "response": [] } ] } ``` # 結論 RabbitMQ目前在工作上使用還是偏少(ELK上有拿來使用)其資訊傳送方式還有很多種,下面參考資料可以去做延伸性的閱讀,這邊只做一個簡單的實作呈現方便評估功能。 <br/> --- 相關參考來源: [【RabbitMQ】五分鐘輕鬆了解 RabbitMQ 運作](https://zamhuang.medium.com/rabbitmq-%E4%BA%94%E5%88%86%E9%90%98%E8%BC%95%E9%AC%86%E4%BA%86%E8%A7%A3-rabbitmq-%E9%81%8B%E4%BD%9C-fcaecbaa69d4) [RabbitMQ Tutorials](https://www.rabbitmq.com/getstarted.html) <style> code > span{ color: red;} </style>