vercel无服务部署Go函数

准备

Vercel是一个用于静态站点和无服务器功能的云平台,非常适合您的工作流程。 它使开发人员可以托管静态网站和Web服务,这些网站和Web服务可以立即部署,自动扩展并且不需要监督,且无需配置。

使用命令行工具可以即可云部署和进行本地开发

npm i -g now
# 或者
yarn global add now

常用命令

# 查看命令行工具版本
now --version
# 初次使用需要登录
now login
# 直接部署当前文件夹
now
# 本地开发测试 打开调试 监听8080端口
now dev --debug --listen 8080
# 生产环境部署
now --prod

官网:now使用说明

代码规范

创建项目文件夹后,在文件夹下创建 api 目录和 now.json 配置文件

$ ls -lah
total 38K
drwxr-xr-x 1 xuthu 197609    0  4月 18 08:30 ./
drwxr-xr-x 1 xuthu 197609    0  4月 28 11:57 ../
drwxr-xr-x 1 xuthu 197609    0  4月 18 08:30 api/
-rw-r--r-- 1 xuthu 197609  312  4月 18 08:29 now.json
-rw-r--r-- 1 xuthu 197609  607  4月  5 19:30 README.md

Vercel 使用 Go Runtime 会从从项目的 api 目录中的.go文件中编译暴露的单个HTTP处理程序。

例如,index.go/api目录内定义一个文件,如下所示:

package handler

import (
  "fmt"
  "net/http"
)

func Handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "<h1>Hello from Go!</h1>")
}

我们访问 /api 即可输出 Hello from Go!

当我们需要暴露多个函数怎么办?/api 路由已被占用。此时我们需要使用到路由功能,路由在配置文件中被定义。

官网:Go运行时

配置文件

一个配置文件Demo:

{
  //version:now的第二版本 '强制'不建议使用第一版本
  "version": 2,
  //functions: serverless的无服务函数功能
  "functions": {
    // 暴露 api/version_go.go 文件 指定该函数运行时资源
    "api/version_go.go": {
      "maxDuration": 5,
      "includeFiles": "data/data.db"
    }
  },
  // routes 指定路由 src为访问时路由 dest为真实处理文件
  "routes": [
    { "src": "/api/version", "dest": "api/version_go.go" },
    { "src": "/", "dest": "index.html" },
    { "src": "/api", "dest": "index.html" }
  ]
}

官网:配置文件

注意

  • 部署后文件无写权限,类似sqlite数据库将会只读
  • 创建 .nowignore可屏蔽无需部署资源 规则与 .gitignore 一致
  • 包含文件在配置文件中定义,includeFiles选项使用相对路径

Demo

https://github.com/xuthus5/zeit-serverless