文档首页 > > 开发指南> 如何开发函数> Go函数开发指南

Go函数开发指南

分享
更新时间: 2020/06/12 GMT+08:00

函数定义

对于Go,FunctionGraph运行时目前只支持Go 1.8.3版本。

函数有明确的接口定义,如下所示:

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所示。

    表2 日志接口说明表

    方法名

    方法说明

    RuntimeLogger()

    • 记录用户输入日志对象,包含方法如下:Logf(format string, args ...interface{})
    • 该方法会将内容输出到标准输出,格式:"时间-请求ID-输出内容",示例如下:2017-10-25T09:10:03.328Z 473d369d-101a-445e-a7a8-315cca788f86 test log output。

开发Go函数

  1. 创建Go编译工程。

    1. 登录已经安装了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

    2. 在目录“/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
      }
      1. 如果函数返回的error参数不是nil,则会认为函数执行失败。
      2. 如果函数返回的error为nil,FunctionGraph函数服务仅支持返回如下几种类型的值。

        nil:返回的HTTP响应Body为空。

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

        string:返回的HTTP响应Body内容为该字符串内容。

        其它:FunctionGraph函数服务会将返回值作为对象进行json编码,并将编码后的内容作为HTTP响应的Body,同时设置响应的"Content-Type"头为"application/json"。

  2. 编译和打包

    函数编码完毕后,按照如下方式进行编译打包。

    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/src/go-runtime

      $ go build --buildmode=plugin -o testplugin.so test.go

      编译后会在当前目录生成testplugin.so文件

    3. 打包:

      $ zip fss_examples_go1.8.zip testplugin.so

      命令执行完成后会在当前目录生成fss_examples_go1.8.zip文件

  3. 创建函数

    登录FunctionGraph控制台,创建Go函数,上传 fss_examples_go1.8.zip,如 图1所示。
    图1 上传程序包

    对于Go runtime,必须在编译之后打zip包,编译后的动态库文件名称必须与函数执行入口的插件名称保持一致,例如:动态库名称为testplugin.so,则“函数执行入口”命名为testplugin.Handler,Handler与步骤1中定义的函数保持一致。

  4. 测试函数

    1. 创建测试事件。

      在函数详情页,单击“请选择测试事件 > 请配置测试事件”,弹出“配置测试事件”页,输入测试信息如图2所示,单击“保存”。

      图2 配置测试事件
    2. 在函数详情页,选择已配置测试事件,单击“测试”。

  5. 函数执行

    函数执行结果分为三部分,分别为函数返回(由callback返回)、执行摘要、日志输出(由console.log或getLogger()方法获取的日志方法输出),如图3所示。

    图3 执行结果

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问