更新时间:2025-09-17 gmt 08:00

开发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)

  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"
  2. 在目录“/home/fssgo”下生成go.mod文件,操作如下,以模块名为test为例:
    $ go mod init test
  3. 在目录“/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
    )
  4. 在目录“/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)
    }

    约束与限制:

    1. 如果函数返回的error参数不是nil,则会认为函数执行失败。
    2. 如果函数返回的error为nil,functiongraph仅支持返回如下几种类型的值。

      nil:返回的http响应body为空。

      []byte:返回的http响应body内容为该字节数组内容。

      string:返回的http响应body内容为该字符串内容。

      其它:functiongraph会将返回值作为对象进行json编码,并将编码后的内容作为http响应的body,同时设置响应的"content-type"头为"application/json"。

    3. 上述例子使用apig触发器的事件类型,如需使用其他触发器类型需要修改main函数的内容,例如使用cts触发器则修改为runtime.register(ctstest),目前只支持注册一个入口
    4. 当函数的事件源是apig时,相关约束条件请参考base64解码和返回结构体的说明
  5. 编译和打包

    函数代码编译完成后,按照如下方式编译和打包。

    1. 编译
      $ cd /home/fssgo
      $ go build  -o handler test.go

      “handler”作为函数执行入口可自定义,在functiongraph控制台的函数详情页设置中,可自行修改函数执行入口。

    2. 打包:
      $ zip fss_examples_go1.x.zip handler
  6. 创建函数

    登录,创建go1.x函数,上传代码包fss_examples_go1.x.zip

    对于go runtime,必须在编译之后打zip包,编译后的文件名称必须与函数执行入口的名称保持一致,例如:二进制文件名为handler,则“函数执行入口”命名为handler,handler与步骤1中定义的函数保持一致。

  7. 测试函数
    1. 创建测试事件

      在函数详情页,单击“配置测试事件”,弹出“配置测试事件”页,输入测试信息如图1所示,单击“创建”。

      图1 配置测试事件
    2. 在函数详情页,选择已配置测试事件,单击“测试”,参考函数执行结果查看函数执行结果。
  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

  2. 在目录“/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)
    }

    约束与限制:

    1. 如果函数返回的error参数不是nil,则会认为函数执行失败。
    2. 如果函数返回的error为nil,functiongraph仅支持返回如下几种类型的值。

      nil:返回的http响应body为空。

      []byte:返回的http响应body内容为该字节数组内容。

      string:返回的http响应body内容为该字符串内容。

      其它:functiongraph会将返回值作为对象进行json编码,并将编码后的内容作为http响应的body,同时设置响应的"content-type"头为"application/json"。

    3. 上述例子使用apig触发器的事件类型,如需使用其他触发器类型需要修改main函数的内容,例如使用cts触发器则修改为runtime.register(ctstest),目前只支持注册一个入口
    4. 当函数的事件源是apig时,相关约束条件请参考base64解码和返回结构体的说明
  3. 编译和打包

    函数代码编译完成后,按照如下方式编译和打包。

    1. 设置goroot和gopath环境变量:
      $ export goroot=/usr/local/go (假设go安装到了/usr/local/go目录)
      $ export path=$goroot/bin:$path
      $ export gopath=/home/fssgo
    2. 编译:
      $ cd /home/fssgo
      $ go build  -o handler test.go

      “handler”作为函数执行入口可自定义,在functiongraph控制台的函数详情页设置中,可自行修改函数执行入口。

    3. 打包:
      $ zip fss_examples_go1.x.zip handler
  4. 创建函数

    登录,创建go1.x函数,上传代码包fss_examples_go1.x.zip

    对于go runtime,必须在编译之后打zip包,编译后的文件名称必须与函数执行入口的名称保持一致,例如:二进制文件名为handler,则函数配置中的“函数执行入口”需命名为handler,handler与步骤1中定义的函数保持一致。

  5. 测试函数
    1. 创建测试事件。

      在函数详情页,单击“配置测试事件”,弹出“配置测试事件”页,输入测试信息如图2所示,单击“创建”。

      图2 配置测试事件
    2. 在函数详情页,选择已配置测试事件,单击“测试”,参考函数执行结果查看函数执行结果。

函数执行结果

执行结果由3部分组成:函数返回、执行摘要和日志。

表1 执行结果说明

参数项

执行成功

执行失败

函数返回

返回函数中定义的返回信息。

返回包含错误信息和错误类型的json文件。格式如下:

{
    "errormessage": "", 
    "errortype":"", 
}

errormessage:runtime返回的错误信息

errortype:错误类型

执行摘要

显示请求id、配置内存、执行时长、实际使用内存和收费时长。

显示请求id、配置内存、执行时长、实际使用内存和收费时长。

日志

打印函数日志,最多显示4kb的日志。

打印报错信息,最多显示4kb的日志。

相关文档

网站地图