Serverless Custom (Container) Runtime,2024年上半年最接地气的前端面经

本文介绍了如何在阿里云FC平台上使用CustomRuntime和CustomContainerRuntime,以支持非官方语言版本和TypeScript,包括自定义HTTPServer、bootstrap文件的编写和资源配置。通过自定义运行时,开发者可以扩展功能并适应不同语言版本的需求。
摘要由CSDN通过智能技术生成

| F# | F# Custom Runtime |

| C++ | C++ Custom Runtime |

| Lua | Lua Custom Runtime |

| Dart | Dart Custom Runtime |

| 其他语言 | Custom Runtime |

可以看出,对于我们前端工程师,如果想使用阿里云 FC 平台,并不能随心所欲的使用 Node.js 和 TypeScript。因为 Node.js 只支持表格中的四种版本,而 TypeScript,FC 平台自身完全不支持。所以要想使用 Node.js 的其它版本和 TypeScript,就需要自定义运行时。

那么什么是 Custom Runtime 呢?

概念

运行时(Runtime)指函数代码在运行时所依赖的环境,包括任何库、代码包、框架或平台。Custom Runtime 就是完全由用户自定义函数的运行环境

FaaS 平台通过开放实现自定义函数运行时,支持根据需求使用任意开发语言的任意版本来编写函数。

作用

阿里云官方文档中说到,基于 Custom Runtime 我们可以实现这两件事:

  • 定制个性化语言(例如 Go、Lua、Ruby)和各种语言的小版本(例如 Python 3.7、Node.js 14)的执行环境,打造属于您的运行环境。

  • 一键迁移现有的 Web 应用或基于传统开发的 Web 项目到函数计算平台,不用做任何改造。

实现 Custom Runtime


本文将以阿里云 FC 为例,实现一个 Custom Runtime。其它平台比如腾讯云 SCF 等,原理和过程也都大致相同。

工作原理

Custom Runtime 本质上是一个 HTTP Server,代码里面包含一个名为 bootstrap 的启动文件,之后这个 HTTP Server 接管了函数计算平台的所有请求,包括事件调用或者 HTTP 函数调用等。

如今 Typescript 在 Node 中的应用已经越来越广泛,所以笔者将实现一个可以运行 TS 代码的 TypeScript 运行时。

操作步骤

准备工作

为了更快更好地玩转 Serverless 应用,需要先安装阿里云的一个 Fun 工具 (https://help.aliyun.com/document_detail/64204.html),它是一个用于支持 Serverless 应用部署的工具,能帮助我们便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助我们进行开发、构建、部署操作。

安装配置过程如下:

(1)安装:

// 安装命令

$ npm install @alicloud/fun -g

// 执行 fun --version 检查安装是否成功

$ fun --version

3.6.21

(2)安装好后,使用 fun config 命令配置账户信息(配置文档 (https://help.aliyun.com/document_detail/146702.html#p-h9e-864-bom)),按照提示依次配置 Account ID、AccessKey ID、AccessKey Secret、Default Region Name。

配置完成后,先在本地创建一个 TypeScript 项目 custom-runtime-typescript,并安装相关依赖。

npm i typescript ts-node @types/node

接下来,开始 Custom Runtime 的开发流程,一步一步打造属于自己的自定义运行环境。

1.搭建一个具有监听端口的 HTTP Server
  • 需要注意的是,这个服务一定要监听 0.0.0.0:CAPort 或 *:CAPort 端口,默认是 9000。如果使用 127.0.0.1:CAPort 端口,会导致请求超时

用 TS 编写一个 HTTP Server 文件 server.ts 如下:

注意:在开发函数具体的逻辑之前,一般会确认开发的函数是事件函数还是 HTTP 函数

import * as http from ‘http’;

// 创建一个 HTTP Server

const server = http.createServer(function (req: http.IncomingMessage, res: http.ServerResponse): void {

var rid = req.headers[“x-fc-request-id”];

console.log(FC Invoke Start RequestId: ${rid});

var rawData = “”;

req.on(‘data’, function (chunk) {

rawData += chunk;

});

req.on(‘end’, function () {

// 处理业务逻辑 ……

console.log(rawData);

res.writeHead(200);

res.end(rawData);

console.log(FC Invoke End RequestId: ${rid});

});

});

server.timeout = 0; // never timeout

server.keepAliveTimeout = 0; // kee palive, never timeout

// 启动 HTTP 服务并监听 0.0.0.0:9000 端口

server.listen(9000, ‘0.0.0.0’, function () {

console.log(‘FunctionCompute typescript runtime inited.’);

});

编写完成后,可以先在本地测试该服务是否启动成功,通过安装在项目中的 ts-node 命令来运行上述代码:

# 启动 HTTP 服务

$ ./node_modules/.bin/ts-node server.ts

启动后,在另一个终端中使用 curl 命令测试:

$ curl 0.0.0.0:9000 -X POST -d “hello world” -H “x-fc-request-id:123”

hello world

若服务已正常启动,说明它可以在接收 HTTP 请求后处理业务逻辑,然后将处理结果再以 HTTP 响应的形式返回给 FaaS 平台。

2.创建一个启动目标 Server 的可执行文件 bootstrap

函数计算冷启动 Custom Runtime 时,会默认调用 bootstrap 文件启动自定义的 HTTP Server。然后这个 HTTP Server 接管了函数计算系统的所有请求。

  • bootstrap 是运行时入口引导程序文件,它会告诉 FaaS 如何启动你的自定义运行时。Custom Runtime 加载函数时会固定检索 bootstrap 同名文件,并执行该程序来启动 Custom Runtime 运行时。

  • bootstrap 需具备 777 或 755 可执行权限

  • 如果是 shell 脚本,一定要添加 #!/bin/bash

创建 bootstrap 文件如下:

#!/bin/bash

./node_modules/.bin/ts-node server.ts

3.编写资源配置文件 template.yaml

在当前目录下编写一份用于部署到函数计算的资源配置文件 template.yaml:

ROSTemplateFormatVersion: ‘2015-09-01’

Transform: ‘Aliyun::Serverless-2018-04-03’

Resources:

custom-runtime: # 服务名称

Type: ‘Aliyun::Serverless::Service’

Properties:

Description: ‘helloworld’

custom-runtime-ts: # 函数名称

Type: ‘Aliyun::Serverless::Function’

Properties:

Handler: index.handler # Handler 在此时没有实质意义,填写任意的一个满足函数计算 Handler 字符集约束的字符串即可, 例如 index.handler

Runtime: custom # custom 代表自定义运行时

MemorySize: 512

CodeUri: ‘./’

4.部署、调用测试、完成

(1)使用 fun deploy -y 命令将我们的自定义运行时和业务逻辑代码所有资源部署到阿里云。

(2)使用命令调用部署函数,验证

$ fun invoke -e “hello,my custom runtime”

看到成功输出,就代表我们的 Custom Runtime 大功告成了!它可以直接运行我们写的 TS 代码了。

实现 Custom Container Runtime


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’);

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

后话

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

对于面试,说几句个人观点。

面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。

.(img-lRCSdwUy-1710835708077)]

后话

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

对于面试,说几句个人观点。

面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。

所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值