mqttx 基于 mqtt v3.1.1 官方协议文档开发。
项目运行的方式:
-
使用
springboot推荐的启动方式java -jar app.jar,使用mvn clean package打包,这种方式需要修改配置文件(resources/application.yml)中 redis 地址和端口。mqttx default redis 连接使用的配置:
localhost:6379无密码 -
基于
docker容器化部署,这个就比较简单,具体的步骤见 容器化部署
中间件依赖:
- redis
由于 mqttx 额外添加了客户端认证、topic 发布/订阅鉴权功能,如果需要配套使用,建议的架构如下图:
客户认证服务由使用者自行实现
内部实现框架关系(仅列出关键项):
目录结构:
├─java │ └─com │ └─jun │ └─mqttx │ ├─broker -- mqttx broker │ │ └─handler -- mqtt 消息处理器(pub, sub, conn, disconnect, etc) │ ├─common │ │ ├─config -- 项目配置,Spring Bean 声明 │ │ └─constant -- 常量,枚举等 │ ├─consumer -- 集群消息接收 │ ├─entity -- pojo │ ├─exception -- 异常包 │ ├─service -- 服务。用户认证,pub/sub 消息存储(Qos1,2)等等 │ │ └─impl -- 项目默认实现 │ └─utils -- 一些工具类 └─resources -- 资源文件夹
为了方便项目快速的跑起来,引进了docker来方便项目的部署
执行本地部署动作前,需要先下载docker
- 通过IDE提供的打包功能将项目打包为 target/*.jar
- 进入 dockerfile 同级目录,执行
docker build -t mqttx:v0.1 . - 执行 docker-compose up
| qos0 | qos1 | qos2 |
|---|---|---|
| 支持 | 支持 | 支持 |
为支持 qos1、qos2,引入 redis 作为持久层,这部分已经封装成接口,可自行替换实现(比如采用 mysql)。
- 支持多级通配符
#与单级通配符+,不支持通配符$ - 不支持以
/开头的topic,比如 /a/b 会被判定为非法 topic,请改为 a/b。 - 不支持以
/结尾的topic,比如 a/b/,请改为 a/b。 - 其它规则见 mqtt v3.1.1 4.7 Topic Names and Topic Filters
ps:实际上 mqttx 仅对订阅 topicFilter 进行校验,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 |
校验工具类为:com.jun.mqttx.utils.TopicUtis
项目引入 redis pub/sub 分发消息以支持集群功能。如果需要修改为 kafka 或其它 mq ,需要修改配置类 ClusterConfig 及替换实现类 InternalMessageServiceImpl。
application.yml 中的 biz.enable-cluster 为集群功能开关,默认关
开启 ssl 你首先应该有了ca,然后修改 application.yml 文件中几个配置:
biz.key-store-location: 证书地址,基于classpathbiz.ssl-enable: 功能开关,默认falsebiz.key-store-password: 证书密码
为了对 client 订阅 topic 进行限制,项目引入了简单的 topic 订阅&发布鉴权机制:
biz.enable-topic-sub-pub-secure: 功能开关,默认false- 使用时需要同步实现接口
AuhenticationService,该接口返回对象中含有authorizedSub,authorizedPub存储 client 被授权订阅及发布的topic列表。 - broker 在消息订阅及发布都会校验客户端权限
基于我个人的认知,mqttx 接下来可能的开发计划:
考虑整合SpringCloud- bug fix and optimization
如果你对 mqttx 项目有更好的意见或建议,可以通过邮箱联系我:[email protected]
lineyou 基于 javafx开发,运用 netty、spring、fxlauncher、jfoniex、fontawesomefx、protobuf 等技术实现的 im 程序,具备基本的聊天交互功能。
可通过地址 https://wws.lanzous.com/ifPKretv6za 下载后解压运行





