By烟花易冷

在Vercel平台使用Go语言开发Serverless Function
2024-03-17

在独立出海领域,Vercel 的火爆程度可谓十足,更是不少小站长出海的首选。其配套的 Next.js 框架对于不少前端开发者来说使用起来非常顺手,尤其是习惯了 react.js 的朋友。在 Serverless Function 方面,除了使用 JavaScript 以外,Vercel 也是支持使用 Golang 作为后端开发语言的。我试水了一波,在这里记录一下使用的过程和一些坑点。

创建Go项目

要想在 vercel 顺利运行,可能需要转换一下思维模式。平常我们的 Go 项目可以看做是一个完整的“服务”,监听特定的端口,解析 HTTP 请求报文的具体内容,并根据 HTTP 中的请求路径以及参数执行对应的方法,并根据运行结果做出 HTTP 响应;而对于一个 vercel 而言,既然已经称之为一个 function,从字面上不难理解它需要的不是一个完整的“服务”,而仅仅只是一个方法,或者说是一个符合 vercel 接口(interface{})的函数。对于你的服务而言,整个路由匹配将交由 vercel 完成,这个函数的唯一作用就是把 HTTP 输出变为输出,用完即销毁。

你需要实现的函数以及示例如下:

// 实现接口:http.HandlerFunc
func Handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "<h1>Hello from www.zzfly.net!</h1>")
}

实现好之后,把 .go 文件放置在 /api 目录中。请注意务必放置在这个目录下,截止至发稿时间,暂时不能放在其他目录中。这里以 index.go 为例

结合你的 .go 文件名,可以组装出对应的执行 url:/api/index

看到这里这里,是不是有点儿 PHP 这种以 CGI 方式运行的脚本语言意思了(虽然实现不一样,但是一次请求执行一次脚本的运行方式,对于我而言从感官上已经类似 CGI 了)

部署至 Vercel

把对应的代码提交至 github 后,到 vercel 创建团队,并导入对应的项目,具体如下

vercel-imports

部署完成之后,可以看到 Status (状态) 已经为 Ready (就绪),并提供了对应的二级域名:

vercel-project

访问对应的 url,可以正常看到 Golang 输出的结果,如图所示:

vercel-golang-api

运行监控与日志

vercel 提供了事件上报分析、速度透视等等功能,但在目前阶段对 Golang 似乎并不友好。对于访问日志(access log),可以直接在 Logs 标签页下找到。对于每一次请求所对应的标准输出(stdout)vercel 都会收集至这里,查询语法与Kibana类似。另外,vercel 有提供简单的唯一 id 用于追踪单次请求,有需要的话可以在 Golang 程序中合理运用起来。

vercel-access-logs

注意

  • Vercel 会根据 go.mod 中的版本自动适配对应的 Golang 版本,如果不填写的话默认是 1.20