总体结构
etl-engine不仅是一个数据交换工具,它还可以充当你的开发工具,通过部署etl-engine并在其中嵌入go脚本,你可以去实现大部分数据层面的开发,当然什么都要有个度,适度就好。
第三方系统调用etl-engine
- etl-crontab暴露Http/Https API接口
第三方系统可通过Http/Https方式调用上述接口运行etl-engine - etl-engine运行HttpInput节点实现阻塞模式
第三方系统可通过Http/Https方式向etl-engine提交数据 - etl-engine运行MQ消费者节点实现阻塞模式
第三方系统可通过MQ生产者向etl-engine发送消息数据
etl-engine实现嵌入脚本
节点类型 | 节点描述 | 标签名称 | 接口格式 | 说明 |
---|---|---|---|---|
Node | 输出节点 | BeforeOut | func RunScript(dataValue string) (result string, topErr error) {} | 数据写操作之前,可进行数据转换或其它操作 |
Node | 输出节点 | AfterOut | func RunScript(dataValue string) (result string, topErr error) {} | 数据写操作之后,可进行其它操作 |
Node | 转换节点 | BeforeOut | func RunScript(dataValue string) (result string, topErr error) {} | 数据输出之前,可进行数据转换或其它操作。 |
Node | CUSTOM_READER_WRITER节点 | AfterOut | func RunScript() (result string, topErr error) {} | 属于独立的一个自定义节点,只能输出到垃圾桶节点,此标签内可进行其它操作。 |
Line | 线节点 | BeforeRun | func RunScript() (result bool, topErr error) {} | 进行流程执行之前的判断工作,返回true就可以向下执行,返回false就退出向下执行。 |
脚本编写规则
- 根据对应标签名称去实现相应的接口,如上所述标签名称:
<BeforeOut/>
<AfterOut/>
<BeforeRun/>
- 脚本内包名称格式固定
package ext
- 根据实际需要引入常用工具包
import (
"errors"
"fmt"
"strconv"
"time"
"github.com/tidwall/gjson"
"github.com/tidwall/sjson"
"etl-engine/etl/tool/extlibs/common"
)
- 实现对应的接口
func RunScript() (result bool, topErr error) {
fmt.Println("common.GlobalVar.Vint:",common.GlobalVar.Vint)
if ( common.GlobalVar.Vint < 8 ){
fmt.Println("返回false")
return false,nil
}else{
fmt.Println("返回true")
return true,nil
}
}
公共变量
- 公共变量的生命周期作用于每个etl-engine任务运行开始到运行结束之间。
- 引入包 “etl-engine/etl/tool/extlibs/common”
- 该包所提供的公共变量
- GlobalVar
Vint int64
Vbool bool
Vstring string
Vfloat float64
Vmap map[string]string
Vinteface interface{}
ViArray []int64
VsArray []string
VbArray []bool
VfArray []float64
- 脚本中调用公共变量
common.GlobalVar.Vint = common.GlobalVar.Vint + 1
fmt.Println("common.GlobalVar.Vint:",common.GlobalVar.Vint)