一、簡介
1.EMQ X R3.2 消息服務器簡介
EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基於 Erlang/OTP 平臺開發的開源物聯網 MQTT 消息服務器。Erlang/OTP 是出色的軟實時(Soft-Realtime)、低延時(Low-Latency)、分佈式(Distributed) 的語言平臺。MQTT 是輕量的(Lightweight)、發佈訂閱模式(PubSub) 的物聯網消息協議。
EMQ X 面向海量的 移動/物聯網/車載 等終端接入,並實現在海量物理網設備間快速低延時的消息路由:
1.穩定承載大規模的 MQTT 客戶端連接,單服務器節點支持百萬連接。
2.分佈式節點集羣,快速低延時的消息路由,單集羣支持千萬規模的路由。
3.消息服務器內擴展,支持定製多種認證方式、高效存儲消息到後端數據庫。
4.完整物聯網協議支持,MQTT、MQTT-SN、CoAP、LwM2M、私有 TCP/UDP 協議支持。
2.MQTT 發佈訂閱模式簡述
MQTT 是基於 發佈(Publish)/訂閱(Subscribe) 模式來進行通信及數據交換的,與 HTTP 的 請求(Request)/應答(Response) 的模式有本質的不同。
訂閱者(Subscriber) 會向 消息服務器(Broker) 訂閱一個 主題(Topic) 。成功訂閱後,消息服務器會將該主題下的消息轉發給所有的訂閱者。
主題(Topic)以 ‘/’ 爲分隔符區分不同的層級。包含通配符 ‘+’ 或 ‘#’ 的主題又稱爲 主題過濾器(Topic Filters); 不含通配符的稱爲 主題名(Topic Names) 例如:
sensor/1/temperature
chat/room/subject
presence/user/feng
sensor/1/#
sensor/+/temperature
uber/drivers/joe/inbox
注: ‘+’ 通配一個層級,’#’ 通配多個層級(必須在末尾)。
註解
注: 發佈者(Publisher) 只能向 ‘主題名’ 發佈消息,訂閱者(Subscriber) 則可以通過訂閱 ‘主題過濾器’ 來通配多個主題名稱。
二、emqx服務器的單點搭建
2.1. 下載emqx zip文件
運行:wget https://www.emqx.io/downloads/broker/v3.2.2/emqx-centos7-v3.2.2.zip
下載安裝包到指定位置。
2.2、解壓zip壓縮包
運行: unzip emqx-centos7-v3.2.2.zip
2.3、啓動emqx
首先cd到emqx目錄
運行:cd emqx/
然後再運行:./bin/emqx start
顯示:emqx 3.2.2 is started successfully! 表示啓動成功
停止emqx
./bin/emqx stop
2.4、查看運行狀態
運行:./bin/emqx_ctl status 命令
2.5、防火牆開放18083和1883端口
firewall-cmd --zone=public --add-port=18083/tcp --permanent
systemctl start firewalld
systemctl stop firewalld
firewall-cmd --list-ports
2.6、查看Dashboard控制檯
EMQ X 默認加載 Dashboard 插件,啓動 Web 管理控制檯。用戶可通過 Web 控制檯,查看服務器運行狀態、統計數據、連接(Connections)、會話(Sessions)、主題(Topics)、訂閱(Subscriptions)、插件(Plugins)等。
控制檯地址: http://127.0.0.1:18083,默認用戶名: admin,密碼:public
2.7、測試客戶端發佈、訂閱
- 準備兩個springboot集成mqtt的項目,既可以是發佈者也可以是訂閱者。
- 修改配置的ip和端口爲剛剛啓動的emqx服務器的ip和端口,端口默認爲1883
- a客戶端發佈topic爲topic1的內容時,a和b客戶端都能收到訂閱,同樣b客戶端發佈時,a和b也能收到。至此,單點的emqx服務器搭建成功。
三、emqx服務器的集羣搭建
官方的壓測顯示,單點的EMQ X R3.0 在單機 8核/32G內存的 CentOS 雲服務器,也能夠測試到 130萬 的客戶端連接數,但單點沒有容錯能力,如果部署emq的服務器掛了後續服務將會受到影響,所以現在搭建集羣。
3.1、按上述方法在2臺機上安裝emqx服務器
修改文件./emqx/etc/emqx.conf
主要修改以下幾個地方:
第一臺:
#集羣發現模式,靜態發現,啓動後不用輸加入集羣命令
cluster.discovery = static
#集羣列表,配合上面static發現策略使用
cluster.static.seeds = [email protected].137.59,[email protected].137.4
#節點名
node.name = [email protected]37.57
#集羣通信端口段
node.dist_listen_min = 6369
node.dist_listen_max = 7369
第二臺:
#集羣發現模式,靜態發現,啓動後不用輸加入集羣命令
cluster.discovery = static
#集羣列表,配合上面static發現策略使用
cluster.static.seeds = [email protected].137.59,[email protected].137.4
#節點名
node.name = emqx2@192.168.137.4
#集羣通信端口段
node.dist_listen_min = 6369
node.dist_listen_max = 7369
3.2、防火牆把4369,6369端口也開啓
3.3、把2臺機器的emqx服務器分別啓動
啓動成功後查看任意一臺Dashboard控制檯,可以看到兩個節點及它們的連接數。
四、添加權限驗證
4.1.分別在兩個服務器的etc下面找到emqx.conf文件
##關閉匿名認證
allow_anonymous = false
4.2、加載用戶名認證插件
./bin/emqx_ctl plugins load emqx_auth_username
4.3、添加用戶
./bin/emqx_ctl users add admin jingxin123
其中,admin是賬戶名,jingxin123是密碼
4.4、分別重啓兩個emqx服務器
五、mqtt集成到springboot並測試
- 集成mqtt到兩個springboot項目,配置文件添加連接emqx的ip及端口
- 其中一個發佈信息,另一個能收到訂閱,反之亦然。
- 關掉其中一個emqx服務器,發佈及訂閱信息仍能成功。
- 開啓這臺emqx服務器,關掉另一個,發佈及訂閱還是成功。至此,安裝,集羣及集成到springboot項目完成
注:mqtt集成到springboot進行消息的發佈及訂閱請參考《springboot整合mqtt進行消息的發佈及訂閱》。