Serverless 入门

454 阅读6分钟

概念


Serverless 从字面看是 "少服务" 的意思, 也就是网上常说的 "无服务架构", 当然并不是说基于 Serverless 架构的软件不需要服务器就可以运行, 它指的是用户无需关心服务器的状态、资源(CPU、内存、磁盘、网络), 也就是说运维部分不需要用户关心, 只需要将精力集中到业务逻辑上的开发。
其实 Serverless 早已与前端产生了联系, 比如 CDN, 我们将静态资源发布到 CDN 之后, 就不需要关心 CDN 有多少个节点, 节点是如何部署的, 也不用关心负载均衡、网络加速等问题。
而在我们前端使用 Serverless 的场景主要会有 SSR、大前端方向的全栈开发。

优缺点


根据 Serverless 的特性, 我们可以总结出以下优点:

  1. 低运维成本 (云计算资源、All on Cloud)
  2. 事件驱动触发 (云资源事件触发、 HTTP 请求触发)
  3. 安全可靠 (云厂商保障、代码加密托管、抵御网络攻击)
  4. 按需计费 (百毫秒级别计算计量、每月免费额度前 100 万次调用免费)
  5. 弹性伸缩 (方便扩容、提前应对峰值流量)

同样 Serverless 也是一把双刃剑, 它也有它的缺陷:

  1. 可移植性 (Serverless 应用的实现在很大程度上依赖于 Serverless 平台及该平台上的其他服务, 然而不同厂商的 Serverless 平台和解决方案的具体实现并不相同)
  2. 执行时长 (Serverless 一个重要的特性是按需加载执行, 而不是长时间部署在主机上, 目前大部分 Serverless 平台对执行时长都有限制, 如阿里云函数计算最大执行时长为 10 分钟)
  3. 性能 (Serverless 长时间没有被调用, 会被主机卸载, 当再次调用时, 会触发冷启动, 冷启动包含了代码下载、启动函数实例容器、运行时初始化)
  4. 调试与测试 (由于本地环境跟平台环境存在一定的差异性, 开发者需要不断的调试代码打印日志, 并提交到函数平台进行测试, 在此期间会带来一定的开发成本和产生一些费用)

入门


本次入门采用阿里云的函数计算做为此次 Serverless 平台服务, 开发语言选择 node

Serverless 配置


  1. 安装 VSCode 阿里云函数计算插件
  2. 在 VSCode 侧边栏选择刚才装好的插件, 点击 Bind New Account, 填写所需要的 Account ID、AccessKey ID、Access Key Secret, 这些信息都能在函数计算的常用信息里找到
  3. 创建一个 Serverless 函数, 输入 server name 和 function name, 之后选择所需要的 node 环境
  4. 创建成功之后会自动生成模板函数和一个在根目录下的 template.yml 文件, 它是 Serverless 配置文件, 里面可以配置环境变量、Log 的配置、运行环境、超时时间、内存大小等等其他配置项
  5. 创建一个 Serverless, 用于之后的演示
  6. 通过点击 Deploy 将函数部署到阿里云的 Serverless 服务上

API 配置


  1. 我们需要在 API 网关中创建一个 HTTP 的请求与 Serverless 关联
  2. 绑定域名, 查看二级域名, 然后到域名控制台, 云解析一下 DNS, 记录类型选择CNAME, 主机记录填写自己想要的域名, 记录值填写二级域名
  3. 进入到 API 管理界面
  4. 填写 API 的基本信息, API 名称填写与 Serverless 函数名统一, 便于查找, AppCode认证选择允许 AppCode 认证
  5. 定义 API 请求, 主要注意 2 个地方, 请求 Path, HTTP Method
  6. 定义 API 后端服务, 注意要选择函数计算, 之后的信息填写 Serverless 相关信息, 再点击下一步, 点击创建, 至此完成 API 创建工作
  7. 创建成功之后会弹出一个发布的窗口,点击发布即可
  8. 到这里发现访问不了创建的 API, 因为需要先授权一下, 找到应用管理, 创建 APP
  9. 创建成功之后, 找到应用ID, 记录一下, 后面授权会用到
  10. 在 API 列表页找到对应 Sereverless 的 API, 点击授权, 输入刚才记录的应用 ID, 完成授权功能
  11. 到这里我们的 API 部分就已经完成了, 接下来要尝试用 Postman 调用接口, 由于我们刚才开启了 AppCdoe 的认证, 所以我们需要将 AppCode 记录一下, 待会授权的时候会用到
  12. 还需要改 Serverless 的返回格式, callback 第一个参数是返回错误信息, 第二个参数如果是 http 请求调用, 需要返回 statusCode 和 body, 改完之后需要重新部署上去
  13. 配置 Postman, 选择 Post 请求, 配置 Authorization 将刚才记录的 AppCode 填写上去, 点击发送, 查看 Body, 返回的正是我们在 Serverless 的 body 信息

示例


尝试使用 Serverless 做了一个简单的增删改查界面, 效果图如下:

  • 采用 axios 调用接口, 在 axios 配置项中将 baseURL 配置为 Serverless 的域名, Authorization 设置为 APPCODE
  • 调用接口与平常调用方式一样
  • Serverless 处理业务逻辑

注意事项


mysql 链接字符串涉及到信息安全问题

  1. 我们首先将 Mysql 的 JSON 配置通过 JSON.stringify 转化为字符串, 然后再通过 btoa 函数转化为 base64
  2. 然后在 Serverless 的环境变量中存储 Mysql 配置
  3. 也可以将 MYSQL 配置写到 template.yml 文件中, 这样每次发布之后, 都会保证环境变量存在 Mysql 的配置
  4. Serverless 解析的时候需要从 process.env 中取到 Mysql 配置, 然后通过 atob 解码成字符串, 再通过 JSON.parse 转成 JSON

入参如何获取

  • 默认的参数是字符串格式的, 需要在 Serverless 入口通过 JSON.parse 转化成 JSON 格式

如何给出返回结果

  • Serverless 第三个参数为 callback, 可以通过这个函数将返回结果抛给请求者, callback 第一个参数是错误信息, 给定 null, 表示成功, 第二个参数为成功的返回结果, 如果是 HTTP 方式请求, 需要使用 JSON 格式返回 statusCode 和 body

如何获取到 Post 参数

  • 通过 event 的 body 获得 Post 参数, 它是 Base64 格式, 需要通过 atob 解码成字符串, 再通过 JSON.parse 转成 JSON

如何获取到 Get 参数

  1. 需要先创建 API 的第二步, 定义 API 请求中设置入参请求模式为入参透传
  2. 之后通过 event 的 queryParameters 获得 Get 参数

如何查看 Log

  1. 需要先在阿里云平台上开启日志服务, 创建 Project
  2. 之后在 template.yml 文件中加入 LogConfig

总结


Serverless 技术的诞生, 为前端走向更远的道路提供了一种方向。它的作用对于前端而言, 更多的在于我们不需要过多的关心服务器的运维, 不需要关心我们不熟悉的领域, 只需要将精力集中在业务逻辑上的开发。
未来也可能给前端带来更加便捷的开发方式, 前后端可以统一语言、统一规范, 缩短了联调时间和人力成本, 让前端工程师向全栈开发进行转型。