222 lines
16 KiB
Markdown
222 lines
16 KiB
Markdown
# 11 | 经验:Serverless开发最佳实践
|
||
|
||
你好,我是秦粤。上节课,我们了解了利用K8s集群的迁移和扩展能力,可以解决云服务商锁定的问题。我们还横向对比了各大云服务商的特点和优势,纵向梳理了云服务商提供的各种服务能力。最后我们可以看到,利用Knative提供的Container Serverless能力,我们可以任意迁移部署我们的应用架构,选择适合我们的云服务商。
|
||
|
||
但同时我们也发现,FaaS相对于Knative,反而是我们的瓶颈,我们无法平滑地迁移FaaS的函数。云服务商大力发展FaaS,其实部分原因也是看中了FaaS新建立起来的Vendor-lock,因此目前各大运营商都在拼FaaS的体验和生态建设。
|
||
|
||
那这节课,我们就来看看FaaS是如何解除云服务商锁定的吧。但在正式开始之前呢,我们先得了解一些FaaS的使用场景,以免一些同学误会,要是你的实践是为了Serverless而去Serverless,那就不好了,我们还是应该从技术应用的角度出发。
|
||
|
||
## FaaS场景
|
||
|
||
我从[\[第5课\]](https://time.geekbang.org/column/article/229905) 开始就在讲FaaS和BaaS的底层实现原理Container Serverless,是希望通过底层实现原理,帮助你更好地掌握Serverless的思想。但在日常工作中,使用Serverless,只需要借助云服务商提供的Serverless化的FaaS和BaaS服务就可以了。
|
||
|
||
就像我上节课中所讲的,FaaS因为可以帮助云服务商利用碎片化的物理机算力,所以它是最便宜的。在日常工作中,我十分鼓励你去使用FaaS。
|
||
|
||
那么说到使用FaaS,以我的经验来说,我们可以将FaaS的最佳使用场景分为2种:事件响应和Serverless应用。
|
||
|
||
### FaaS事件响应
|
||
|
||
FaaS最擅长的还是处理事件响应,所以我们应该先了解清楚,你选择的云服务商的FaaS函数具体支持哪些触发器,例如阿里云的触发器列表\[1\]、腾讯云的触发器列表\[2\]。因为这些触发器通常都是云服务商根据自身Serverless的成功案例所制定的下沉方案,也就是说这些触发器都具备完整的使用场景。基于FaaS支持的触发器,设计事件响应函数,我们就可以最大限度地享受FaaS的红利,而且不用担心用法不正确。
|
||
|
||
### Serverless应用
|
||
|
||
那如果FaaS是作为Serverless应用的使用场景,我们则需要关注大型互联网公司的成功案例所沉淀出来的成熟方案。这样既可以轻松简单地搭建出Serverless应用,还能帮我们节省不少费用。
|
||
|
||
因为我们尝试用FaaS去解构自己的整个应用时,如果超出了目前FaaS的适应边界,那么技术挑战还是比较大的。所以我并不推荐你将整个现存的应用完全Serverless化,而是应该去找出适用FaaS事件响应的场景去使用FaaS。
|
||
|
||
如果你关注Serverless就不难发现,至少目前它还处在发展阶段,很多解决方案还在摸索之中。大厂具备技术实力,也乐于在拓展Serverless边界的同时发现痛点、解决痛点并占领技术高地。那如果你是一般用户,最好的选择还是持续关注Serverless动向,及时了解哪些方案可以为自己所用。当然,这是Serverless的舒适圈,但技术挑战也意味着机遇,我确实也看到有不少同学因为拓展Serverless的边界而被吸收进入大厂,去参与Serverless共建。
|
||
|
||
## FaaS痛点
|
||
|
||
以上就是我对FaaS应用场景的一些看法和建议。虽然FaaS最擅长是事件响应,但是如果可以改造Serverless应用,无疑FaaS的附加值会更高。接下来我们就看看FaaS在Serverless应用过程中切实存在的痛点,相信随着课程一路跟下来的同学一定深有体会。
|
||
|
||
* 首先,调试困难,我们每次在本地修改和线上运行的函数都无法保持一致,而且线上的报错也很奇怪,常见的错误都是超时、内存不足等等,让我们根本无法用这些信息去定位问题。
|
||
* 其次,部署麻烦,每次改动都要压缩上传代码包,而且因为每个云服务商的函数Runtime不一致,导致我们也很难兼容多云服务商。
|
||
* 最后,很多问题客服无法跟进,需要自己到处打听。
|
||
|
||
但如果你有仔细阅读文档的话,你就会发现各大云服务商都会提供命令行调试工具,例如阿里云提供的"fun"工具\[3\]、腾讯云合作的Serverless Framework等等。不过云服务商提供的工具,都是云服务商锁定的。为了破解FaaS的新Vendor-lock,我从目前热门的Serverless社区中,选择了3个Serverless应用框架和1个平台,介绍给你帮助你破解Vendor-lock,同时也能更好地解决痛点。
|
||
|
||
## Serverless应用框架
|
||
|
||
### Serverless Framework \[4\]
|
||
|
||
Serverless框架作为第一款支持跨云服务商的Serverless应用解决方案,一旦进入首页,我们就可以看到:Serverless X Tencent Cloud。其实最早的Serverless框架官方例子是AWS的,不过从去年开始被腾讯云强势入驻了。正如我上节课中所讲,腾讯云将Serverless作为切入云服务商市场的突破口,正在大力推进Serverless腾讯云的生态建设。
|
||
|
||
Serverless框架具备先发优势,而且已经有很多成熟的应用方案,我们可以直接拿来使用。我们可以通过Serverless Component用yaml文件编排整个Serverless应用架构。
|
||
|
||
另外Serverless Framework也支持将应用部署到其他Provider:AWS、阿里云、Azure,还有Knative等等,正如以下图示。不过这里有个小问题:就是我们只有在[英文版Serverless框架的官网](https://www.serverless.com/framework/docs/providers/)上才能看到其他云服务商的Provider和文档介绍([中文版Serverless框架官网](https://www.serverless.com/cn)一并给出)。
|
||
|
||
![](https://static001.geekbang.org/resource/image/8b/19/8b389343945134f7a0782ae1eb2d6919.jpg)
|
||
|
||
Serverless Framework官方本身主要解决跨云服务商Serverless应用的部署运维问题。它利用类似K8s组件Component的概念,让开发者可以自己开发并且共享组件。通过组件来支持多语言的模板,而且Serverless组件的扩展能力还让Serverless框架具备生态优势。
|
||
|
||
目前,Serverless的确是前端参与的比较多,因此在Serverless应用框架中,除了Node.js外,其他语言的选择并不多。下面我就再介绍2款Node.js新的Serverless框架。
|
||
|
||
### Malagu \[5\]
|
||
|
||
Malagu是基于 TypeScript 的 Serverless First、可扩展和组件化的应用框架。为了提升Serverless的开发体验,只专注Node.js Serverless应用。
|
||
|
||
首先,Malagu的理念是支持前后端一体化,基于JSON RPC,前端像调用本地方法一样调用后端方法。前后端支持RPC和MVC两种通信形式,MVC可以满足传统纯后端Rest风格接口的开发。
|
||
|
||
其次,Malagu框架本身也是基于组件化实现的,将复杂的大型项目拆解成一个个Malagu组件,可以提高代码的复用能力、降低代码的维护难度。
|
||
|
||
最后,命令行工具插件化,默认提供初始化、运行、构建、部署能力,通过插件可以扩展命令行的能力。
|
||
|
||
我有幸与Malagu的开发者共事过,Malagu汲取了众家所长,我觉得这是一个值得关注的Serverless框架。而且目前Malagu已经有很多合作伙伴,他们正在积极使用和推广Malagu的解决方案。
|
||
|
||
### Midway FaaS \[6\]
|
||
|
||
接着是我今天想给你介绍的重点,就是:Midway Faas和它的工具链"f"。Midway FaaS 是用于构建 Node.js 云函数的 Serverless 框架,可以帮助你在云原生时代大幅降低维护成本,更专注于产品研发。
|
||
|
||
Midway FaaS诞生于Node.js老牌框架Midway,我也有幸与Midway的开发者一起共事过。Midway FaaS 是阿里巴巴集团发起的开源项目,由一个专业的 Node.js 架构团队进行维护。目前已大规模应用于阿里集团各 BU 线上业务,稳定承载了数千万的流量。
|
||
|
||
Midway FaaS有这样一些特点,也可以说是特色。
|
||
|
||
* **跨云厂商:**一份代码可在多个云平台间快速部署,不用担心你的产品会被云厂商所绑定。
|
||
* **代码复用:**通过框架的依赖注入能力,让每一部分逻辑单元都天然可复用,可以快速方便地组合以生成复杂的应用。
|
||
* **传统迁移:**通过框架的运行时扩展能力,让Egg.js 、Koa、Express.js等传统应用无缝迁移至各云厂商的云函数。
|
||
|
||
我们的“待办任务”Web服务,也将采用这个方案进行重构。
|
||
|
||
首先,我们通过命令行全局安装工具链"f"。
|
||
|
||
```
|
||
npm install -g @midwayjs/faas-cli
|
||
|
||
```
|
||
|
||
然后,拉取我们最新的[lesson11代码分支](https://github.com/pusongyang/todolist-backend/tree/lesson11),注意这个分支跟之前的分支相比改动比较大。因此,我们需要重新安装NPM依赖包。
|
||
|
||
```
|
||
npm install
|
||
|
||
```
|
||
|
||
前端代码还是在public目录,后端代码在src目录,项目里面的代码逻辑也比较简单,你可以自己看一下。我们需要讲解的是比较核心的配置文件f.yml,这里有我放的f.yml的文件结构。
|
||
|
||
```
|
||
service: fc-qinyue-test
|
||
|
||
provider:
|
||
name: aliyun
|
||
runtime: nodejs10
|
||
|
||
functions:
|
||
index:
|
||
handler: index.handler
|
||
events:
|
||
- http:
|
||
path: /*
|
||
|
||
getUser:
|
||
handler: user.get
|
||
events:
|
||
- http:
|
||
path: /user/234534
|
||
method: get
|
||
|
||
package:
|
||
include:
|
||
- public/*
|
||
|
||
aggregation:
|
||
agg-demo-all:
|
||
deployOrigin: false
|
||
functions:
|
||
- index
|
||
- getUser
|
||
|
||
custom:
|
||
customDomain:
|
||
domainName: lesson11-ali.jike-serverless.online
|
||
|
||
|
||
```
|
||
|
||
这里我们主要关注的是Provider,目前Midway FaaS支持阿里云和腾讯云,后续还会陆续增加其他云服务商。我们切换云服务商只需要修改Provider就可以了。其次,你也可以看到Functions部分,我们定义了所有的入口函数和路径path的映射关系。最后我们在部署环节,自己指定了域名。我们在配置域名解析时,根据云服务商提供的方式,通常都是修改域名的CNAME,指向云服务提供的FaaS地址就可以了。
|
||
|
||
Midway FaaS的强大之处就在于我们可以借助它提供的工具链"f",根据我们的f.yml文件配置内容,从而直接在本地模拟云上事件触发,调试我们的应用。
|
||
|
||
这里你只需要执行:
|
||
|
||
```
|
||
f invoke -p
|
||
|
||
```
|
||
|
||
我们就可以通过浏览器访问:[http://127.0.0.1:3000](http://127.0.0.1:3000) 调试我们的FaaS函数代码了。并且因为执行就在我们本地,所以调试时,我们可以借助现代IDE提供的Node.js debug能力逐行调试。而我们部署时也只需要一行代码:
|
||
|
||
```
|
||
f deploy
|
||
|
||
```
|
||
|
||
然后Midway FaaS就会根据我们的f.yml文件配置内容,帮我们部署到云上。
|
||
|
||
下面这2个URL地址,就是我用Midway FaaS分别部署在阿里云和腾讯云上的“待办任务”Web服务。
|
||
|
||
阿里云“待办任务”Web服务:[http://lesson11-ali.jike-serverless.online/](http://lesson11-ali.jike-serverless.online/)
|
||
|
||
腾讯云“待办任务”Web服务:[http://lesson11-tx.jike-serverless.online/](http://lesson11-tx.jike-serverless.online/)
|
||
|
||
这里我需要提醒你一下,这2个云服务都是以阿里云的OTS服务作为数据库存储。这也是FaaS服务编排的强大之处,现在有些云服务商提供的BaaS服务是支持其他云服务商通过ak/sk访问的。另外如下图所示,如果我们采用ak/sk编排云服务商的HTTP API服务,那么利用FaaS就可以实现混合云编排服务了。
|
||
|
||
![](https://static001.geekbang.org/resource/image/62/37/623069c983b6359bd5418ee1f35cc337.jpg)
|
||
|
||
如果你留意过GitHub,你会发现Midway FaaS和Malagu都是非常新的GitHub仓库。Serverless作为一门新兴技术,还有非常大的想象空间。
|
||
|
||
另外阿里云也推出了自己的云开发平台,而且将Serverless应用的生态集成了进去。目前Midway FaaS和Malagu也都在其中作为应用创建模板供你使用。
|
||
|
||
### 阿里云开发平台 \[7\]
|
||
|
||
阿里云开发平台就是由咱们专栏特别放送中的被采访者,杜欢(笔名风驰)负责的。
|
||
|
||
他的核心理念呢,就是将大厂成熟的Serverless应用场景抽象成解决方案,并且透出到云开发平台上来,为各个中小企业和个人开发者赋能。
|
||
|
||
正如下图所示,云开发平台是将大厂的行业应用场景沉淀成了解决方案,解析生成Serverless架构,这样我们就可以把云开发平台上实例化的“解决方案”快速应用到我们的Serverless应用中来。基于成熟Serverless的应用,“反序列化”快速沉淀为解决方案,这也是云服务平台会收录Midway FaaS和Malagu的原因。
|
||
|
||
而且我相信以后还会有更多的Serverless应用解决方案被收录到云开发平台中的。另外阿里云开发平台并不限制开发语言,但截止到咱们这节课的发布时间,阿里云开发平台的模板仅支持Node.js和Java的Serverless应用,其它语言还需要等成功案例沉淀。
|
||
|
||
![](https://static001.geekbang.org/resource/image/bd/06/bd7cfa2c4711ad7c0533d5a198323306.jpg)
|
||
|
||
## 总结
|
||
|
||
这节课我向你介绍了如何打破FaaS的Vendor-lock,并且介绍了我经验中FaaS的最佳使用场景:事件响应和Serverless应用。事件响应无疑就是FaaS的最佳使用场景;而Serverless应用则需要我们在云服务商提供的FaaS服务上,利用我们专栏前面学习到的知识和原理,挑战将完整的应用完全Serverless化。
|
||
|
||
为了解决FaaS的痛点和云服务商锁定,我向你介绍了3个框架和一个平台。
|
||
|
||
* 目前由腾讯云主导的Serverless Framework,它支持多语言,具备组件扩展性。目前仅在英文版官网可以看到其支持的云服务商Provider文档。
|
||
* 由阿里云FC团队主导的Malagu解决方案,目前仅支持Node.js,同样具备扩展性。目前正在积极的和很多开发团队合作共建Serverless应用生态。
|
||
* 由阿里巴巴Node.js框架Midway团队主导的Midway FaaS解决方案,它仅支持Node.js,扩展性由Midway团队官方保障。Midway团队的社区响应迅速,很多GitHub上的issue会在第一时间响应。
|
||
* 由阿里云主导的阿里云开发平台,它支持多语言,具备模板扩展性,扩展性由官方提供的模板保障。目前收录了Serverless生态比较成熟的方案,可以快速部署到阿里云FC上。虽然开发平台有一定的云服务商锁定嫌疑,但其采用的模板却可以支持解除云服务商锁定,例如Midway FaaS。
|
||
|
||
作为本专栏的最后一课,我还想再啰嗦一句。Serverless确实是一门新兴技术,其未来无限可能,接下来该由你探索了!
|
||
|
||
> 想要我的财宝吗?想要的话就给你,去找出来吧,这世上所有的一切都放在那里。
|
||
> 世界吗?没错!去追求自由。
|
||
> 去超越吧!在信念的旗帜的带领下。
|
||
>
|
||
> —— 海贼王 罗杰
|
||
|
||
## 作业
|
||
|
||
Serverless技术实践还是很重要的,最后一节课的作业我们就继续实操。请你将这节课“待办任务”Web服务的Midway FaaS版本,在本地调试运行起来,并且通过 `f deploy` 把它部署到阿里云或者腾讯云上。
|
||
|
||
期待你的成果,有问题欢迎随时留言与我交流。如果今天的内容让你有所收获,也欢迎你把文章分享给更多的朋友。
|
||
|
||
## 参考资料
|
||
|
||
\[1\] [https://help.aliyun.com/document\_detail/74707.html](https://help.aliyun.com/document_detail/74707.html?)
|
||
|
||
\[2\] [https://cloud.tencent.com/document/product/583/31927](https://cloud.tencent.com/document/product/583/31927)
|
||
|
||
\[3\] [https://help.aliyun.com/document\_detail/140283.html](https://help.aliyun.com/document_detail/140283.html?)
|
||
|
||
\[4\] [https://www.serverless.com/cn/framework/docs/getting-started/](https://www.serverless.com/cn/framework/docs/getting-started/)
|
||
|
||
\[5\] [malagu框架项目地址](https://github.com/alibaba/malagu);[malagu框架详细文档](https://www.yuque.com/cellbang/malagu)
|
||
|
||
\[6\] [https://github.com/midwayjs/midway-faas](https://github.com/midwayjs/midway-faas)
|
||
|
||
\[7\] [https://workbench.aliyun.com/](https://workbench.aliyun.com/)
|
||
|