EMQ X Kuiper 是一款基于 SQL 的轻量级物联网流式数据处理软件,提供了一套插件机制用于实现自定义源(source),目标(sink)以及 SQL 函数(function)以扩展流处理功能。本教程详细介绍了 Kuiper 插件的开发编译和部署过程。
概览
Kuiper 插件基于 Go 语言的插件机制,用户可以构建松散耦合的插件程序,在运行时动态加载和绑定。但是,由于 GO 语言插件系统的限制, Kuiper 插件的编译和使用也有相应的限制:
- 插件不支持 windows 系统
- 插件编译环境要求跟 Kuiper 编译环境尽量一致,包括但不限于
- 相同的 GO 版本
- 插件与 Kuiper 自身依赖的相同包版本必须完全一致,包括 Kuiper 自身
- 插件与 Kuiper 编译环境的 GOPATH 必须完全一致
这些限制较为苛刻,几乎要求插件和 Kuiper 在同一台机器编译运行,经常导致开发环境编译出的插件无法在生产 Kuiper 上使用。本文详细介绍了一种切实可用的插件开发环境设置和流程,推荐给 Kuiper 插件开发者使用。插件的开发和使用一般有如下流程:
- 开发
- 创建并开发插件项目
- 编译调试插件
- 部署
- 编译生产环境可用插件
- 部署插件到生产环境
插件开发
插件开发一般在开发环境中进行。在开发环境调试运行通过后再部署到生产环境中。
创建并开发插件项目
Kuiper 项目源代码的 plugins 目录下有一些插件范例。用户自定义的插件也可以在 Kuiper 项目中开发。但是为了便于代码管理,一般应当在 Kuiper 项目之外另建项目开发自定义插件。插件项目建议使用 Go module,典型的项目目录如下图所示:
plugin_project
sources //源(source)插件源代码目录
mysource.go
sinks //目标(sink)插件源代码目录
mysink.go
functions //函数(function)插件源代码目录
myfunction.go
target //编译结果目录
go.mod //go module文件
插件开发需要扩展 Kuiper 内的接口,因此必须依赖于 Kuiper 项目。最简单的 go.mod 也需要包含对 Kuiper 的依赖。典型的 go.mod 如下:
module samplePlugin
go 1.13
require (
github.com/emqx/kuiper v0.0.0-20200323140757-60d00241372b
)
Kuiper 插件有三种类型,源代码可放入对应的目录中。插件开发的详细方法请参看 EMQ X Kuiper 扩展。本文以目标(sink)为例,介绍插件的开发部署过程。我们将开发一个最基本的 MySql 目标,用于将流输出写入到 MySql 数据库中。
- 新建名为 samplePlugin 的插件项目,采用上文的目录结构
- 在 sinks 目录下,新建 mysql.go 文件
- 编辑 mysql.go 文件以实现插件
- 实现 api.Sink接口
- 导出 Symbol:Mysql
- 编辑 go.mod, 添加 mysql 驱动模块
mysql.go 完整代码如下
package main
import (
"database/sql"
"fmt"
"github.com/emqx/kuiper/xstream/api"
_ "github.com/go-sql-driver/mysql"
)
type mysqlSink struct {
url string
table string
db *sql.DB
}
func (m *mysqlSink) Configure(props map[string]interface

最低0.47元/天 解锁文章
260

被折叠的 条评论
为什么被折叠?



