本文是 serverless 入门与实践 的第4篇, 是学习笔记的第4篇
Serverless 实战与进阶 Serverless in action and advanced
陈仲寅(张挺)
阿里巴巴淘系技术部前端架构团队 负责维护 midwayjs 品牌旗下 的 midway,pandora, sandbox,injection 等产品。
我们希望所有的库,API 定义都有 TypeScript 的身影,感觉任重而道远。
负责制定集团 Serverless 规范, 以及参与各个平台,工具链,在 协议 和 API 层面的一致性落地。
业界现有的 Serverless 体系介绍
Serverless 大公司
- AWS Lambda,最早被⼤大众所认可的 Serverless 实现。
- Function Compute,阿⾥里里云⾃自研的 Serverless平台
- Tecent SCF,腾讯云函数,Serverless 平台
- Azure Functions,来⾃自微软公有云的 Serverless 实现。 OpenWhisk,Apache 社区的开源 Serverless 框架。
- Kubeless,基于 Kubernetes 架构实现的开源 Serverless 框架。 Fission,Platform9 推出的开源 Serverless 框架。 OpenFaaS,以容器器技术为核⼼心的开源 Serverless 框架。
- Fn,来⾃自 Oracle 的开源 Serverless 框架,由原 Iron Functions 团队开发。
语言支持
- Node.js 70.86%
- Python 14.85%
- Java 4.63%
- Go 2.24%
- .NET core 1.33%
能力支持
- HTTP API Gateway
- 定时
- 对象存储
- 消息队列
- 日志服务
- 数据库
- 流式计算
- IoT
- 边缘计算
- 其他: 可观测 工作流
云计算发展:
- 产品维度&计费模式 弹性+按需: IaaS CaaS PaaS 开源PaaS FaaS
- 虚拟化: physical virtualization CloudCompute container serverless
serverless = FaaS(cloud function) + BaaS(cloud service)
触发器
- 也叫 Event(事件),Trigger 等,特指触发函数的⽅方式。 与传统的开发理理念不不同,函数不不需要⾃自⼰己启动⼀一个服务去监听数据,⽽而是通过 绑定⼀一个(或者多个)触发器器,数据是通过类似事件触发的机制来调⽤用到函数。
- ⽬目前云⼚厂商最常⻅见的触发器器就是 http 和 timer、云存储等。
函数
- 逻辑意义上的⼀一段代码⽚片段,通过常⻅见的⼊入⼝口⽂文件包裹起来执⾏行行。函数是单⼀一 链路路,并且⽆无状态的,现在很多⼈人认为,Serverless = FaaS + BaaS ,⽽而 FaaS 则是⽆无状态的函数,BaaS 解决带状态的服务。
什么叫带状态(stateful)
- 应⽤用状态就是应⽤用组件完成他们的⼯工作(即执⾏行行任务)时所需的数据。从软件的架构、编码的范式到编程语⾔言本身都离不不开应⽤用状态的参与,应⽤用状态实质上说明了了着怎样去管理理⼀一个应⽤用的⾏行行为(任务,操作等)和状态(数据)。
- 全局变量量 本地⽂文件存储 ⻓长链接 。。。
函数组(服务)
- 多个函数聚合到⼀一起的逻辑分组名,对应原有的应⽤用概念。
函数运行时
- 英⽂文叫 Runtime,具体指执⾏行行函数的环境,其中包含了了 Node.js 和⼀一个对接平台的代码包,该代码包会实现对接平台的各种接⼝口,处理理异常,转发⽇日志等能⼒。
区别和问题
- 多平台出⼊入参不不同
- 参数没有定义,不不知道结构,需要看⽂文档
- 代码简单,依赖需要⾃自⼰己装
场景
- 静态网站托管
- 构建 RESTful API
- 部署全栈应用
企业级 Serverless 开发模式
运行态系统架构 / 函数架构
研发模式升级: 在整个升级过程中,针对研发过程中的各类相似问题,提炼出一些共性的解决方案
- 升级框架、工具链,技术栈
- 升级前端同学的应⽤用开发意识
经历⼀一年年的研发模式升级: 完成了淘宝和飞猪两大BU导购链路,以及一些内部系统的升级。 经历了双十一和双十二大促的考验,承载了千万级的流量。
设计 Serverless Framework
- 防⼚厂商锁定: 标准 -> cli / yaml
- 灵活性: 开发+部署 函数横向聚合能⼒
- 开发效率: TYPESCRIPT FaaSContext 标准化代码结构
- 生命周期扩展: runtime 同仓库多函数
企业级 Serverless 体验和实践
代码示例
- ⼀一个 Blog 系统,包含传统 CRUD 部署到 阿⾥里里云 和 腾讯云 云函数 使⽤用了了 MongoDB, 使⽤用了了 midway-faas 技术栈部署
代码结构: 接口定义 打包信息 平台信息 服务名(应用)
简单的⽬目录约定: 入口绑定 初始化逻辑 业务 响应
部署示例: 调试和测试
从传统应⽤用迁移到 Serverless 体系
用户诉求
- 传统应⽤用迁移,不不想增加成本
- 需要跨不不同的平台
- 有逐步迁移到标准 FaaS 的可能性
运行时扩展
私有化 Node.js 运⾏行行时⽅方案
社区的函数方案: 云平台网关 -> 函数运⾏时 -> ⼊口文件(code -> midway-faas -> fc-runtime -> layer)
内部运行时 Runtime的本质 完整生命周期
- 对内:容纳代码的环境 (Node.js / v8)
- 对外:对接外部事件(⽹关)的服务 (http)
- 其他:更更多的扩展能力(Layer)
面向未来
- Serverless 是⼀一个⾮非常适合前端去开拓拓和挖掘的⼀一个新体系
- 不不断的寻找新场景(SSR/传统技术栈),性能优化(极速启动)
- 携⼿生态共赢