多语言 - 钩子扩展
- 客户端接入的认证授权
- 消息的持久化,桥接
- 发布/订阅,或者客户端上下线事件的通知处理
emqx-exhook 使用 作为 RPC 的通信框架。
架构如下图:
它表明:EMQX 作为一个 gRPC 客户端,将系统中的钩子事件发送到用户的 gRPC 服务端。
和 EMQX 原生的钩子一致,它也支持链式的方式计算和返回:
其中 HookProvider 部分:
OnProviderLoaded
:定义 HookProvider 如何被加载,返回需要挂载的钩子列表。仅在该列表中的钩子会被回调到 HookProivder 服务。OnProviderUnloaded
:通知用户该 HookProvier 已经从 emqx 中卸载。
钩子事件部分:
- 仅 ,
OnClientCheckAcl
,OnMessagePublish
允许携带返回值到 EMQX 系统,其它回调则不支持。 - 特定的,对于 message 类型的钩子:
message.publish
,message.delivered
,message.acked
, ,可以在返回钩子列表时,为这些钩子携带主题过滤器列表。 那么在触发消息事件时,仅有主题能够匹配主题过滤器列表中任意过滤器的消息,会被发送到用户的 gRPC 服务端。
通过这样的方式,gRPC 服务端可以仅处理自己关心的主题下的消息,以避免多余的 gRPC 请求消耗。
其中接口和参数数据结构的详情参考:
提示
需要注意的是,EMQX 仅在 HookProvider 被加载时确认一次需要加载的钩子以及 message 钩子所配置的主题过滤器列表,之后的 gRPC 请求都以将以加载时的为准。
如果需要挂载的钩子列表有变更,或 message 类型钩子所关心的主题过滤器列表有变更,都需要重新加载。即需要在 EMQX 中重启 ExHook 插件/模块。
其步骤如下:
- 拷贝
lib/emqx_exhook-<x.y.z>/priv/protos/exhook.proto
文件到你的项目中。 - 使用对应编程语言的 gRPC 框架,生成
exhook.proto
的 gRPC 服务端的代码。
开发完成后,需将该服务部署到与 EMQX 能够通信的服务器上,并保证端口的开放。
然后修改 etc/plugins/emqx_exhook.conf
中的服务器配置,例如:
启动 emqx_exhook
插件,观察输出。
其中各个语言的 gRPC 框架可参考: