易于使用的 MQTT 服務(wù)端拦耐,支持主題安全、共享主題

項(xiàng)目地址 Mqttx Project
)

mqttx 基于 mqtt v3.1.1 官方協(xié)議文檔開發(fā)见剩。
項(xiàng)目運(yùn)行的方式:

  1. 使用springboot推薦的啟動方式 java -jar app.jar杀糯,使用 mvn clean package 打包,這種方式需要修改配置文件(resources/application.yml)中 redis 地址和端口苍苞。

    mqttx default redis 連接使用的配置:localhost:6379 無密碼

  2. 基于 docker 容器化部署固翰,這個就比較簡單,具體的步驟見 容器化部署

中間件依賴:

  1. redis

其他依賴:

  1. 項(xiàng)目使用了 lombok羹呵,使用 ide 請安裝對應(yīng)的插件

舉例:idea 需要安裝插件 Lombok, settings > Build,Execution,Deployment > Compiler > Annotation Processor 開啟 Enable annotation processing

我在云端部署了一個 mqttx 單例服務(wù)骂际,可供功能測試:

  1. 不支持 ssl
  2. 開啟了 websocket, 可通過 http://tools.emqx.io/ 測試,僅需將域名修改為:119.45.158.51(端口冈欢、地址不變)
  3. 支持 共享訂閱功能
  4. 部署版本 v1.0.4.RELEASE
websocket

架構(gòu)

由于 mqttx 額外添加了客戶端認(rèn)證歉铝、topic 發(fā)布/訂閱鑒權(quán)功能,如果需要配套使用凑耻,建議的架構(gòu)如下圖:

架構(gòu)圖

客戶認(rèn)證服務(wù)由使用者自行實(shí)現(xiàn)

內(nèi)部實(shí)現(xiàn)框架關(guān)系(僅列出關(guān)鍵項(xiàng)):

ak6mB6.png

目錄結(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

  1. 執(zhí)行本地部署動作前香浩,需要先下載docker类缤。
  2. docker-compose 文件中寫死了端口映射(1883, 8083), 如果你修改了 mqttx 的端口配置弃衍,則 docker-compose.yml 中也應(yīng)修改
  1. 通過IDE提供的打包功能將項(xiàng)目打包為 target/*.jar
  2. 進(jìn)入 dockerfile 同級目錄呀非,執(zhí)行 docker build -t mqttx:v1.0.4.RELEASE .
  3. 執(zhí)行 docker-compose up

功能說明

1、 qos 支持

qos0 qos1 qos2
支持 支持 支持

為支持 qos1镜盯、qos2岸裙,引入 redis 作為持久層,這部分已經(jīng)封裝成接口速缆,可自行替換實(shí)現(xiàn)(比如采用 mysql)降允。

2、topicFilter 支持

  1. 支持多級通配符 #與單級通配符 +艺糜,不支持通配符 $
  2. 不支持以 / 開頭的topic剧董,比如 /a/b 會被判定為非法 topic,請改為 a/b破停。
  3. 不支持以 /結(jié)尾的topic翅楼,比如 a/b/,請改為 a/b真慢。
  4. 其它規(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朗鸠。

ak6nHK.png
  1. mqttx.cluster.enable:功能開關(guān)蚯撩,默認(rèn) false

4、ssl支持

開啟 ssl 你首先應(yīng)該有了ca烛占,然后修改 application.yml 文件中幾個配置:

  1. mqttx.ssl.enable:功能開關(guān)胎挎,默認(rèn) false,同時控制 websocketsocket
  2. mqttx.ssl.key-store-location: 證書地址忆家,基于 classpath
  3. mqttx.ssl.key-store-password: 證書密碼
  4. mqttx.ssl.key-store-type: keystore 類別呀癣,如 PKCS12

5、topic 安全機(jī)制

為了對 client 訂閱 topic 進(jìn)行限制弦赖,項(xiàng)目引入了簡單的 topic 訂閱&發(fā)布鑒權(quán)機(jī)制:

  1. mqttx.enable-topic-sub-pub-secure: 功能開關(guān)项栏,默認(rèn) false
  2. 使用時需要同步實(shí)現(xiàn)接口 AuhenticationService ,該接口返回對象中含有 authorizedSub,authorizedPub 存儲 client 被授權(quán)訂閱及發(fā)布的 topic 列表蹬竖。
  3. broker 在消息訂閱及發(fā)布都會校驗(yàn)客戶端權(quán)限

6沼沈、共享訂閱機(jī)制

共享訂閱是 mqtt5 協(xié)議規(guī)定的內(nèi)容,很多 MQ 都有實(shí)現(xiàn)币厕。mqttx 的實(shí)現(xiàn)也是基于 mqtt5列另。

  1. mqttx.share-topic.enable: 功能開關(guān),默認(rèn) true
  2. 格式: $share/{ShareName}/{filter}, $share 為前綴, ShareName 為共享訂閱名, filter 就是非共享訂閱主題過濾器旦装。
  3. 目前支持 hash, random, round 三種規(guī)則

7页衙、websocket 支持

路線圖

基于我個人的認(rèn)知,mqttx 接下來可能的開發(fā)計劃:

  1. 集群態(tài)考慮整合服務(wù)注冊的功能,便于管理集群狀態(tài)店乐,可能會使用 consul艰躺,做不做看我后面的想法吧
  2. mqtt5 有一個消息過期功能,感覺有點(diǎn)用眨八,但這個特新依賴 variableHeader properties腺兴,貌似基于 mqttv3.1.1 沒法實(shí)現(xiàn)?
  3. bug fix and optimization廉侧,這個會一直繼續(xù)的页响,不過主要靠使用和學(xué)習(xí) mqttx 的同學(xué)反饋問題給我(沒反饋我就當(dāng)沒有唄~攤手.jpg)
  4. 目前正在開發(fā)基于 vue2.0, element-uimqttx-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)目可太爽了诗鸭,以前怎么不覺得?
  5. 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)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市檀夹,隨后出現(xiàn)的幾起案子筋粗,更是在濱河造成了極大的恐慌,老刑警劉巖炸渡,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娜亿,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚌堵,警方通過查閱死者的電腦和手機(jī)买决,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門沛婴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人督赤,你說我怎么就攤上這事嘁灯。” “怎么了够挂?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵旁仿,是天一觀的道長藕夫。 經(jīng)常有香客問我孽糖,道長,這世上最難降的妖魔是什么毅贮? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任办悟,我火速辦了婚禮,結(jié)果婚禮上滩褥,老公的妹妹穿的比我還像新娘病蛉。我一直安慰自己,他們只是感情好瑰煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布铺然。 她就那樣靜靜地躺著,像睡著了一般酒甸。 火紅的嫁衣襯著肌膚如雪魄健。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天插勤,我揣著相機(jī)與錄音沽瘦,去河邊找鬼。 笑死农尖,一個胖子當(dāng)著我的面吹牛析恋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盛卡,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼助隧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滑沧?” 一聲冷哼從身側(cè)響起并村,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚎货,沒想到半個月后橘霎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殖属,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年姐叁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡外潜,死狀恐怖原环,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情处窥,我是刑警寧澤嘱吗,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站滔驾,受9級特大地震影響谒麦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哆致,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一绕德、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摊阀,春花似錦耻蛇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漱牵,卻和暖如春夺蛇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背布疙。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工蚊惯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灵临。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓截型,卻偏偏與公主長得像,于是被迫代替她去往敵國和親儒溉。 傳聞我的和親對象是個殘疾皇子宦焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355