Serverless Custom (Container) Runtime

函数计算冷启动 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’);

// 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)使用阿里云容器镜像服务创建命名空间和镜像仓库 (https://cr.console.aliyun.com/) 存放我们的自定义镜像

接下来,先编写 Dockerfile,再构建包含我们 Node 指定版本运行环境和应用代码的镜像,最后上传到自己的镜像仓库。

(有需要的同学可以先看下这篇文章如何把一个 Node.js web 应用程序给 Docker 化 (https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/) )

(1) 编写 Dockerfile:

# 基于基础镜像 node:16.1.0-alpine3.11 构建我们自己的镜像

FROM node:16.1.0-alpine3.11

# 设置容器工作目录

WORKDIR /usr/src/app

# 将 package.json 和 package-lock.json 都拷贝到工作目录

COPY package*.json ./

# 安装依赖

RUN npm install

# 将当前目录下的所有文件拷贝到容器工作目录中

COPY . .

# 暴露容器 8080 端口

EXPOSE 8080

# 在容器中启动应用程序

ENTRYPOINT [ “node”, “server.js” ]

(2)安装启动 Docker,登录阿里云镜像服务,构建并上传:

# 登录

$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com

登录成功后,先构建 Docker 镜像:

# 指定 ACR 镜像地址:其中 my_serverless 为你自己的容器命名空间;nodejs 为你自己的镜像仓库名称;v16.1.0 为镜像版本号

$ export IMAGE_NAME=“registry.cnhangzhou.aliyuncs.com/my_serverless/nodejs:v16.1.0”

# 构建镜像

# -t 给镜像取名字打标签,通常 name:tag 或者 name 格式

  d o c k e r   b u i l d   − t    docker build -t   docker build t IMAGE_NAME .

再启动容器,本地打开浏览器 http://localhost:9000/ 看是否可以正常响应,来验证我们的自定义镜像是否可以运行成功:

# 启动容器:将容器的 9000 端口映射到主机的 9000 端口$ docker run -p 9000:9000 -d $IMAGE_NAME

验证通过后,最后上传镜像:

# 上传镜像

  d o c k e r   p u s h    docker push   docker push IMAGE_NAME

上传成功后,可以在阿里云镜像服务中看到我们的镜像。后面就可以使用它啦!

3.定义 template.yaml

创建一个 template.yaml文件如下:

ROSTemplateFormatVersion: ‘2015-09-01’

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

Resources:

CustomContainerRuntime: # 服务名称

Type: ‘Aliyun::Serverless::Service’

Properties:

Policies:

- AliyunContainerRegistryReadOnlyAccess

InternetAccess: true

nodejs-express-http: # 函数名称

Type: ‘Aliyun::Serverless::Function’

Properties:

Description: ‘HTTP function powered by nodejs express’

Runtime: custom-container # 表示自定义容器

Timeout: 60

CAPort: 9000 # 注意!这里Custom Container Runtime使用的监听端口一定要和HTTP Server监听的端口保持一致,否则会出现错误

Handler: not-used

MemorySize: 1024

CodeUri: ./   # Root directory for the function or the Dockerfile path

CustomContainerConfig: # 容器镜像配置

# Sample image value: registry-vpc.cn-shenzhen.aliyuncs.com/fc-demo/nodejs-express:v0.1  使用同地域的VPC镜像地址加速

Image: ‘registry.cn-hangzhou.aliyuncs.com/my_serverless/nodejs:v16.1.0’

Command: ‘[ “node”]’

Args: ‘[“server.js”]’

Events:

http-trigger-test:

Type: HTTP

Properties:

AuthType: ANONYMOUS

Methods: [‘GET’, ‘POST’, ‘PUT’]

4.部署测试

# 使用命令部署到 FC

$ fun deploy -y

部署成功后,我们去 FC 平台上进行测试。

因为我们在 template.yaml 中配置的触发器是 http 触发器,所以我们点击“执行”按钮进行调试,发现正常运行,返回结果为 runtime is: Node V16.1.0,说明我们的自定义容器运行环境也成功实现了!

小结

Custom Runtime 为我们打破了 FaaS 平台对语言的限制;Custom Container Runtime 让开发者可以将应用代码和运行环境打包成容器镜像作为函数的交付物,优化开发者体验、提升开发和交付效率。

自定义(容器)运行时让我们开发者使用 Serverless 的自由度更高,通过它们可以让我们无需代码改造,一键迁移我们的 Web 应用。

文末

如果30岁以前,可以还不知道自己想去做什么的话,那30岁之后,真的觉得时间非常的宝贵,不能再浪费时间在一些碎片化的事情上,比如说看综艺,电视剧。一个人的黄金时间也就二,三十年,不能过得浑浑噩噩。所以花了基本上休息的时间,去不断的完善自己的知识体系,希望可以成为一个领域内的TOP。

同样是干到30岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说30岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

前端面试题汇总

JavaScript

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值