Go函数开发指南(Go 1.8.3)
函数定义

建议使用Go 1.x版本。
函数有明确的接口定义,如下所示:
func Handler (payload []byte, ctx context.RuntimeContext)
- 入口函数名(Handler):入口函数名称,需和函数执行入口处用户自定义的入口函数名称一致(首字母必须大写)。
- 执行事件体(payload): 函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
- 上下文环境(ctx ):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。
SDK接口
- Context接口
Context类中提供了许多上下文方法供用户使用,SDK下载地址见表1。其声明和功能如表1所示。
表1 Context类上下文方法说明 方法名
方法说明
GetRequestID() string
获取请求ID。
GetRemainingTimeInMilliSeconds()
获取函数剩余运行时间。
GetAccessKey() string
获取租户AccessKey,使用该方法需要给函数配置委托。
GetSecretKey() string
获取租户SecretKey,使用该方法需要给函数配置委托。
GetUserData(key string) string
通过key获取用户通过环境变量传入的值。
GetFunctionName() string
获取函数名称。
GetRunningTimeInSeconds() int
获取函数超时时间。
GetVersion() string
获取函数的版本。
GetMemorySize() int
分配的内存。
GetCPUNumber() int
分配的CPU数。
GetProjectID() string
获取projectID。
GetPackage() string
获取函数组。
GetToken() string
获取token,使用该方法需要给函数配置委托。
GetLogger() context.RuntimeLogger
获取context提供的logger方法(默认会输出时间、请求ID等信息)。
GetToken()、GetAccessKey()和GetSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。
- 日志接口
FunctionGraph中Go SDK日志接口日志说明如表2所示。
开发Go函数
- 创建Go编译工程。
- 登录已经安装了Go 1.8.3 SDK和运行环境的linux服务器(当前支持Ubuntu 14.04,Ubuntu 16.04,SuSE 11.3,SuSE 12.0,SuSE 12.1),创建目录“/home/fssgo/src/go-runtime”,将FunctionGraph函数Go SDK解压到新创建目录,操作完成后目录结构如下:
$ mkdir -p /home/fssgo/src/go-runtime
$ unzip fss-go-sdk.zip -d /home/fssgo/src/go-runtime
- 在目录“/home/fssgo/src/go-runtime”下创建函数文件,并实现如下接口:
func Handler(payload []byte, ctx context.RuntimeContext) (interface{}, error)
其中payload为客户端请求的body数据,ctx为FunctionGraph函数服务提供的运行时上下文对象,具体提供的方法可以参考SDK接口,以test.go为例:
package main import ( "fmt" "encoding/json" "go-runtime/go-api/context" ) type Greeting struct { Name string `json:"name"` } // Handler function func Handler(payload []byte, ctx context.RuntimeContext) (interface{}, error) { logger := ctx.GetLogger() var greeting Greeting err := json.Unmarshal(payload, &greeting) if err != nil { return "", fmt.Errorf("invalid request payload") } logger.Logf("hello %s.", greeting.Name) logger.Logf("RequestId: %s", ctx.GetRequestID()) logger.Logf("FunctionName: %s", ctx.GetFunctionName()) logger.Logf("Version: %s", ctx.GetVersion()) return fmt.Sprintf("hello %s", greeting.Name), nil }
- 登录已经安装了Go 1.8.3 SDK和运行环境的linux服务器(当前支持Ubuntu 14.04,Ubuntu 16.04,SuSE 11.3,SuSE 12.0,SuSE 12.1),创建目录“/home/fssgo/src/go-runtime”,将FunctionGraph函数Go SDK解压到新创建目录,操作完成后目录结构如下:
- 编译和打包
函数编码完毕后,按照如下方式进行编译打包。
- 设置GOROOT和GOPATH环境变量:
$ export GOROOT=/usr/local/go (假设Go安装到了/usr/local/go目录)
$ export PATH=$GOROOT/bin:$PATH
$ export GOPATH=/home/fssgo
- 编译:
$ cd /home/fssgo/src/go-runtime
$ go build --buildmode=plugin -o testplugin.so test.go
编译后会在当前目录生成testplugin.so文件
- 打包:
$ zip fss_examples_go1.8.zip testplugin.so
命令执行完成后会在当前目录生成fss_examples_go1.8.zip文件
- 设置GOROOT和GOPATH环境变量:
- 创建函数
对于Go runtime,必须在编译之后打zip包,编译后的动态库文件名称必须与函数执行入口的插件名称保持一致,例如:动态库名称为testplugin.so,则“函数执行入口”命名为testplugin.Handler,Handler与步骤1中定义的函数保持一致。
- 测试函数
- 创建测试事件。
在函数详情页,单击“请选择测试事件 > 请配置测试事件”,弹出“配置测试事件”页,输入测试信息如图2所示,单击“保存”。
- 在函数详情页,选择已配置测试事件,单击“测试”。
- 创建测试事件。
- 函数执行
函数执行结果分为三部分,分别为函数返回(由callback返回)、执行摘要、日志输出(由console.log或getLogger()方法获取的日志方法输出),如图3所示。
执行结果
执行结果由3部分组成:函数返回、执行摘要和日志。
参数项 |
执行成功 |
执行失败 |
---|---|---|
函数返回 |
返回函数中定义的返回信息。 |
返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType":"", } errorMessage:Runtime返回的错误信息 errorType:错误类型 |
执行摘要 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
日志 |
打印函数日志,最多显示4KB的日志。 |
打印报错信息,最多显示4KB的日志。 |
函数执行失败的函数返回示例如下:
{ "errorMessage": "Function plugin 'plugin' not found(stat ${RUNTIME_CODE_ROOT}/plugin.so: no such file or directory)", "errorType": "FunctionLoadError" }
函数执行失败的日志示例如下:
2020-07-27 15:20:53.292+08:00 Start invoke request '51a44941-577b-4e1f-b2f6-2f2c3ca2f5f7', version: latest 2020-07-27 15:20:53.292+08:00 51a44941-577b-4e1f-b2f6-2f2c3ca2f5f7 Function plugin 'plugin' not found(stat ${RUNTIME_CODE_ROOT}/plugin.so: no such file or directory) 2020-07-27 15:20:53.293+08:00 Finish invoke request '51a44941-577b-4e1f-b2f6-2f2c3ca2f5f7'(invoke Failed), duration: 1.447ms, billing duration: 100ms, memory used: 58.723MB
