白嫖vercel当FaaS用

FaaS即Function as a service,云函数,用来托管一些无状态服务,好处是可以动态扩缩,非常灵活。

vercel是一个非常良心的免费的前端托管平台,我的博客目前也托管在这里。

得知vercel还支持云函数,这里是文档,而且runtime还支持Go,这不白嫖一下说不过去

简单用Go在上面部署了一个http服务,路由使用的是gin框架,成果:https://faas.kirito41dd.cn/api/1

  1. 首先安装vercel的cli工具,方便本地调试
    • 直接 npm i -g vercel
  2. 新建个文件夹,初始化一个go项目
    • mkdir vercel-faas && cd vercel-faas && git init .
    • go mod init xxx.github.com/vercel-faas
    • mkdir api - 代码必须放在api/目录下
  3. cli工具本地部署下
    • vercel dev - 跟着引导一路输入y就行
    • 部署成功会出现Ready! Available at http://localhost:3000
    • 这时就可以本地浏览器调试了,由于目录下没有静态网页,所以会404
    • 不用关心,我们只使用云函数功能

根据vercel的文档,处理http请求的代码必须放在api/目录下,并且可以按文件名路由。

比如:请求/api/date就会默认去找api/date.go文件执行代码,文件里必须写一个函数作为入口

1
2
3
func Handler(w http.ResponseWriter, r *http.Request) {
    // do ...
}

但是在每个文件里都写一个这样的函数好像很重复劳动,而且不好和框架配合,所以我只在api/目录下放了一个文件当作入口,再加上路由,然后在handler/下放处理每个路由的具体实现。

完整代码见https://github.com/kirito41dd/vercel-faas

分解:

  1. 首先是在api/目录下提供一个入口
    • 创建文件entrypoint.go,写上处理函数,请求交由gin框架处理
    1
    2
    3
    
    func Handler(w http.ResponseWriter, r *http.Request) {
        app.ServeHTTP(w, r)
    }
    
  2. 引入gin框架,创建实例,并初始化
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    import "github.com/gin-gonic/gin"
    
    var (
        app *gin.Engine
    )
    
    // 初始化逻辑
    func init() {
        app = gin.New()
    
        // 创建路由 must /api/xxx
        r := app.Group("/api")
    
        // 注册路由
        registerRouter(r)
    }
    
  3. 注册路由,简单实现个ping
    1
    2
    3
    
    func registerRouter(r *gin.RouterGroup) {
        r.GET("/ping", handler.Ping)
    }
    
  4. handler/handler.go里写具体的路由处理函数
    1
    2
    3
    
    func Ping(c *gin.Context) {
        c.String(http.StatusOK, "pong")
    }
    
  5. 本地验证下,在项目根目录执行 vercel dev

简单的ping/pong接口实现了,其他接口也是一个套路,塞更多的路由就行了

  1. 首先将本地项目随便推送到一个github仓库

  2. 进入vercel主页

    • 点击 New Project
    • Import Git Repository 那里关联你的github账号,授权仓库访问权限
    • 找到你的仓库,点 Import
  3. 跳转到配置页面

    • Create a Team 可以跳过
    • Configure Project 这里
    • Project Name 随便填
    • Framework Preset 我们只用云函数可以选other
    • 剩下的默认即可,点 Deploy

    如图

    https://blog-1256556944.file.myqcloud.com/public/vercel-config.png

部署完成后会给你分配个域名,可以用域名来访问你的云函数,也可以绑定自己的域名