路由
# 创建Router
Router 是用来定义路由规则的类型,是各种Endpoint服务的路由抽象,它可以指定输入端、转换函数、处理函数、输出端等。
你可以使用NewRouter函数来创建一个Router类型的指针,然后使用From方法来指定输入端,返回一个From类型的指针。
router := endpoint.NewRouter().From("/api/v1/msg/")
# Router Options
创建Router是可以指定Options
endpoint.NewRouter(opts ...endpoint.RouterOption)
- WithRuleGoFunc 动态获取规则链池函数
endpoint.WithRuleGoFunc(f func(exchange *Exchange) *rulego.RuleGo)
- WithRuleGo 更改规则链池,默认使用rulego.DefaultRuleGo
endpoint.WithRuleGo(ruleGo *rulego.RuleGo)
- WithRuleConfig 更改规则引擎配置
endpoint.WithRuleConfig(config types.Config)
- WithContextFunc 构造路由context函数
endpoint.WithContextFunc(func(ctx context.Context, exchange *Exchange) context.Context)
# 添加处理函数
From类型有两个方法可以用来添加处理函数:Transform和Process。这两个方法都接收一个Process类型的函数作为参数,返回一个From类型的指针。
Transform方法用来转换输入消息为RuleMsg类型。
Process方法用来处理输入或输出消息。
Process类型的函数接收一个Exchange类型的指针作为参数,返回一个布尔值表示是否继续执行下一个处理函数。
Exchange类型是一个结构体,包含了一个输入消息和一个输出消息,用来在处理函数中传递数据。
router := endpoint.NewRouter().From("/api/v1/msg/").Transform(func(exchange *endpoint.Exchange) bool {
//转换逻辑
return true
}).Process(func(exchange *endpoint.Exchange) bool {
//处理逻辑
return true
})
2
3
4
5
6
7
# 响应
可以在转换或者处理函数使用Exchange的Out消息响应客户端
//响应错误
exchange.Out.SetStatusCode(http.StatusMethodNotAllowed)
//响应头
exchange.Out.Headers().Set("Content-Type", "application/json")
//响应内容
exchange.Out.SetBody([]byte("ok"))
2
3
4
5
6
注意:mqtt endpoint 调用SetBody() 会从使用指定topic 往broker public数据,指定topic使用以下方式
exchange.Out.Headers().Set("topic", "your topic")
# 设置输出端
From类型有两个方法可以用来设置输出端:To和ToComponent。这两个方法都返回一个To类型的指针。
- To方法用来指定流转目标路径或组件。
- ToComponent方法用来指定输出组件。
To方法的参数是一个字符串,表示组件路径,格式为{executorType}:{path}。executorType是执行器组件类型,path是组件路径。例如:"chain:{chainId}"表示执行rulego中注册的规则链,"component:{nodeType}"表示执行在config.ComponentsRegistry中注册的组件。
你可以在DefaultExecutorFactory中注册自定义执行器组件类型。To方法还可以接收一些组件配置参数作为可选参数。
router := endpoint.NewRouter().From("/api/v1/msg/").Transform(func(exchange *endpoint.Exchange) bool {
//转换逻辑
return true
}).To("chain:default")
2
3
4
ToComponent方法的参数是一个types.Node类型的组件,你可以自定义或使用已有的组件。
router := endpoint.NewRouter().From("/api/v1/msg/").Transform(func(exchange *endpoint.Exchange) bool {
//转换逻辑
return true
}).ToComponent(func() types.Node {
//定义日志组件,处理数据
var configuration = make(types.Configuration)
configuration["jsScript"] = `
return 'log::Incoming message:\n' + JSON.stringify(msg) + '\nIncoming metadata:\n' + JSON.stringify(metadata);
`
logNode := &action.LogNode{}
_ = logNode.Init(config, configuration)
return logNode
}())
2
3
4
5
6
7
8
9
10
11
12
13
也可以使用To方法调用组件
router := endpoint.NewRouter().From("/api/v1/msg/").Transform(func(exchange *endpoint.Exchange) bool {
//转换逻辑
return true
}).To"component:log", types.Configuration{"jsScript": `
return 'log::Incoming message:\n' + JSON.stringify(msg) + '\nIncoming metadata:\n' + JSON.stringify(metadata);
`})
2
3
4
5
6
# RuleContextOption
设置规则链执行上下文Options
# Wait
同步等待To组件执行结果,并恢复到父进程。例如:http endpoint 需要把规则链的处理结果响应给客户端,需要设置该语义,否则不要设置,会影响吞吐量。
# 结束路由
To类型有一个方法可以用来结束路由:End。End方法返回一个Router类型的指针。
router := endpoint.NewRouter().From("/api/v1/msg/").Transform(func(exchange *endpoint.Exchange) bool {
//转换逻辑
return true
}).To("chain:default").End()
2
3
4