http服务中定义了一个接口 访问/返回golang版本。
当基于容器实现自定义运行时函数计算会将容器的http请求转发到/路由。
本地测试-启动Http服务
alpine是最小体积的golang运行环境。
构建并上传镜像
- • runtime的值等于custom-container表示该函数是自定义容器
- • 通过customContainerConfig来自定义容器镜像
部署+测试
小结
- • FaaS平台提供了有限的编程语言及版本的支持,使用自定义运行时,可以自定义编程语言进行开发
- • 自定义运行时原理是在函数中实现一个Http服务,FaaS平台将触发器事件转发到你的Http服务
- • 可以通过将运行时上传到FaaS,在bootstrap中定义启动命令来实现自定义运行时
- • 可以通过自定义容器镜像来实现任意编程语言的自定义运行时
自定义运行时是Serverless应用中非常重要的一个功能,可以突破Faas平台运行环境的限制,可以使用FaaS平台所不支持的编程语言进行开发。
基于容器实现自定义运行时你可以很方便的安装依赖,因为依赖都打包到了镜像中。
还可以平滑的将原有系统或传统应用平滑迁移到Serverless架构。
单元测试
单元测试是保证代码质量和应用稳定性的重要手段。
使用Serverless的难点
- • Serverless架构是分布式的,组成Serverless应用的函数是单独运行的,这些函数集合到一起组成分布式架构,你需要对独立函数和分布式应用都进行测试。
- • Serverless架构依赖很多云服务,比如各种FaaS、BaaS等,这些云服务很难在本地模拟
- • Serverless架构是事件驱动的,事件驱动这种异步工作模式也很难在本地模拟。
Serverless单元测试准则
越上层测试速度越慢,成本越高,所以应该写更多的单元测试。
Serverless应用依赖很多云服务,函数参数也与触发器强相关。
- • 准则一:将业务逻辑和依赖的云服务分开,保持业务代码独立,使其更易于扩展和测试
- • 准则二:对业务逻辑编写充分的单元测试保证业务代码的正确性
- • 准则三:对业务代码和云服务编写集成测试,保证应用的正确性
示例代码
保存用户信息,保存成功后并发送欢迎邮件,这段代码的业务逻辑没有和FaaS服务分开,单元测试依赖数据库和邮件服务,这些服务都需要发送网络请求。
代码重构
把存储数据和发送邮件的业务逻辑单独拆分到user类中,并且为user类提供构造函数,注入db和mailer依赖。