对于 Golang 函数,veFaaS 提供了一套 Runtime SDK 供您编写函数服务。您需要将该 Runtime SDK 导入您的本地代码。veFaaS 会使用该 Runtime SDK 暴露的入口函数启动函数服务进程,对 HTTP 请求或者 Event 事件进行处理。
目前,veFaaS 提供两种函数启动入口:Start(handler interface{})
和 StartWithInitializer(handler interface{}, initializer interface{})
,请根据实际需要选择合适的启动函数。
一般场景下,您可以选择 Start 函数作为启动函数。
您需要向该函数提供一个 handler 函数作为入参。handler 函数用于处理具体的业务逻辑,handler 函数的具体介绍请参考 handler 函数。
使用 Start 函数作为启动函数的 Golang 代码示例如下。
package main import ( "context" "encoding/json" "fmt" "github.com/volcengine/vefaas-golang-runtime/events" "github.com/volcengine/vefaas-golang-runtime/vefaas" "github.com/volcengine/vefaas-golang-runtime/vefaascontext" ) func main() { // Start your vefaas function. vefaas.Start(handler) } // Define your handler function. func handler(ctx context.Context, r *events.HTTPRequest) (*events.EventResponse, error) { fmt.Printf("request id: %v", vefaascontext.RequestIdFromContext(ctx)) fmt.Printf("request headers: %v", r.Headers) body, _ := json.Marshal(map[string]string{"message": "Hello veFaaS!"}) return &events.EventResponse{ Headers: map[string]string{ "Content-Type": "application/json", }, Body: body, }, nil }
如果函数有一些全局的初始化逻辑,如加载配置文件、与数据库建立连接、初始化下游 Client 等,推荐使用 StartWithInitializer 函数作为启动函数。
您需要向该函数提供两个入参。
handler 函数:用于处理具体业务逻辑,handler 函数的具体介绍请参考 handler 函数。
initializer 函数:用于函数实例初始化,initializer 函数的具体介绍请参考 initializer 函数。
使用 StartWithInitializer 函数作为启动函数的 Golang 代码示例如下。
package main import ( "context" "encoding/json" "fmt" "github.com/volcengine/vefaas-golang-runtime/events" "github.com/volcengine/vefaas-golang-runtime/vefaas" "github.com/volcengine/vefaas-golang-runtime/vefaascontext" ) func main() { // Start your vefaas function. vefaas.StartWithInitializer(handler, initializer) } // Define your handler function. func handler(ctx context.Context, r *events.HTTPRequest) (*events.EventResponse, error) { fmt.Printf("request id: %v", vefaascontext.RequestIdFromContext(ctx)) fmt.Printf("request headers: %v", r.Headers) body, _ := json.Marshal(map[string]string{"message": "Hello veFaaS!"}) return &events.EventResponse{ Headers: map[string]string{ "Content-Type": "application/json", }, Body: body, }, nil } func initializer(ctx context.Context) error { // Do the initialization stuff, e.g., setup database connection, // http client for the downstream, or others, which may involve the declaration // and initialization of some global variables. // // Return error (recommended) or just panic (veFaaS will help recover) here if // something wrong happened. return nil }
handler 是函数请求处理逻辑的入口。handler 包含了用户的核心业务逻辑,用于接收 HTTP 类型或 Event 类型的请求,进行处理,并最终返回 Response。
根据接收的请求类型,handler 函数签名可以分为以下 3 种,请根据实际需要采用合适的签名。
该类型函数签名如下所示,接收 HTTP Request 以及对应的 Context,返回 EventResponse 以及请求处理过程中可能的 Error。适用于通过 API 网关触发器请求 veFaaS 函数的场景。
// Handle regular HTTP request. func(context.Context, *events.HTTPRequest) (*events.EventResponse, error)
参数说明
参数 | 说明 |
---|---|
context.Context | 表示运行时的信息,包含请求的超时、Request ID 等。具体详见 vefaas-golang-runtime/vefaascontext/context.go。 |
events.HTTPRequest | 表示经 veFaaS 封装后的 HTTP Request,包含了处理 HTTP 请求所需的元信息,如请求方法、Header 信息以及请求 Payload 等。具体数据结构定义详见 vefaas-golang-runtime/events/http.go。 |
events.EventResponse | 用于函数返回请求执行的结果,如状态码、Header 信息以及 Payload。具体数据结构定义详见 vefaas-golang-runtime/events/response.go。 |
error | 提供了一种错误处理的简便方式。 注意
|
该类型签名如下所示,接收一个经 veFaaS 封装的 CloudEvent 格式请求以及对应的 Context,返回 EventResponse 以及请求处理过程中可能的 Error。适用于处理 Timer 触发器、Kafka 触发器等事件类型的触发场景。
// Handle CloudEvent request. func(context.Context, *events.CloudEvent) (*events.EventResponse, error)
参数说明
context.Context
、events.EventResponse
及 error
参数说明与处理常规 HTTP 请求的handler 函数相同。
其余参数说明请参见下表。
参数 | 说明 |
---|---|
events.CloudEvent | 表示经 veFaaS 简单封装后的 CloudEvent 类型的 Event,包含了事件的 Context 信息、Payload 是否 base64 编码以及具体的 Payload。具体数据结构定义详见 vefaas-golang-runtime/events/cloudevent.go。 |
该类型签名如下所示,适用于一个函数要同时接收常规的 HTTP 请求以及事件类型请求的场景。您可在 handler 函数内部,通过 Golang 的类型断言,进一步区分请求类型,并针对性地处理。
// Handle request of any type. func(context.Context, interface{}) (*events.EventResponse, error)
参数说明
context.Context
、events.EventResponse
及error
参数说明与处理常规 HTTP 请求的 handler 函数相同。
对于 interface{}
类型 payload 处理示例如下。
func handler(ctx context.Context, payload interface{}) (*events.EventResponse, error) { switch event := payload.(type) { case *events.HTTPRequest: fmt.Printf("received http request, %v", event) // Handle regular HTTP request. return &events.EventResponse{StatusCode: http.StatusOK}, nil case *events.CloudEvent: fmt.Printf("received CloudEvent request, %v", event) // Handle CloudEvent request. return &events.EventResponse{StatusCode: http.StatusOK}, nil default: errMsg := fmt.Sprintf("unexpected payload type %T", payload) fmt.Fprintln(os.Stderr, errMsg) body, _ := json.Marshal(errMsg) return &events.EventResponse{ StatusCode: http.StatusBadRequest, Body: body, }, nil } }
Initializer 是函数的初始化逻辑入口。单个函数内的实例级别全局初始化,推荐使用 initializer 函数进行。
veFaaS 目前支持的 initializer 函数签名如下,您可以通过返回 error(推荐)或者 panic 来标识初始化失败。
func(context.Context) error
参数说明
context.Context
及error
说明与处理常规 HTTP 请求的 handler 函数相同。
对于 veFaaS 函数,您可以在控制台配置函数运行时所需的环境变量,并在代码中读取对应的环境变量,用于函数处理逻辑。对于所配置的环境变量,veFaaS 会将其注入到函数运行所在的容器中,程序可以通过语言的内置库进行读取。
例如:若您函数配置中环境变量的键(key)为envKey
,运行环境读取该环境变量的代码示例如下。
import "os" envValue := os.Getenv("envKey")