SMQTT是一款開源的MQTT訊息代理Broker,
SMQTT基於Netty開發,底層採用Reactor3反應堆模型,支援單機部署,支援容器化部署,具備低延遲,高吞吐量,支援百萬TCP連線,同時支援多種協議互動,是一款非常優秀的訊息中介軟體!
smqtt目前擁有的功能如下:
- 訊息質量等級實現(支援qos0,qos1,qos2)
- 會話訊息
- 保留訊息
- 遺囑訊息
- 客戶端認證
- tls加密
- websocket協議支援
- http協議互動
- SPI介面擴充套件支援
- 訊息管理介面(會話訊息/保留訊息管理)
- 通道管理介面 (管理系統的客戶端連線)
- 認證介面 (用於自定義外部認證)
- 攔截器 (使用者自定義攔截訊息)
- 叢集支援(gossip協議實現)
- 容器化支援
- 持久化支援(session 保留訊息)
- 管理系統
main方式啟動
引入依賴
<dependency>
<groupId>io.github.quickmsg</groupId>
<artifactId>smqtt-core</artifactId>
<version>1.0.6</version>
</dependency>
阻塞式啟動服務:
Bootstrap.builder()
.rootLevel(Level.INFO)
.wiretap(false)
.port(8555)
.websocketPort(8999)
.options(channelOptionMap -> { })//netty options設定
.childOptions(channelOptionMap -> { }) //netty childOptions設定
.highWaterMark(1000000)
.reactivePasswordAuth((U, P) -> true)
.lowWaterMark(1000)
.ssl(false)
.sslContext(new SslContext("crt", "key"))
.isWebsocket(true)
.httpOptions(Bootstrap.HttpOptions.builder().enableAdmin(true).ssl(false).accessLog(true).build())
.clusterConfig(
ClusterConfig.builder()
.clustered(false)
.port(7773)
.nodeName("node-2")
.clusterUrl("127.0.0.1:7771,127.0.0.1:7772")
.build()
)
.build()
.startAwait();
非阻塞式啟動服務:
Bootstrap bootstrap = Bootstrap.builder()
.rootLevel(Level.INFO)
.wiretap(false)
.port(8555)
.websocketPort(8999)
.options(channelOptionMap -> { })//netty options設定
.childOptions(channelOptionMap -> { }) //netty childOptions設定
.highWaterMark(1000000)
.reactivePasswordAuth((U, P) -> true)
.lowWaterMark(1000)
.ssl(false)
.sslContext(new SslContext("crt", "key"))
.isWebsocket(true)
.httpOptions(Bootstrap.HttpOptions.builder().enableAdmin(true).ssl(false).accessLog(true).build())
.clusterConfig(
ClusterConfig.builder()
.clustered(false)
.port(7773)
.nodeName("node-2")
.clusterUrl("127.0.0.1:7771,127.0.0.1:7772")
.build()
)
.build()
.start().block();
jar方式
- 下載原始碼 mvn compile package -Dmaven.test.skip=true -P jar,web
在smqtt-bootstrap/target目錄下生成jar
- 準備配置檔案 config.properties
# 日誌級別 ALL|TRACE|DEBUG|INFO|WARN|ERROR|OFF
smqtt.log.level=INFO
# 開啟tcp埠
smqtt.tcp.port=1883
# 高水位
smqtt.tcp.lowWaterMark=4000000
# 低水位
smqtt.tcp.highWaterMark=80000000
# 開啟ssl加密
smqtt.tcp.ssl=false
# 證書crt smqtt.tcp.ssl.crt =
# 證書key smqtt.tcp.ssl.key =
# 開啟日誌
smqtt.tcp.wiretap=false
# boss執行緒
smqtt.tcp.bossThreadSize=4
# work執行緒
smqtt.tcp.workThreadSize=8
# websocket埠
smqtt.websocket.port=8999
# websocket開啟
smqtt.websocket.enable=true
# smqtt使用者
smqtt.tcp.username=smqtt
# smqtt密碼
smqtt.tcp.password=smqtt
# 開啟http
smqtt.http.enable=true
# 開啟http日誌
smqtt.http.accesslog=true
# 開啟ssl
smqtt.http.ssl.enable=false
# smqtt.http.ssl.crt =
# smqtt.http.ssl.key =
# 開啟管理後臺(必須開啟http)
smqtt.http.admin.enable=true
# 管理後臺登入使用者
smqtt.http.admin.username=smqtt
# 管理後臺登入密碼
smqtt.http.admin.password=smqtt
# 開啟叢集
smqtt.cluster.enable=false
# 叢集節點地址
smqtt.cluster.url=127.0.0.1:7771,127.0.0.1:7772
# 節點埠
smqtt.cluster.port=7771
# 節點名稱
smqtt.cluster.node=node-1
# 容器叢集對映主機
# smqtt.cluster.external.host = localhost
# 容器叢集對映port
# smqtt.cluster.external.port
- 啟動服務
java -jar smqtt-bootstrap-1.0.1-SNAPSHOT.jar <conf.properties路徑>
docker 方式
拉取映象
# 拉取docker映象地址
docker pull 1ssqq1lxr/smqtt:latest
啟動映象預設配置
# 啟動服務
docker run -it -p 1883:1883 1ssqq1lxr/smqtt
啟動映象使用自定義配置(同上準備配置檔案conf.properties)
# 啟動服務
docker run -it -v <配置檔案路徑目錄>:/conf -p 1883:1883 -p 1999:1999 1ssqq1lxr/smqtt
測試服務(啟動http埠)
啟動客戶端訂閱主題 test/+
使用http介面推送mqtt訊息
# 推送訊息
curl -H "Content-Type: application/json" -X POST -d '{"topic": "test/teus", "qos":2, "retain":true, "message":"我來測試保留訊息3" }' "http://localhost:1999/smqtt/publish"
管理後臺(60000埠)
如何開啟
main啟動
設定httpOptions && enableAdmin = true
Bootstrap.httpOptions(Bootstrap.HttpOptions.builder().enableAdmin(true).ssl(false).accessLog(true).build())
jar / docker 啟動
設定config.properties
# 開啟http
smqtt.http.enable=true
# 開啟http日誌
smqtt.http.accesslog=true
# 開啟ssl
smqtt.http.ssl.enable=false
# smqtt.http.ssl.crt =
# smqtt.http.ssl.key =
# 開啟管理後臺(必須開啟http)
smqtt.http.admin.enable=true
# 管理後臺登入使用者
smqtt.http.admin.username=smqtt
# 管理後臺登入密碼
smqtt.http.admin.password=smqtt
頁面預覽
壓測文件
wiki地址
叢集類配置參考文件: