减持|玩转 serverless devs 的三种部署方式

减持|玩转 serverless devs 的三种部署方式

文章图片



serverless-devs 是一个开源的 Serverless 应用全生命周期管理工具 。
笔者作为一名 Serverless 应用开发者 , 对国内的阿里云FC , 腾讯云SCF都有一定的了解 。 接下来我将在此文中介绍: 如何使用这个工具 , 来把同一个应用 , 通过不同的方式 , 部署到阿里云函数计算中 。
文章中使用的示例项目为一个 nestjs 应用 , 运行环境为 nodejs , 源代码见附录 。 这三种部署方式 , 由于部署目标平台都为阿里云 , 统一使用   。
预置 Runtime 部署
这个部署方式是最简单直接的 , 假如你只是想搭建一个简单的 web service 或者处理做一些 batch job , 不需要依赖一些额外的系统库或者软件 , 往往使用这个方式部署就够了 。 主要的 yml 配置也很简单:
function:  runtime: nodejs14  # 运行环境  handler: index.handler # 函数入口
这种方式最大的特点 , 就是 runtime 需要从预置的枚举值中配置一个具体值 , 比如 nodejs12nodejs14python2.7python3java8java11php7.2dotnetcore2.1 等等 。 一旦你指定了具体的运行时 , 那么函数动态扩容伸缩所使用的镜像就已经确定了下来 。 接下来就是把你的代码放入镜像创建容器中 , 去执行了 。 此时就需要 codeUri 和 handler 这些配置项了 , 用它们来指定 , 执行代码入口 。
同时除了对外暴露的 handler 中的代码会被执行外 , 在 。 就以 initialize 这个回调方法名为例 , 我们在函数配置中设置函数的 Initializer 回调程序为 index.initialize  , 那么 exports.initialize 这个方法会在实例初始化时被执行 , 其他生命周期亦然 。
Custom Runtime 部署
自定义运行环境部署 , 与预置 Runtime 部署方式 , 最大的特点就是可自定义语言和运行时了 。
我们为啥需要这种部署方式?当然是因为预置的 Runtime 不够用了 。 通过这种方式 , 我们可以自定义运行时的语言和版本 。 比如使用 rust 和 nodejs2048 。 而它主要的 yml 配置也很简单:
function:  runtime: custom  # 运行环境(从预置的枚举值中选一个)  caPort: 9000  customRuntimeConfig: # 不用这个就用 bootstrap 文件 , 示例见附录    command:      - /code/node-v16.15.0-linux-x64/bin/node    args:      - 'dist/main.js'
其中 customRuntimeConfig 中声明了启动命令和参数 , 直接执行便可 。
需要注意的是 , 这种部署方式 , 需要你上传运行环境的解析器/运行时 , 再和你的代码文件 , 一起打包部署到函数计算 。 这往往很大 , 比如我下载的 node-v16.15.0-linux-x64 解压后足足有 100M , 所以可以找一种方式来复用运行时的包来加快你的部署速度 。
Custom Runtime 部署这种方式 , 要求你的代码是一个 HTTP Server 并监听指定的 caPort 端口 。 而且你的也是由 HTTP Server 中指定路由来完成的比如 /initialize /pre-freeze/pre-stop 这类 。
总的来说 , 它比起 预置 Runtime 部署 有了更多的可操作性 , 相比来说它的速度也差一些 , 毕竟代码包的体积变大了 , 每次都要下载解压 , 这个速度肯定是慢一点的 。 所以灵活的代价无非就是性能差一点 , 我们在选择部署方式的时候也要根据情况 , 斟酌损益 。