EMQX是基于MQTT的,在学习EMQX之前要对MQTT有一定的了解;
MQTT 可参考 : MQTT的使用-CSDN博客
EMQX的官网:EMQX: The #1 MQTT Platform for IoT, IIoT and Connected Cars
EMQX的安装:
我使用的是centos7系统,安装文件如下根据自己系统下载: https://pan.baidu.com/s/13mpnbj8wZxn6Z5ca2QhIHA?pwd=v6lj
安装:[root@docker emqx]# rpm -ivh emqx-centos7-v4.0.5.x86_64.rpm
启动:[root@docker emqx]# emqx start
![](https://i-blog.csdnimg.cn/direct/8742e2c958a5465bbaeca32334da97f6.png)
EMQX在MQTT的基础上拓展了一些功能:
1、控制台面板
就是访问上面的18083端口,面板中的菜单建单说明一下:
1、 ADMIN --> settings 设置控制台的背景色、语言,这里切换成中文;
2、监控-->控制台 查看运行的EMQX节点信息,连接的客户端、消息发布及订阅的总数
3、监控-->客户端 当前连接EMQX的客户端列表
4、监控-->主题 主题和节点对应关系,在EMQX集群中由某些节点负责某些topic的数据转发
5、监控-->订阅 订阅者订阅的topic以及qos
6、规则引擎,在规则中可以写sql语句对收集的数据做过滤,在 资源 中将过滤后的数据转发到其他地方(比如业务处理系统),规则引擎在实际操作中经常遇到;
7、管理-->插件 EMQX自带了的插件都在这里展示,如acl鉴权等,当需要用到对应的插件时在这里启动插件;
8、管理-->监听器 EMQX常用的监听端口,启动后的端口如下,如果和这个不一样需要考虑端口是不是被占用了
9、工具-->Websocket 客户端模拟工具,可以在这里向EMQX发布订阅消息
10、工具-->HTTP接口 EMQX提供的方法,可以通过这些方法添加用户、修改密码等
2、认证:
客户端连接broker时对客户端做的身份认证,包括 username、clientId、http认证等;
在启用认证之前需要修改 etc/emqx.conf 的 allow_anonymous = true ,如果是false则表示任何客户端都能连接,改为true则表示只能认证成功才能连接,修改配置后需要重启EMQX;
username认证:在 管理-->插件 菜单中启用 emqx_auth_username 插件,然后调用 工具-->HTTP接口 中提供的接口创建用户,我这里使用vscode新建 text 文件进行调用,创建用户成功后就可以使用创建的用户连接EMQX broker;
clientId认证:认证流程和username一样,需要启动emqx_auth_clientid插件,每个客户端连接EMQX的时候需要指定唯一的clientId,校验clientId和password正确即可连接,工具-->HTTP接口 也提供了新建clientId的方法;
http认证:在EMQX的配置文件中制定 http认证的地址(一个外部接口),当这个接口返回200时表示认证成功,否则表示认证失败;
可以多个认证并存,当返回200并且消息体中没有ignore表示认证通过、返回4xx表示认证失败、返回200但是消息体中有 ignore 表示认证不通过给下一个认证方法认证;
3、MQTT客户端:
在我们日常开发中,需要引入对应的客户端才能使用MQTT的功能,这里说一下java的客户端 Eclipse Paho Java 和前端的 客户端 MQTT.js,在代码中有demo,直接参考代码即可;
链接:https://pan.baidu.com/s/13NDYwRheAPdYRE9z3CpMcw?pwd=6ndp
修改application.yml中的EMQX 服务端配置,运行 App 中的main即可连接服务端发消息,index.html中通过浏览器打开这个页面实现消息的发送;
4、日志配置:
参考文章最后面的课件链接,第二章最后面部分;
5、ACL规则:
前面说的认证是基于username、clientId 等客户端的维度进行校验,EMQX还支持在topic的维度允许 生产者、订阅者 生产或订阅数据;
规则如下:允许(Allow) / 拒绝(Deny)" "谁(Who)" "订阅(Subscribe) / 发布(Publish)" "主题列表(Topics)"
如:{allow, {user, "user1"}, subscribe, ["$SYS/#"]} 允许用户 user1 订阅 $SYS/# 主题
6、WebHook:
钩子函数,当客户端向服务端发起请求后,服务端会做出一些响应,可以捕获这些响应做一些操作,如当客户端连接broker成功时调用连接成功的钩子函数记录连接的clientId,断开时删除clientId,这样就可以统计连接broker的客户端数量,不同的钩子函数通过 action 区分;详见课件第三章中的 WebHook;
7、EMQX集群:
EMQX集群中的每个节点都会与其他节点建立TCP连接,当有新节点加入时也会与其他节点建立连接,只有cookie(etc/emqx.conf中的node.cookie )一致的节点才能建立集群
生产者将数据发到集群中的某一个节点,订阅者订阅的是其他节点,为了实现这种场景下的数据传递,EMQX通过一下几个功能实现:
1、订阅表,在某个节点上维护,记录了所有的订阅者、topic及节点关系
node1:
topic1 -> client1, client2
topic2 -> client3`
node2:
topic1 -> client4
2、路由表,所有节点都会存储一份,生产者发消息过来的时候将消息发到对应的节点
topic1 -> node1, node2
topic2 -> node3
topic3 -> node2, node4
3、主题树,所有节点都会存储一份,带通配符的主题匹配,用于推送消息到订阅者
具体过程参考课件第三章中的EMQX集群;
8、共享订阅:
如果生产者发布的消息,在后端有多个应用需要订阅,此时就用到了共享订阅, 共享订阅有两种实现,$share 和 $queue,如下 S1 S2 S3订阅了 $share/g1/topic ,g1表示这三个订阅者在g1分组,topic的消息只会发到这三个节点中的某一个节点(使用随机算法);S4 S5在不同分组,消息也会发到这两个节点中的某一个节点;
$queue 没有分组的概念,所有的共享节点都会收到一份数据,$queue/topic;
9、延迟发布
需要开启插件 emqx-delay-publish
格式如下:$delayed/{DelayInterval}/{TopicName} ,DelayInterval表示延迟时间,单位秒;
当生产者将消息发到 broker 后,broker延迟一段时间将数据发到订阅者端;
10、规则引擎
EMQX中提供了规则引擎对数据进行过滤,类似SQL语句,topic类似数据库表,clientId及消息体内容类似数据库中的字段;
使用方法,在控制台 规则引擎-->资源 中创建一个资源,资源类型选择 WebHook 也就是Http接口,填写接口的url等,然后在 规则引擎-->规则 中创建规则并在响应动作中选择创建的资源,这样SQL过滤后的数据就会发到资源中维护的接口中;
参考课件第五章中的规则引擎;
EMQX支持单机百万个客户端的连接,能支持多少个客户端同时发送数据跟还要通过压测工具进行测试,压测工具:http://github.com/emqx/emqtt_bench
以上内容全部来源黑马的课程,课程地址:1.介绍_哔哩哔哩_bilibili
课程的课件见:链接:https://pan.baidu.com/s/13mUN_VOvJbzI_HmwkY3GVg?pwd=4rk8
课程都是免费的,黑马良心!!!