1、环境说明

    目前只支持 Go1.8

    注意事项:

    • 不支持上传代码:使用 Go 语言,仅支持上传已经开发完成,编译打包后的二进制文件。SCF 环境不提供 Go 的编译能力。
    • 不支持在线编辑:不能上传代码,所以不支持在线编辑代码。Go 运行时的函数,在代码页面仅能看到通过页面上传或 COS 提交代码文件的方法。

    2、云函数类型

    • 事件函数:
    接收云 API、多种触发器的 JSON 格式事件触发函数执行 SCF 两种触发方式对应两种event格式:
    1. - <font style="color:rgb(51, 51, 51);">云 API 触发函数执行:

    可以在调用方和函数代码之间自定义一个 dict 类型的参数。调用方按照定义好的格式传入数据,函数代码按格式获取数据。
    示例
    定义一个 dict 类型的数据结构 {“key”:”XXX”} ,当调用方传入数据 {“key”:”abctest”} 时,函数代码可以通过 event[key] 来获得值 abctest。

    1. - <font style="color:rgb(51, 51, 51);">触发器触发函数执行:

    SCF 和 API 网关、对象存储 COS、消息队列 Ckafka 等多种云服务打通,可以通过给函数绑定对应的云服务触发器触发函数执行。触发器触发函数时,event 会以一种平台预定义的、不可更改的格式作为 event 参数传给函数,您可以根据此格式编写代码并从 event 参数中获取信息(该系列采用的是CLB触发器-负载均衡)。
    示例
    通过对象存储 COS 触发函数时会将对象存储桶及文件的具体信息以 JSON 格式 传递给 event 参数,在函数代码中通过解析 event 信息即可完成对触发事件的处理。

    • Web函数:
    Web 函数(Web Function)是云函数的一种函数类型,区别于事件函数(Event Function)对于事件格式的限制,专注于优化 Web 服务场景,用户可以直接发送 HTTP 请求到 URL 触发函数执行

    3、 开发方法

    • 需要使用 package main 包含 main 函数。
    • 引用 github.com/tencentyun/scf-go-lib/cloudfunction** 库,在编译打包之前,执行 go get github.com/tencentyun/scf-go-lib/cloudfunction**
    • 入口函数入参可选0 - 2参数,如包含参数,需 context 在前,event 在后,入参组合有 (),(event),(context),(context,event),具体说明请参见 入参
    • 入口函数返回值可选0 - 2参数,如包含参数,需返回内容在前,error 错误信息在后,返回值组合有 (),(ret),(error),(ret,error),具体说明请参见 返回值
    • 入参 event 和返回值 ret,均需要能够兼容 encoding/json 标准库,可以进行 Marshal、Unmarshal。
    • 在 main 函数中使用包内的 Start 函数启动入口函数。

    4、 CLB触发器

    4.1 CLB 触发器具有以下特点:
    1. - **<font style="color:rgb(51, 51, 51);">Push 模型</font>**<font style="color:rgb(51, 51, 51);">

    负载均衡 CLB 监听器在接受到 CLB 侧发出的请求后,如果 CLB 在后端配置了对接的云函数,该函数将会被触发运行。同时 CLB 会将请求的相关信息以 event 入参的形式发送给被触发的函数。相关信息包含了具体接受到请求的方法、请求的 path、header、query 等内容。

    1. - **<font style="color:rgb(51, 51, 51);">同步调用</font>**<font style="color:rgb(51, 51, 51);">

    CLB 触发器通过同步调用的方式来调用函数。有关调用类型的更多信息,请参阅 调用类型

    1. 4.2 <font style="color:rgb(0, 0, 0);">CLB 触发器的集成请求事件消息结构</font>
    在 CLB 负载均衡触发器接收到请求时,会将类似以下 JSON 格式的事件数据发送给绑定的云函数。

    :::info

    在 CLB 触发场景下,所有的请求和响应由于需要以 JSON 方式传递,对于一些图片、文件等数据,直接放入 JSON 会导致不可见字符丢失,需要进行 Base64 编码,此处规定如下:
    • 如果 Content-type 为 text/*、application/json、application/javascript、application/xml,CLB 不会对 body 内容进行转码。
    • 其他类型一律进行 Base64 转码再转发。

    :::

    4.3 集成相应

    集成响应,是指 CLB 负载均衡会将云函数的返回内容进行解析,并根据解析内容构造 HTTP 响应。通过使用集成响应,可以通过代码自主控制响应的状态码、headers、body 内容,可以实现自定义格式的内容响应,例如响应 XML、HTML、JSON 甚至 JS 内容。在使用集成响应时,需要按照 CLB 负载均衡触发器的集成响应返回数据结构,才可以被成功解析,否则会出现 {“errno”:403,”error”:”Analyse scf response failed.”} 错误信息。

    4.3.1 CLB 触发器的集成响应返回数据结构

    在 CLB 负载均衡设置为集成响应时,需要返回类似如下内容的数据结构。
    1. {
    2. "isBase64Encoded": false,
    3. "statusCode": 200,
    4. "headers": {"Content-Type":"text/html"},
    5. "body": "<html><body><h1>Heading</h1><p>Paragraph.</p></body></html>"
    6. }
    4.3.2 数据结构内容详细说明如下:
    结构名 内容
    isBase64Encoded 指明 body 内的内容是否为 Base64 编码后的二进制内容,取值需要为 JSON 格式的 true 或 false。
    statusCode HTTP 返回的状态码,取值需要为 Integer 值。
    headers HTTP 返回的头部内容,取值需要为多个 key-value 对象,或 key:[value,value] 对象。其中 key、value 均为字符串。
    body HTTP 返回的 body 内容。
    在需要返回 key 相同的多个 headers 时,可以使用字符串数组的方式描述不同 value,例如:
    1. {
    2. "isBase64Encoded": false,
    3. "statusCode": 200,
    4. "headers": {"Content-Type":"text/html","Key":["value1","value2","value3"]},
    5. "body": "<html><body><h1>Heading</h1><p>Paragraph.</p></body></html>"
    6. }
    1. Demo:
    1. package main
    2. import (
    3. "context"
    4. "encoding/json"
    5. "github.com/tencentyun/scf-go-lib/cloudfunction"
    6. )
    7. type Msg struct {
    8. IsBase64Encoded bool `json:"isBase64Encoded"`
    9. StatusCode int `json:"statusCode"`
    10. Headers map[string]string `json:"headers"`
    11. Body string `json:"body"`
    12. }
    13. type Tern struct {
    14. Name string `json:"name"`
    15. Age int `json:"age"`
    16. }
    17. func hello(ctx context.Context, event Msg) (Msg, error) {
    18. ret := Msg{}
    19. ret.IsBase64Encoded = false
    20. ret.StatusCode = 200
    21. ret.Headers = map[string]string{"Content-Type": "application/json"}
    22. tern := Tern{}
    23. tern.Name = "kevin"
    24. tern.Age = 25
    25. jsonStr, _ := json.Marshal(tern)
    26. ret.Body = string(jsonStr)
    27. return ret, nil
    28. }
    29. func main() {
    30. cloudfunction.Start(hello)
    31. }