跳到主要内容

在阿里云函数计算中使用

阿里云函数计算支持以容器镜像作为函数交付物,即 Custom Container 能力,因此可以将 Noslate 和函数计算结合,实现更细粒度的分级调度能力。

快速体验

可以参考函数计算 - CustomContainer文档,将下面的镜像部署在函数计算中:

docker pull ghcr.io/noslate-project/noslate-gateway:latest

其中 latest 为版本号,可以在版本历史中检索。

如果想定制镜像内容,可以继续阅读。

定制镜像

接下来,以上述示例镜像演示如何自定义函数计算容器镜像,该镜像使用 Web Server 模式,所以主要由两个部分组成:

  1. Noslate
  2. HTTP Server

定义 Noslate

如无自定义需求,可以直接使用 Noslate 提供的发行版本镜像:

ARG NOSLATE_VERSION

FROM ghcr.io/noslate-project/noslate:${NOSLATE_VERSION}

如有自定义需求,可以参考通过 Docker 部署 Noslate

定义 HTTP Server

可以根据自己使用习惯选择框架提供 HTTP 服务,处理函数计算网关发来的调用并使用 Noslate 来处理请求返回结果。

函数计算发起的调用有:

调用路径请求响应
/initialize参考函数计算公共请求头StatusCode
  • 200:成功状态
  • 404:失败状态
/pre-freeze参考函数计算公共请求头StatusCode
  • 200:成功状态
  • 404:失败状态
/pre-stop参考函数计算公共请求头StatusCode
  • 200:成功状态
  • 404:失败状态
/invoke函数调用数据及函数计算公共请求头函数Handler的返回值,包括响应码和响应头。其中,StatusCode
  • 200:成功状态
  • 404:失败状态

更多详细内容参考函数实例生命周期回调

根据具体需要,处理对应的请求即可,如有疑问可以参考HTTP请求处理程序(HTTP Handler)

为了能够将请求交给 Noslate 处理,在 /invoke 中需要做些引入 Noslate 提供的 SDK 并转发请求,可以参考 server.js

// 镜像中预置的环境变量
const NoslatedClient = require(process.env.NOSLATE_PATH).NoslatedClient;

// 初始化 agent
const agent = new NoslatedClient();
await agent.start();

// 转发请求
app.post('/invoke', async (req, res) => {
const response = await agent.invoke(functionName, req, metadata);

response.pipe(res);
});

将 HTTP Server 集成到容器中,并将监听的端口对外暴露。

# 均可自定义
ENV SERVER_PATH=/code
ENV SERVER_PORT=9000

RUN mkdir ${SERVER_PATH}
COPY resources/aliyun/server.js ${SERVER_PATH}/server.js

EXPOSE ${SERVER_PORT}

定义 ENTRYPOINT

在 ENTRYPOINT 中,我们需要将 Noslate 的各个组件以及上面的 HTTP Server 运行起来:

启动 Turfd

start_turfd() {
TURF_LOG=${NOSLATE_LOGDIR}/turf.log
nohup ${NOSLATE_BIN}/turf -D -f >${TURF_LOG} 2>&1
}

启动 Noslated

Noslated 包含 Data Plane 和 Control Plane 两部分,具体细节可以参考Noslated 介绍,两者的启动顺序没有要求。

start_planes() {
node ${NOSLATE_BIN}/data_plane &
node ${NOSLATE_BIN}/control_plane &
}

启动 HTTP Server

HTTP Server 会与 Data Plane 和 Control Plane 建立连接,建议放在最后启动,同时用来保持容器运行。

start_server() {
node ${SERVER_PATH}/server.js
}

这里提供一份写好的 start.sh 用作参考。

将这个文件拷贝到镜像中,增加执行权限,指定为容器的 ENTRYPOINT。

COPY resources/aliyun/start.sh ${SERVER_PATH}/start.sh
ENTRYPOINT ${SERVER_PATH}/start.sh start

构建镜像

至此,自定义镜像内容已经完成,我们执行构建即可。

docker build --build-arg NOSLATE_VERSION=0.0.1 noslate-aliyunfc.dockerfile -t noslate-aliyunfc

之后按照阿里云函数计算的流程发布函数即可,参考创建Custom Container函数