TS 的运行环境问题可以用 Custom Runtime 解决,但是 Node 某些版本平台不支持的问题,就不能用同样的办法了。因为 Node 是全局安装的,依赖系统环境。
FC 平台已经为我们想好了此类问题的解决办法,为我们提供了 Custom Container Runtime(自定义容器运行环境)的能力。FaaS 平台有这种能力,是因为它的底层实现原理是 Docker 容器,所以它通过运用容器技术,把我们的应用代码和运行环境打包为 Docker 镜像,保持环境一致性。实现一次构建,到处运行。
工作原理
Custom Container Runtime 工作原理与 Custom Runtime (https://help.aliyun.com/document_detail/132044.htm#Task-2259898) 基本相同:
-
函数计算系统初始化执行环境实例前会扮演该函数的服务角色,获得临时用户名和密码并拉取镜像。
-
拉取成功后根据指定的启动命令 Command、参数 Args 及 CAPort 端口(默认 9000)启动自定义的 HTTP Server。
-
然后这个 HTTP Server 接管了函数计算系统的所有请求,包括来自事件函数调用及 HTTP 函数调用。
下面我们自定义一个 Node V16.1.0 版本的容器运行环境。
操作步骤
1.自定义 HTTP Server
这一步和 Custom Runtime 相同,使用 Node.js Express 自定义一个 Http 服务 server.js,GET 和 POST 方法分别路由至不同的 Handler:
// server.js 文件
‘use strict’;
const express = require(‘express’);
// Constants
const PORT = 9000;
const HOST = ‘0.0.0.0’;
// HTTP 函数调用
const app = express();
app.get(‘/*’, (req, res) => {
res.send(Hello FunctionCompute, http function, runtime is : Node ${process.version}\n
);
});
// 事件函数调用
app.post(‘/invoke’, (req, res) => {
res.send(Hello FunctionCompute, event function,runtime is : Node ${process.version}\n
);
});
// 启动 HTTP 服务并监听 9000 端口
var server = app.listen(PORT, HOST);
console.log(Running on http://${HOST}:${PORT}
);
server.timeout = 0; // never timeout
server.keepAliveTimeout = 0; // keepalive, never timeout
启动服务,本地测试一下:
# 启动 HTTP 服务
$ node server.js
# 新开一个终端,通过 curl 命令测试
$ curl http://0.0.0.0:9000
Hello FunctionCompute, http GET, this runtime is : Node v11.5.0 # 这是我本地的 Node 版本,后面在自定义容器中会输出 v16.1.0
验证通过。
2.构建镜像并上传
同样的,需要先做两个准备工作:
-
1)安装启动 Docker
-
2)使用阿里云容器镜像服务创建命名空间和镜像仓