开发go事件函数-j9九游会登录
关于go函数的接口定义以及sdk接口说明请参考go函数开发概述。
开发go函数
登录已经安装了go 1.x sdk的linux服务器,按照如下步骤进行编译和打包。(当前支持ubuntu 14.04,ubuntu 16.04,suse 11.3,suse 12.0,suse 12.1)
- 创建一个临时目录例如“/home/fssgo”,将functiongraph的解压到新创建的目录,并开启go module开关,操作如下:
$ mkdir -p /home/fssgo $ unzip functiongraph-go-runtime-sdk-1.0.1.zip -d /home/fssgo $ export go111module="on"
- 在目录“/home/fssgo”下生成go.mod文件,操作如下,以模块名为test为例:
$ go mod init test
- 在目录“/home/fssgo”下编辑go.mod文件,添加加粗部分内容:
module test go 1.24.5 require ( huaweicloud.com/go-runtime v0.0.0-00010101000000-000000000000 ) replace ( huaweicloud.com/go-runtime => ./go-runtime ) - 在目录“/home/fssgo”下创建函数文件,并实现如下接口:
func handler(payload []byte, ctx context.runtimecontext) (interface{}, error)
其中payload为客户端请求的body数据,ctx为functiongraph提供的运行时上下文对象,具体提供的方法可以参考表19,以test.go为例:
package main import ( "fmt" "huaweicloud.com/go-runtime/go-api/context" "huaweicloud.com/go-runtime/pkg/runtime" "huaweicloud.com/go-runtime/events/apig" "huaweicloud.com/go-runtime/events/cts" "huaweicloud.com/go-runtime/events/dds" "huaweicloud.com/go-runtime/events/dis" "huaweicloud.com/go-runtime/events/kafka" "huaweicloud.com/go-runtime/events/lts" "huaweicloud.com/go-runtime/events/smn" "huaweicloud.com/go-runtime/events/timer" "encoding/json" ) func apigtest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var apigevent apig.apigtriggerevent err := json.unmarshal(payload, &apigevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", apigevent.string()) apigresp := apig.apigtriggerresponse{ body: apigevent.string(), headers: map[string]string { "content-type": "application/json", }, statuscode: 200, } return apigresp, nil } func ctstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ctsevent cts.ctstriggerevent err := json.unmarshal(payload, &ctsevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ctsevent.string()) return "ok", nil } func ddstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ddsevent dds.ddstriggerevent err := json.unmarshal(payload, &ddsevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ddsevent.string()) return "ok", nil } func distest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var disevent dis.distriggerevent err := json.unmarshal(payload, &disevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", disevent.string()) return "ok", nil } func kafkatest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var kafkaevent kafka.kafkatriggerevent err := json.unmarshal(payload, &kafkaevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", kafkaevent.string()) return "ok", nil } func ltstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ltsevent lts.ltstriggerevent err := json.unmarshal(payload, <sevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ltsevent.string()) return "ok", nil } func smntest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var smnevent smn.smntriggerevent err := json.unmarshal(payload, &smnevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", smnevent.string()) return "ok", nil } func timertest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var timerevent timer.timertriggerevent err := json.unmarshal(payload, &timerevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } return timerevent.string(), nil } func main() { runtime.register(apigtest) }约束与限制:
- 如果函数返回的error参数不是nil,则会认为函数执行失败。
- 如果函数返回的error为nil,functiongraph仅支持返回如下几种类型的值。
nil:返回的http响应body为空。
[]byte:返回的http响应body内容为该字节数组内容。
string:返回的http响应body内容为该字符串内容。
其它:functiongraph会将返回值作为对象进行json编码,并将编码后的内容作为http响应的body,同时设置响应的"content-type"头为"application/json"。
- 上述例子使用apig触发器的事件类型,如需使用其他触发器类型需要修改main函数的内容,例如使用cts触发器则修改为runtime.register(ctstest),目前只支持注册一个入口。
- 当函数的事件源是apig时,相关约束条件请参考base64解码和返回结构体的说明。
- 编译和打包
函数代码编译完成后,按照如下方式编译和打包。
- 编译
$ cd /home/fssgo $ go build -o handler test.go
“handler”作为函数执行入口可自定义,在functiongraph控制台的函数详情页设置中,可自行修改函数执行入口。
- 打包:
$ zip fss_examples_go1.x.zip handler
- 编译
- 创建函数
登录,创建go1.x函数,上传代码包fss_examples_go1.x.zip。
对于go runtime,必须在编译之后打zip包,编译后的文件名称必须与函数执行入口的名称保持一致,例如:二进制文件名为handler,则“函数执行入口”命名为handler,handler与步骤1中定义的函数保持一致。
- 测试函数
- 创建一个临时目录例如“/home/fssgo/src/huaweicloud.com”,将functiongraph的sdk 解压到新创建的目录,操作如下:
$ mkdir -p /home/fssgo/src/huaweicloud.com
$ unzip functiongraph-go-runtime-sdk-1.0.1.zip -d /home/fssgo/src/huaweicloud.com
- 在目录“/home/fssgo/src”下创建函数文件,并实现如下接口:
func handler(payload []byte, ctx context.runtimecontext) (interface{}, error)
其中payload为客户端请求的body数据,ctx为functiongraph提供的运行时上下文对象,具体提供的方法可以参考sdk接口,以test.go为例:
package main import ( "fmt" "huaweicloud.com/go-runtime/go-api/context" "huaweicloud.com/go-runtime/pkg/runtime" "huaweicloud.com/go-runtime/events/apig" "huaweicloud.com/go-runtime/events/cts" "huaweicloud.com/go-runtime/events/dds" "huaweicloud.com/go-runtime/events/dis" "huaweicloud.com/go-runtime/events/kafka" "huaweicloud.com/go-runtime/events/lts" "huaweicloud.com/go-runtime/events/smn" "huaweicloud.com/go-runtime/events/timer" "encoding/json" ) func apigtest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var apigevent apig.apigtriggerevent err := json.unmarshal(payload, &apigevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", apigevent.string()) apigresp := apig.apigtriggerresponse{ body: apigevent.string(), headers: map[string]string { "content-type": "application/json", }, statuscode: 200, } return apigresp, nil } func ctstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ctsevent cts.ctstriggerevent err := json.unmarshal(payload, &ctsevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ctsevent.string()) return "ok", nil } func ddstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ddsevent dds.ddstriggerevent err := json.unmarshal(payload, &ddsevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ddsevent.string()) return "ok", nil } func distest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var disevent dis.distriggerevent err := json.unmarshal(payload, &disevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", disevent.string()) return "ok", nil } func kafkatest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var kafkaevent kafka.kafkatriggerevent err := json.unmarshal(payload, &kafkaevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", kafkaevent.string()) return "ok", nil } func ltstest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var ltsevent lts.ltstriggerevent err := json.unmarshal(payload, <sevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", ltsevent.string()) return "ok", nil } func smntest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var smnevent smn.smntriggerevent err := json.unmarshal(payload, &smnevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } ctx.getlogger().logf("payload:%s", smnevent.string()) return "ok", nil } func timertest(payload []byte, ctx context.runtimecontext) (interface{}, error) { var timerevent timer.timertriggerevent err := json.unmarshal(payload, &timerevent) if err != nil { fmt.println("unmarshal failed") return "invalid data", err } return timerevent.string(), nil } func main() { runtime.register(apigtest) }约束与限制:
- 如果函数返回的error参数不是nil,则会认为函数执行失败。
- 如果函数返回的error为nil,functiongraph仅支持返回如下几种类型的值。
nil:返回的http响应body为空。
[]byte:返回的http响应body内容为该字节数组内容。
string:返回的http响应body内容为该字符串内容。
其它:functiongraph会将返回值作为对象进行json编码,并将编码后的内容作为http响应的body,同时设置响应的"content-type"头为"application/json"。
- 上述例子使用apig触发器的事件类型,如需使用其他触发器类型需要修改main函数的内容,例如使用cts触发器则修改为runtime.register(ctstest),目前只支持注册一个入口。
- 当函数的事件源是apig时,相关约束条件请参考base64解码和返回结构体的说明。
- 编译和打包
函数代码编译完成后,按照如下方式编译和打包。
- 设置goroot和gopath环境变量:
$ export goroot=/usr/local/go (假设go安装到了/usr/local/go目录) $ export path=$goroot/bin:$path $ export gopath=/home/fssgo
- 编译:
$ cd /home/fssgo $ go build -o handler test.go
“handler”作为函数执行入口可自定义,在functiongraph控制台的函数详情页设置中,可自行修改函数执行入口。
- 打包:
$ zip fss_examples_go1.x.zip handler
- 设置goroot和gopath环境变量:
- 创建函数
登录,创建go1.x函数,上传代码包fss_examples_go1.x.zip。
对于go runtime,必须在编译之后打zip包,编译后的文件名称必须与函数执行入口的名称保持一致,例如:二进制文件名为handler,则函数配置中的“函数执行入口”需命名为handler,handler与步骤1中定义的函数保持一致。
- 测试函数
函数执行结果
执行结果由3部分组成:函数返回、执行摘要和日志。
|
参数项 |
执行成功 |
执行失败 |
|---|---|---|
|
函数返回 |
返回函数中定义的返回信息。 |
返回包含错误信息和错误类型的json文件。格式如下: {
"errormessage": "",
"errortype":"",
}
errormessage:runtime返回的错误信息 errortype:错误类型 |
|
执行摘要 |
显示请求id、配置内存、执行时长、实际使用内存和收费时长。 |
显示请求id、配置内存、执行时长、实际使用内存和收费时长。 |
|
日志 |
打印函数日志,最多显示4kb的日志。 |
打印报错信息,最多显示4kb的日志。 |
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

