1、环境说明
目前只支持 Go1.8
注意事项:
- 不支持上传代码:使用 Go 语言,仅支持上传已经开发完成,编译打包后的二进制文件。SCF 环境不提供 Go 的编译能力。
- 不支持在线编辑:不能上传代码,所以不支持在线编辑代码。Go 运行时的函数,在代码页面仅能看到通过页面上传或 COS 提交代码文件的方法。
2、云函数类型
- 事件函数:
- <font style="color:rgb(51, 51, 51);">云 API 触发函数执行:
可以在调用方和函数代码之间自定义一个 dict 类型的参数。调用方按照定义好的格式传入数据,函数代码按格式获取数据。
示例:
定义一个 dict 类型的数据结构 {“key”:”XXX”} ,当调用方传入数据 {“key”:”abctest”} 时,函数代码可以通过 event[key] 来获得值 abctest。
- <font style="color:rgb(51, 51, 51);">触发器触发函数执行:
SCF 和 API 网关、对象存储 COS、消息队列 Ckafka 等多种云服务打通,可以通过给函数绑定对应的云服务触发器触发函数执行。触发器触发函数时,event 会以一种平台预定义的、不可更改的格式作为 event 参数传给函数,您可以根据此格式编写代码并从 event 参数中获取信息(该系列采用的是CLB触发器-负载均衡)。
示例:
通过对象存储 COS 触发函数时会将对象存储桶及文件的具体信息以 JSON 格式 传递给 event 参数,在函数代码中通过解析 event 信息即可完成对触发事件的处理。
- Web函数:
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 触发器具有以下特点:
- **<font style="color:rgb(51, 51, 51);">Push 模型</font>**<font style="color:rgb(51, 51, 51);">
负载均衡 CLB 监听器在接受到 CLB 侧发出的请求后,如果 CLB 在后端配置了对接的云函数,该函数将会被触发运行。同时 CLB 会将请求的相关信息以 event 入参的形式发送给被触发的函数。相关信息包含了具体接受到请求的方法、请求的 path、header、query 等内容。
- **<font style="color:rgb(51, 51, 51);">同步调用</font>**<font style="color:rgb(51, 51, 51);">
CLB 触发器通过同步调用的方式来调用函数。有关调用类型的更多信息,请参阅 调用类型。
在 CLB 负载均衡触发器接收到请求时,会将类似以下 JSON 格式的事件数据发送给绑定的云函数。
4.2 <font style="color:rgb(0, 0, 0);">CLB 触发器的集成请求事件消息结构</font>
:::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 负载均衡设置为集成响应时,需要返回类似如下内容的数据结构。4.3.2 数据结构内容详细说明如下:
{
"isBase64Encoded": false,
"statusCode": 200,
"headers": {"Content-Type":"text/html"},
"body": "<html><body><h1>Heading</h1><p>Paragraph.</p></body></html>"
}
结构名 | 内容 |
---|---|
isBase64Encoded | 指明 body 内的内容是否为 Base64 编码后的二进制内容,取值需要为 JSON 格式的 true 或 false。 |
statusCode | HTTP 返回的状态码,取值需要为 Integer 值。 |
headers | HTTP 返回的头部内容,取值需要为多个 key-value 对象,或 key:[value,value] 对象。其中 key、value 均为字符串。 |
body | HTTP 返回的 body 内容。 |
{
"isBase64Encoded": false,
"statusCode": 200,
"headers": {"Content-Type":"text/html","Key":["value1","value2","value3"]},
"body": "<html><body><h1>Heading</h1><p>Paragraph.</p></body></html>"
}
- Demo:
package main
import (
"context"
"encoding/json"
"github.com/tencentyun/scf-go-lib/cloudfunction"
)
type Msg struct {
IsBase64Encoded bool `json:"isBase64Encoded"`
StatusCode int `json:"statusCode"`
Headers map[string]string `json:"headers"`
Body string `json:"body"`
}
type Tern struct {
Name string `json:"name"`
Age int `json:"age"`
}
func hello(ctx context.Context, event Msg) (Msg, error) {
ret := Msg{}
ret.IsBase64Encoded = false
ret.StatusCode = 200
ret.Headers = map[string]string{"Content-Type": "application/json"}
tern := Tern{}
tern.Name = "kevin"
tern.Age = 25
jsonStr, _ := json.Marshal(tern)
ret.Body = string(jsonStr)
return ret, nil
}
func main() {
cloudfunction.Start(hello)
}