如何用函数框架快速开发大型 Web 应用 | 实战
Harry Chen 阿里 MidwayJs Team 负责人,长期招 Node.js 工程师。这是上个月前端早早聊第六届 Serverless 专场的分享。整个分享演示了三个示例,介绍了 Midway Serverless 体系的不同功能,欢迎尝试。
PPT 下载和分享:https://github.com/midwayjs/midway/tree/resource
1. 个人介绍
大家好,我是阿里巴巴淘系技术部基础架构组的张挺(花名),真名陈仲寅,平时社区看到 Harry Chen,czy88840616 都是我。
我今天给大家带来的是5分钟发布一个Serverless application,为什么是5分钟呢,有科学研究,人发呆的最短时间大概就是5分钟,一不小心就过去5分钟,也说明在 Serverless 体系下,开发和发布的便捷。
我当前负责的是集团的 Node.js 基础架构部分,支撑集团的 Node.js 中间件体系,midway 系列以及相应的插件,Nodejs 监控以及各种跟 Node.js 相关的工作,在开源社区,同时也维护整个 Midwayjs 体系,包括 Midway,Pandora,Sandbox 以及新出的 Midway-Serverless 体系。
同时,从2年前开始,我们就在一直做 Typescript 的推进,以及集团中间件标准定义的支持,未来应该是 TS 的天下。
最近正在负责经济体 Serverless Node.js 方向的基建,包括 yml 的标准化,能力的复用,以及框架、运行时、插件的稳定性。
2. 大纲
- 介绍 Serverless 当前集团以及社区体系的一些内容,以及各家云平台的对比,国内的主要是阿里云和腾讯云两家,以及我们现在使用 Serverless 的一些方案,分享这些方案能实现的一些内容,以及这些方案的一些风险;
- 穿插一些示例,将 Midway Serverless 体系的能力展现给大家;
- 面向未来,介绍一些未来的方向;
3. 为什么要使用 Serverless 体系
第一个问题,为什么要有 Serverless,它跟前端有什么关系?
这个问题,作为基础架构团队,从前年底开始就一直在研究和思考。其实一开始,并不是说要有 Serverless。从前年开始,集团一共有约 2000+的 Node.js 应用,有非常多的中后台系统,大多日常CPU 低于 5%,甚至有 0.5%的,每个应用都会配多台机器,这给集团造成很大的资源浪费。所以第一个诉求,就是要减少资源成本,特别是中后台。
第二块,前面有嘉宾也介绍过,前端其实也到了一个瓶颈期,从最开始的切图仔,到前后端分离,BFF 全栈,是时候需要一个被认可,能产出的方向,意味着,从前端的智能,扩大到整个应用,不仅仅会思考页面的部分,也会从全局考虑数据流、架构,这对前端整体的架构素质,有着非常大的提升。
基于以上这两个目的,我们开始对 Serverless 从 0 开始做实践,集团去年经历了双促,也扩展到了基本上所有 BU,在中后台,C 端都有不同的实践,算是欣欣向荣。基于这些实践,开源了我们针对 Serverless 体系而设计的 Midway Serverless 框架。
4. 前端的诉求
在国内社区,云服务商只有两个,阿里云和腾讯云。云服务商希望能扩大市场,这跟营收有关,另外一块,云资源,本身也是资源,虽然有超卖(比如一核,卖出两核)但是资源本身也需要精细化管理。
而对于社区用户,中小型开发者,你跟他说 Serverless,他思考的就是以下几个问题,我拿他做什么,和之前的区别是什么,选哪个平台,怎么简单的还是先,我的老代码怎么办,以及最重要的,我到底要花多少钱。碰到钱这个话题,大家都很敏感,我也是,前几天测试的时候,aws 每天向我收 0.08 美分,我还不知道为什么,我就很焦虑。以上就是我们所有的前端自己的诉求。
5. 社区和生态
那既然社区有这么多云平台来支持,那来看一下社区的生态是怎样子的?
5.1 语言支持
我们在去年进行了大量的调研,那么也包括了国外的一些平台,包括亚马逊,谷歌,微软以及国内的这些厂商,这么多的平台大体有一个特点。在语言支持的方面是非常偏向,整个体系对 Node.js 支持达到了70%以上,而其他的语言支持力度会非常的小,特别是 Java 和 .Net 这些在传统很占优势的一些语言。这些语言,就在 Serverless 体系上就不会过得非常好,这也是由于它的效率和速度决定的。一个 Java 启动,2G 内存,而Node只占 128M。
5.2 能力支持
那么在能力知识方面,我们对各大厂商也做了一些对比,如图所示,目前看起来密密麻麻,其实我们最多能用到的在售的体系或者函数体系的服务,基本上都已经包括了包括常见的对象存储、消息队列、定时任务和日志,还有前端最常用的 Http 能力都非常的有用。
6. 2019 前端四大方向
而另一边跟前端密切相关的,2019 年的前端四大方向,因为 2020 年还没有出,那么我们看到 Serverless 是其中的一大方向,特别是在阿里前端委员会的大力支持下,我们也在集团和的社区进行一路的推广和技术支持。
它的工作原理,我相信大家也都比较清楚了,这是亚马逊的一张非常通俗易懂的图,也是非常深入人心的上面演示了从调用到最后执行和收费的,整个流程可以很清晰的看到,函数的动态扩容,按量付费等高级特性。。
还是回归到用户本身我们刚才有些疑问,如果我是一个用户,那么 Serverless 到底是服务于哪些场景,我到底能做什么?
借用友商的一些图来表示,在社区上做得最多的有静态网站的托管,我会去 GDP 的 Epik High 以及把这些组合起来用来替代传统应用的这种全栈模型。
7. 阿里用来做什么?
- 导购场景,就是淘宝首页和飞猪首页这些营销的列表,它的流量在双十一也会非常大的,但是也是平稳的度过了;
- 中后台场景,我刚才说了我们的资源浪费的情况,我们要把这些传统的浪费的资源节省下来,并且能够希望逐步逐步地,没有人去访问的时候,把容器的资源缩到 0,然后应用就自然下线;
- RPC 场景,hsf 社区是 Dubbo,我们也是用函数承载的;
这些前端都能参与,也变相的让前端的职能逐步进行了扩大。
8. 目标
而今年我们的目标就是成本,当然也是一个希望,能将传统 80% 的能力支持掉,同时也节省掉上面所说的那些机器。
9. 方法
当前的应用上函数有两种,分别有不同的人在推进,直接把大应用迁移(老应用),或者直接重写(新应用),刚才嘉宾光毅介绍的是我们把整个原 egg 应用部署到函数体系中,而另一块,也是我们在主导的,使用一个复用大部分传统能力的新的框架来支持函数。
两种模式是天然的试错,我们觉得传统框架直接上函数有一定的风险,这个风险就在于传统框架的不确定性。
传统框架是为多进程,启动时间不明感,以及状态存储而设计的,而在函数场景下,我们觉得需要变的更纯粹,调用和执行方式也不同,所以才将原来的 Midway 的核心抽象,产生了更轻量,启动更快速,单进程设计的 Midway Serverless 框架。(后续我们将两者合并,尽请期待)
10. Midway Serverless 体系结构
整个 Midway Serverless 体系包括三个部分,CLI 部分,本地多云开发,调试,以及社区的多平台发布,第二块是传统框架的能力,依赖注入,应用分环境配置,以及组件复用,扩展性等等,第三块是标准化,包括yml标准,前端调用函数标准,以及适用于私有化运行时部署的运行时标准。
11. 示例
下面是示例部分,这次我带来了三个示例,分别介绍不同的能力,如果需要跟着我做,一些准备工作需要提前完成。
11.1 准备工作
11.2 示例一
第一个示例,我会演示纯函数如何发布成 HTTP API,以及如何在本地进行开发,调试。
1、介绍目录结构,每个文件的作用;2、介绍 f.yml 的内容;3、介绍函数的入口,大体结构,类写法;4、测试的方法;
功能演示:
1、f invoke -f index 调用函数
2、f invoke -p + 修改实时生效 修改文本 hello world111,实时生效,我们的本地服务,模拟了网关的能力
3、修改返回值为 html,增加 type ,我们的定义,让习惯 koa 的人很熟悉,也通过它,也可以方便的直接使用 koa 中间件,按 F12 查看请求
4、启动调试能力,invoke -p —debug
5、演示部署到腾讯云和阿里云
11.3 示例二
第二个示例是一个一体化示例,什么是一体化呢,就是前端 + 后端在一起开发,一起部署,在大多数的中后台场景中都非常的适用,同时请记住,我们的示例都是跨多云的,第二个示例我将演示发布到阿里云,而第三个示例我将演示发布到腾讯云。
功能演示:
1、f create 选择 vue 示例
2、本地打开,介绍vue的组件,函数的子目录,以及 faas 的vue 插件
3、启动 http://127.0.0.1:8080/ 查看 vue 渲染,强调本地只启动一个端口,前后端完全在一个仓库中开发(本身就是一个人
4、F12 查看函数接口,修改函数接口,刷新返回
5、尝试发布阿里云,发布前停顿,介绍高密度
6、尝试访问 vue-scf.mdemo.cn
11.4 示例三
第三个示例是一个复杂的全栈应用,我们增加了数据的部分,这里采用了阿里云的 OTS 来存储,实际情况下你也可以使用自己的 MySQL 或者其他数据库。
由于代码相对复杂,我们进行了分层,将规则和用户接口进行了抽象。
代码结构
功能演示
1、由于包含秘钥,还未上传,后面会有
2、介绍目录结构,函数的目录,数据库的分层,解耦,重点,看上去是应用,实际是按接口维度的函数
3、这次我们发布腾讯云,我把之前的删掉了,访问一下看看 qy-scf.demo.cn 确认是没部署的情况
4、然后 deploy,再次访问,对比同样一份在阿里云的代码 qy.demo.cn,做一些更新操作,两边数据同步
示例演示就到这里,我们展示了三种不同类型的,基于 midway serverless 的函数开发模型,既有简单的纯函数提供 HTTP 接口,也有复杂的中后台应用,对中小型开发者开发日常的博客,中后台都有很大的帮助。
12. 面向未来
第三部分,我们面向未来,看看之后要做的事情。
Serverless 是一个非常适合前端去开拓和挖掘的一个新体系,他的轻量和面运维让前端不用自己去维护服务器本身,而更专注逻辑部分,同时,也非常适合小公司,个人开发者搭建自己的官网、接口,服务。
Midway Serverless 对于我们来说,是一个在新场景下的函数框架,希望能帮助用户在函数体系下更好的在代码层面解决问题。我们在不断寻找新场景的同时去追求极致的启动速度。
另外,也能在框架层面,希望和各个云平台携手共赢,把整个生态支撑起来。
后面,我们也会考虑将单体应用和 Serverless 应用 的互转,甚至是协同,在 IoC 体系是可以做到的。
另外,也会开始支持其他的平台,比如 aws,以及腾讯的 Component。
13. Thanks
最后,我们也在持续招人,欢迎沟通,这里是我的微信以及 Midway 的答疑群,谢谢大家收听(阅读)。
PPT 下载和分享:https://github.com/midwayjs/midway/tree/resource
讲稿简要整理版(完整版含演示请看录播视频和 PPT),链接如下: