Serverless自定义运行时和单元测试(上)

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Serverless自定义运行时和单元测试(上)

使用自定义运行时支持自定义编程语言


Serverless应用的函数代码都是在FaaS当中运行的,但是在目前为止也只能选择FaaS平台所选择的编程语言开发应用。

FaaS平台所支持的编程语言有限,函数计算只支持Node.js 8和12、java和python,那么在使用不支持的语言或不支持小版本的时候就需要使用自定义运行时。


自定义运行时的原理


运行时(Runtime)是程序运行时所依赖的环境。

FaaS中的运行时就会创建函数所指定的运行环境,比如说函数计算的Node.js运行时,那就包括了Node.js运行环境以及一些内置的模块比如ali-oss、tablestore,除此之外还有Java运行时、Python运行时。

自定义运行时就是自己在FaaS自定义一个运行时环境,比如TypeScript,使用TypeScript来编写代码并且部署到FaaS平台上运行。

先来回顾下FaaS的运行原理

image.png

在FaaS当中运行时被预先定义,比如创建函数的时候可以指定runtime:nodejs12,接下来用户通过创建触发器驱动函数执行之后,Faas就会以nodejs12作为运行时来创建函数实例,函数代码也就在nodejs12这个运行时环境中执行。

怎么才能让函数在自己定义的运行时环境中执行?

安装依赖的本质就是要把函数运行所需要的依赖都打包上传至FaaS中,那能不能把函数的运行时也打包上传到Faas当中呢,也让Faas运用你上传的运行时来执行你的代码呢?



FaaS平台的自定义运行


用TypeScript编写代码

把代码和TypeScript的运行时都上传至FaaS中,然后通过特定的配置让FaaS通过自定义的TypeScript运行时来运行你的代码

runtime:custom

告诉FaaS你使用的是自定义运行时

bootstrap ts-node index.js

告诉FaaS函数启动时使用ts-node运行index.js

FaaS平台在运行函数时会有很多参数,这些参数怎么传递给自定义运行时呢?本质上是远程数据通信问题。

最简单点的在自定义运行时中实现一个Http服务,FaaS平台通过http请求把数据传递给自定义运行时。

image.png

自定义运行时就是使用自定义编程语言实现的Http服务,需要为你的Http服务指定一个启动命令。

boostrap文件示例

image.png

通用的做法把启动命令保存在名字叫做boostrap文件中,FaaS平台在创建函数实例的时候会执行boostrap文件,启动http服务。

把所有请求和参数都转发到Http服务中,让Http服务处理所有的请求。


自定义运行时的实现


源码示例

https://gitee.com/pingfanrenbiji/serverless-class/tree/master/07

实现一个TypeScript运行时,TypeScript为jS代码增加了类型系统,可以大大提升代码的可读性和可维护性。

大多数FaaS平台都不支持TypeScript,如果你想用一个TypeScript去编写一个Serverless应用,通常把代码编译成JavaScript再运行,很明显没有直接执行TypeScript代码高效。

如果想要直接运行TypeScript的代码,可以通过ts-node来实现,所以可以基于ts-node来执行一个TypeScript的运行时,这样就可以直接使用TypeScript来编写Serverless应用了。

image.png

首先在本地创建一个TypeScript项目,然后安装必要的依赖,为了把依赖都上传到FaaS,需要将ts-node等相关的依赖都安装到项目的node目录中。

自定义运行时需要实现一个http服务来接收FaaS平台的请求。

image.png

所以接下来使用TypeScript来编写一个Http服务

这段代码启动了一个http服务,监控9000端口。

然后在本地测试,通过在安装在项目中的ts-node命令来运行这段代码。

你还要创建一个boostrap文件在文件当中添加启动命令,这样让FaaS知道如何启动自定义运行时。

添加函数计算的template.yaml配置


  • • runntime的值必须为custom
  • • handler属性这里没有实际的意义,但是必须要填写

将自定义运行时部署到函数计算

其他无法直接安装在安装目录的编程语言,比如golang和最新版本的Node.js自定义运行时又该怎么实现呢?

如果要沿用TypeScript这种自定义启动命令的方式就需要把golang和代码打包,但是golang是直接安装在操作系统上的,依赖系统环境好像无从下手?


实现一个golang运行时

将运行环境和代码打包,这种思想是不是和容器技术很像?

容器技术就是将应用和运行所依赖环境打包为镜像,这样应用就可以轻松迁移和部署。

那能不能把golang的运行环境构建成docker镜像,然后让FaaS平台能支持自定义容器就能实现任意编程语言的运行时了。

FaaS平台也提供了自定义容器的能力

image.png

先构建一个容器镜像,然后通过函数的配置告诉FaaS平台使用你的容器镜像,在函数执行的时候FaaS平台会拉取容器镜像并启动容器执行代码。

与前面的TypeScript运行时一样在自定义容器镜像中也需要实现一个Http服务,用来接收FaaS平台所有的请求。

需要准备一个镜像仓库用来存放你的镜像。

函数计算目前只支持容器镜像服务中的镜像,所以你需要构建自定义运行时镜像然后上传到容器镜像服务中,你可以提前在容器服务中创建一个命名空间或镜像仓库,创建完毕之后记住仓库地址。


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
6月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
JavaScript NoSQL Serverless
函数计算产品使用问题之如何创建一个自定义运行时并指定Node.js版本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
缓存 Serverless API
函数计算产品使用问题之不同环境下如何绑定自定义域名
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
运维 Serverless 调度
函数计算产品使用问题之怎么在HTTP触发的函数里添加或读取自定义头部
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
运维 网络协议 Serverless
函数计算产品使用问题之如何绑定自定义域名
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
域名解析 缓存 运维
函数计算产品使用问题之添加自定义域名提示成功但实际不成功,是什么造成的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
存储 缓存 Serverless
函数计算操作报错合集之如何处理运行时报错:“Function time out after 600 seconds”
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
6月前
|
Serverless Go C语言
函数计算产品使用问题之如何在Golang运行时环境中解决glibc依赖问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
Java 测试技术 数据库
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
单元测试问题之LoginServiceImpl以避免对IpUtil的依赖问题如何解决
|
6月前
|
测试技术 持续交付
单元测试问题之确保单元测试自动化运行中的问题如何解决
单元测试问题之确保单元测试自动化运行中的问题如何解决

相关产品

  • 函数计算