阿里云函数计算Golang函数开发指南

Golang函数开发指南
目前支持的Golang开发语言版本为1.13.8。
 
1. 函数定义
Golang1.13.8需要在安装了go 1.13.8 的linux服务器上开发
入口函数名(Handler):入口函数的名称,需要和函数执行入口处用户自定义的入口函数名称一致,需要注意的是,golang的入口函数开头需要为大写。
执行事件(event):传给函数执行的实际参数,类型为[]byte。
在页面触发测试中,event为用户输入的测试事件参数
在http触发器中,event为用户POST,PUT方法的body内容。
在其他触发器中,event为平台封装的cloudevent格式数据。
 函数中需要将event序列化到提前定义好的结构体Event中
上下文环境(context):Runtime提供了函数执行的上下文,通过上下文对象context,可以在函数中获取相关函数执行的上下文环境,具体接口定义在SDK接口中说明。
函数执行入口:
函数执行入口格式”[文件名].[函数名]”,例如创建函数是设置为index.Handler,那么函数计算会自动加载index模块中定义的Handler函数,如下图所示:

2. SDK接口
Context类中提供了一下上下文方法供用户使用,其声明和功能如下表所示:
 

方法名

方法说明

context.GetRequestID()

获取请求ID

context.GetStartTime()

获取函数执行时间

context.GetFunctionName()

获取函数名或函数id

context.GetVersion()

获取函数当前版本

context.GetMemorySize()

获取函数配置内存

3. 如何开发Golang函数
开发Goalng函数步骤如下。
 
步骤 1    开发函数
 
Golang 1.13.8的函数需要本地开发,并编译成插件上传到函数计算平台。
 
(1)编写统一context接口
 
登录已经安装了golang 1.13.8运行环境的linux服务器,创建目录/home/sfcgo/src/go-runtime/pkg/context,并完成以下操作:
 
$ mkdir -p /home/sfcgo/src/go-runtime/pkg/context
 
$ vi /home/sfcgo/src/go-runtime/pkg/context/client_context.go,直接拷贝以下内容到文件中
 
package context
 
type Context interface {
 
        GetRequestID() string
 
        GetStartTime() string
 
        GetFunctionName() string
 
        GetVersion() string
 
        GetMemorySize() string
 
}
 
(2)开发用户函数
 
在目录/home/sfcgo/src/go-runtime中创建函数文件,并实现如下接口:
 
func Handler(event []byte, context context.Context) (interface{}, error)
 
        其中event为传递给函数的body数据,context为函数提供服务的上下文对象,具体提供方法可参考
 
        SDK接口,编写如下示例函数代码:
 
        vi /home/sfcgo/src/go-runtime/index.go
 
package main
 
import (
 
        "encoding/json"
 
        "fmt"
 
        "go-runtime/pkg/context"
 
)
 
 
 
type Event struct {
 
          Key string   `json:"key"`
 
}
 
 
 
func Handler(event []byte, context   context.Context) (interface{}, error) {
 
        var ev *Event
 
        err := json.Unmarshal(event, &ev)
 
        if err != nil   {
 
                return nil,   fmt.Errorf("invalid request payload")
 
        }
 
        fmt.Println(ev.Key)
 
        result := fmt.Sprintf("Value:   %s, time: %s", ev.Key, context.GetStartTime())
 
        return result, nil
 
}
 
步骤 2    编译和打包
 
函数编码完毕后,按照如下方式进行编译打包。
 
(1)     设置GOROOT和GOPATH环境变量
 
$ export GOROOT=/usr/local/go (假设Go安装到了/usr/local/go目录)
 
        $ export PATH=$GOROOT/bin:$PATH
 
$ export GOPATH=/home/sfcgo
 
(2)     编译代码  
 
$ cd /home/sfcgo/src/go-runtime
 
$ go mod init
 
$ go build -buildmode=plugin -o index.so index.go
 
编译后会在当前目录生产index.so文件
 
(3)     打包代码
 
$ zip index.zip index.so
 
 
 
步骤 3    创建函数
 
登录函数计算控制台,创建函数,编辑函数名称,选择所属应用,选择golang1.13.8运行环境
 
上传打包好的index.zip文件,点击确定创建函数。
 
 
 
4. 测试函数
步骤 1    创建测试事件
 
进入函数详情页,选择测试事件,点击创建测试事件
 
由于golang为静态语言,因此需要根据函数代码中的解析规则编写测试时间
 
type Event struct {
 
                Key string `json:"key"`
 
}
 
        事件的的键名要为key,否则无法被函数序列化
 
        根据需要输入测试事件的body内容。
 
步骤 1    执行测试事件
 
在函数详情页面,选择具体的测试事件,点击执行。

执行后,分为三部分结果展示,分别为函数执行结果、函数执行摘要、函数执行日志。