Emqx 是一个mqtt 的服务器产品。之前activemq可以作为mqtt协议的服务器,但是功能相对来说比较单一。Emqx作为跟Mqtt协议相关的新一代产品,功能实际上更为强大。
它的功能也主要体现在可视化/认证/规则/httpApi 上面。
1.Emqx 的安装
这里采用了docker 安装,作为dev 的单机版,使用docker 安装是比较快速的。
docker pull emqx/emqx:5.0.21
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0.21
上述的命令 启动了一个私有化的emqx,
emqx的后台是:http://localhost:18083 账户密码是admin/public。
使用 1883 端口的 TCP 类型监听器
使用 8883 端口的 SSL/TLS 安全连接类型监听器
使用 8083 端口的 WebSocket 类型监听器
使用 8084 端口的 WebSocket 安全类型监听器
但是这个好像只是测试版本,只能有10条链接。
2.可视化功能
可视化功能主要在 主题/订阅/客户端 这里,这个倒是很常见,任何一个具有后台管理功能的都会有这些东西.
3.认证
mqtt协议里面 有用户名和密码或者认证的body块.
刚刚安装好的emqx 是可以匿名连接上的.这是基于如下的这个设置.
刚刚安装好的emqx,也可以匿名直接发布消息和订阅的.这是基于这个配置.
它里面的配置如下:
%% 允许 "dashboard" 用户 订阅 "$SYS/#" 主题
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
%% 允许 IP 地址为 "127.0.0.1" 的用户 发布/订阅 "#SYS/#","#" 主题
{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
%% 拒绝 "所有用户" 订阅 "$SYS/#" "#" 主题
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
%% 允许其它任意的发布订阅操作
{allow, all}.
具体的可以看:https://docs.emqx.com/zh/enterprise/v4.4/modules/internal_acl.html#%E5%AE%9A%E4%B9%89-acl
这里的配置 从上到下,匹配哪个就算哪个,不再继续往下匹配.
所以这里明显意思就是,基本上都可以订阅和发布,但是对于 系统配置的主题 作了严格的限制,只允许本机发布,和用户为dashboard的进行订阅.
那么如果我们将刚才的匿名链接改成false, 内置访问控制不变.那就意味着必须有用户才能连上,连上后可以随意订阅和发布(当然$SYS除外)
但此时出现了一个问题,既然是非匿名,那么用户名密码放哪里?可以放在mysql里面,我们添加个mysqk的控制访问.这个mysql控制访问是比上面的内置访问控制 要功能多一点,也可以两者一起使用.
我们需要在一个mysql里面存放一个用户名密码表,也就是认证表
CREATE TABLE `mqtt_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`salt` varchar(35) DEFAULT NULL,
`is_superuser` tinyint(1) DEFAULT 0,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然后配置下,参考链接:https://docs.emqx.com/zh/enterprise/v4.4/modules/mysql_authentication.html#%E5%88%9B%E5%BB%BA%E6%A8%A1%E5%9D%97
注意上述图片中的认证语句就是我们存用户名密码表的查询语句。
注意上述图片中的访问控制SQL查询语句,实际上是可以代替上面的内置访问控制
在完成上述操作后,在数据库里面添加用户名密码,那么就只有用户名和密码的才能够链接上。
注意这个只是用户名密码的认证方式,在emqx里面有很多的认证方式,请自行查阅使用。
4规则
在使用activemq或者其他mq时候,作为消费者,接到复杂消息 需要进行判断处理。
这里的emqx 做了进一步的处理链路,可以判断消息是什么样的,然后根据判断条件 做出相关的操作。
比如说:
- 如果消息里面的数据包含type=aaa,那么将此消息通过http发送到http://localhost:8080/aaa 上
- 如果消息里面的数据 age > 10 ,那么将此消息 同步到 一个kafka 上面。
- 如果某个主题 被链接上了,那么将客户端的一些数据保存到mysql上面
ok,这个就是一个路由功能。
上述就是 监听t/# 主题 只要链接上,就执行一条插入语句。
这个规则学习可以查看一个B站视频:https://www.bilibili.com/video/BV19T4y1w7Nj?t=5.3
5http Api
EMQX 提供了 HTTP API 以实现与外部系统的集成,例如查询客户端信息、发布消息和创建规则等。