項(xiàng)目地址 Mqttx Project
)
mqttx
基于 mqtt v3.1.1 官方協(xié)議文檔開發(fā)见剩。
項(xiàng)目運(yùn)行的方式:
-
使用
springboot
推薦的啟動方式java -jar app.jar
杀糯,使用mvn clean package
打包,這種方式需要修改配置文件(resources/application.yml
)中 redis 地址和端口苍苞。mqttx default redis 連接使用的配置:
localhost:6379
無密碼 基于
docker
容器化部署固翰,這個就比較簡單,具體的步驟見 容器化部署
中間件依賴:
- redis
其他依賴:
- 項(xiàng)目使用了 lombok羹呵,使用 ide 請安裝對應(yīng)的插件
舉例:idea 需要安裝插件 Lombok, settings > Build,Execution,Deployment > Compiler > Annotation Processor 開啟 Enable annotation processing
我在云端部署了一個 mqttx
單例服務(wù)骂际,可供功能測試:
- 不支持 ssl
- 開啟了 websocket, 可通過 http://tools.emqx.io/ 測試,僅需將域名修改為:
119.45.158.51
(端口冈欢、地址不變) - 支持 共享訂閱功能
- 部署版本
v1.0.4.RELEASE
架構(gòu)
由于 mqttx
額外添加了客戶端認(rèn)證歉铝、topic 發(fā)布/訂閱鑒權(quán)功能,如果需要配套使用凑耻,建議的架構(gòu)如下圖:
客戶認(rèn)證服務(wù)由使用者自行實(shí)現(xiàn)
內(nèi)部實(shí)現(xiàn)框架關(guān)系(僅列出關(guān)鍵項(xiàng)):
目錄結(jié)構(gòu):
├─java
│ └─com
│ └─jun
│ └─mqttx
│ ├─broker mqtt 協(xié)議實(shí)現(xiàn)及處理包
│ │ ├─codec 編解碼
│ │ └─handler 消息處理器(pub, sub, connn, etc)
│ ├─config 配置太示,主要是 bean 聲明
│ ├─constants 常量
│ ├─consumer 集群消息消費(fèi)者
│ ├─entity 實(shí)體類
│ ├─exception 異常類
│ ├─service 業(yè)務(wù)服務(wù)(用戶認(rèn)證, 消息存儲等)接口
│ │ └─impl 默認(rèn)實(shí)現(xiàn)
│ └─utils 工具類
└─resources 資源文件(application.yml 在此文件夾)
└─tls ca 存放地址
容器化部署
為了方便項(xiàng)目快速的部署,引進(jìn) docker
- 執(zhí)行本地部署動作前香浩,需要先下載docker类缤。
- docker-compose 文件中寫死了端口映射(
1883, 8083
), 如果你修改了mqttx
的端口配置弃衍,則docker-compose.yml
中也應(yīng)修改
- 通過IDE提供的打包功能將項(xiàng)目打包為 target/*.jar
- 進(jìn)入 dockerfile 同級目錄呀非,執(zhí)行
docker build -t mqttx:v1.0.4.RELEASE .
- 執(zhí)行 docker-compose up
功能說明
1、 qos 支持
qos0 | qos1 | qos2 |
---|---|---|
支持 | 支持 | 支持 |
為支持 qos1镜盯、qos2岸裙,引入 redis
作為持久層,這部分已經(jīng)封裝成接口速缆,可自行替換實(shí)現(xiàn)(比如采用 mysql
)降允。
2、topicFilter 支持
- 支持多級通配符
#
與單級通配符+
艺糜,不支持通配符$
- 不支持以
/
開頭的topic剧董,比如 /a/b 會被判定為非法 topic,請改為 a/b破停。 - 不支持以
/
結(jié)尾的topic翅楼,比如 a/b/,請改為 a/b真慢。 - 其它規(guī)則見 mqtt v3.1.1 4.7 Topic Names and Topic Filters
ps:實(shí)際上 mqttx 僅對訂閱 topicFilter 進(jìn)行校驗(yàn)毅臊,publish 的 topic 是沒有做合法性檢查的。
舉例:
topicFilter | match topics |
---|---|
a/b/+ | a/b/abc |
a/b/# | a/b/abc, a/b/c/def |
a/+/b/# | a/nani/b/abc |
+/a/b/+/c | aaa/a/b/test/c |
校驗(yàn)工具類為:com.jun.mqttx.utils.TopicUtis
3黑界、集群支持
項(xiàng)目引入 redis pub/sub
分發(fā)消息以支持集群功能管嬉。如果需要修改為 kafka
或其它 mq ,需要修改配置類 ClusterConfig
及替換實(shí)現(xiàn)類 InternalMessageServiceImpl
朗鸠。
-
mqttx.cluster.enable
:功能開關(guān)蚯撩,默認(rèn)false
4、ssl支持
開啟 ssl 你首先應(yīng)該有了ca烛占,然后修改 application.yml
文件中幾個配置:
-
mqttx.ssl.enable
:功能開關(guān)胎挎,默認(rèn)false
,同時控制websocket
與socket
-
mqttx.ssl.key-store-location
: 證書地址忆家,基于classpath
-
mqttx.ssl.key-store-password
: 證書密碼 -
mqttx.ssl.key-store-type
: keystore 類別呀癣,如PKCS12
5、topic 安全機(jī)制
為了對 client 訂閱 topic 進(jìn)行限制弦赖,項(xiàng)目引入了簡單的 topic 訂閱&發(fā)布鑒權(quán)機(jī)制:
-
mqttx.enable-topic-sub-pub-secure
: 功能開關(guān)项栏,默認(rèn)false
- 使用時需要同步實(shí)現(xiàn)接口
AuhenticationService
,該接口返回對象中含有authorizedSub,authorizedPub
存儲 client 被授權(quán)訂閱及發(fā)布的topic
列表蹬竖。 - broker 在消息訂閱及發(fā)布都會校驗(yàn)客戶端權(quán)限
6沼沈、共享訂閱機(jī)制
共享訂閱是 mqtt5
協(xié)議規(guī)定的內(nèi)容,很多 MQ 都有實(shí)現(xiàn)币厕。mqttx
的實(shí)現(xiàn)也是基于 mqtt5
列另。
-
mqttx.share-topic.enable
: 功能開關(guān),默認(rèn)true
- 格式:
$share/{ShareName}/{filter}
,$share
為前綴,ShareName
為共享訂閱名,filter
就是非共享訂閱主題過濾器旦装。 - 目前支持
hash
,random
,round
三種規(guī)則
7页衙、websocket 支持
路線圖
基于我個人的認(rèn)知,mqttx
接下來可能的開發(fā)計劃:
- 集群態(tài)考慮整合服務(wù)注冊的功能,便于管理集群狀態(tài)店乐,可能會使用
consul
艰躺,做不做看我后面的想法吧 -
mqtt5
有一個消息過期功能,感覺有點(diǎn)用眨八,但這個特新依賴variableHeader properties
腺兴,貌似基于mqttv3.1.1
沒法實(shí)現(xiàn)? - bug fix and optimization廉侧,這個會一直繼續(xù)的页响,不過主要靠使用和學(xué)習(xí)
mqttx
的同學(xué)反饋問題給我(沒反饋我就當(dāng)沒有唄~攤手.jpg) - 目前正在開發(fā)基于
vue2.0
,element-ui
的 mqttx-admin 管理平臺,mqttx
的功能更新會暫停一段時間(最近在看 mqtt5)段誊。
項(xiàng)目開發(fā)過程中發(fā)現(xiàn)需要對mqttx
做一些改動闰蚕,但這些改動不應(yīng)該 push 給 mqttx master(比如 topic 安全認(rèn)證這個功能需要配合mqttx-platform
,我可能會引入 Retrofit 處理接口調(diào)用连舍,其實(shí)可以用feign
没陡,我覺的這兩個都差不多),我應(yīng)該會開一個業(yè)務(wù) branch 處理這個事情烟瞧。話說javascript
寫項(xiàng)目可太爽了诗鸭,以前怎么不覺得? -
mqttx
還沒壓測過,算了参滴,看心情吧~ (有同學(xué)幫忙不强岸?)
演示項(xiàng)目 lineyou - 服務(wù)端基于mqttx
lineyou 基于 javafx
開發(fā),運(yùn)用 netty砾赔、spring蝌箍、fxlauncher、jfoniex暴心、fontawesomefx妓盲、protobuf
等技術(shù)實(shí)現(xiàn)的 im 程序,具備基本的聊天交互功能专普。
可通過地址 https://wws.lanzous.com/ifPKretv6za 下載后解壓運(yùn)行