今天读了一篇加州大学伯克利分校发表的论文 Cloud Programming Simplified: A Berkeley View on Serverless Computing,文章对serverless的形成、现状以及未来进行了全面的梳理和总结。一边阅读我也记录了一些笔记,方便自己回顾。
早在2009年,伯克利曾针对当时兴起的云计算做过评论,并提出了以下6个潜在的优点:
2009年至今的10年里,云计算领域已经有了很大的发展,上述的诸多优势已经成为现实,但最后两点目前的实现仍然不够优秀,使得大部分的云服务使用者不得不承受复杂的运维成本和较低的硬件使用率。
采用底层硬件虚拟的方案意味着所有的运维操作都要由开发人员自己来解决,并且为了保证运行在云上的服务具有足够的稳定性,需要解决很多的问题,比如下面列出的这些:
注意到这些问题,亚马逊在2015年推出了AWS Lambda服务,提出了Cloud Function的概念,并引起了业界对于Serverless的广泛关注(Serverless这一词并不是说真的没有服务器了,只是开发人员不需要再关注服务器了,你的代码仍然是运行在真实存在的服务器上的)。
Cloud Function最终被平台打包成FaaS (Function as a Service, 函数即服务) 的形式,它代表着Serverless的核心理念。当然,云平台也提供以BaaS (Backend as a Service) 形式存在的Serverless服务框架。简单的说,Serverless Computing = FaaS + BaaS
。
serverless相比serverful,有以下3个显著的改变:
接下来文章解释serverlss和一些相似的产品究竟有何不同。
接着文章探寻为何serverless计算能够如此吸引云提供商、用户和研究者们。
为了探究是什么阻碍了serverless计算应用于更加广泛的场景,作者选择了几个例子,
分别是:
尝试把他们改造成serverless的形式来发现阻碍改造的难点。
接下来作者给出了困扰serverless计算应用于更广泛的硬件和软件范围的五大挑战:抽象、系统、网络、安全以及架构。
谬误是指人们对serverless的一些错误看法
陷阱则是指那些serverless潜在的坑和隐患
serverless现在已经取得了一定的成功,但也仍然存在一定的挑战,如果克服了这些挑战,它将能够在更广的领域里获得更大的成功。此外,serverless计算未来还将面临安全和成本问题。最后作者对serverless计算未来的表现作出了一些预测:
以上就是对这篇论文内容的概括总结,不过有很多细节,特别是第三部分的几个应用我并不了解他们的特性,以及第四部分谈到各方面挑战包括了很多我不熟悉的名词所以还没有完全读懂,只是有个模糊的概念。但至少通过阅读这篇文章以及其他的一些资料,我大致了解了serverless的概念和优点,遇到的阻碍和未来发展的可能。目前我们常用的云服务器免去了买物理服务器的麻烦,只需要去申请虚拟机就可以部署上线项目,一般是包月包年使用,但是如果没有访问我们的应用我们也依然要付钱,而且去维护项目也是需要花费挺多精力的。所以后来就有了serverless的方式,并不是没有服务器,而是说应用的装载、启动、卸载、路由是由平台来做的。我们只需要编写业务代码,然后上传到serverless的平台设定好触发规则,请求到来的时候就会创建函数实例,根据请求的多少来扩展和收缩实例,如果无人访问就会卸载函数实例。不过这种方式会牺牲“状态”,因为每次启动可能会被部署到新的服务器上,用户的会话状态无法保持,所以说serverless更适合无状态的应用。那些想持久化的东西也应该保存到外部的系统中,以“服务”的方式呈现(BaaS)。文章最后预测了这种serverless计算的方式在未来会成为趋势,大面积替代原有的serverful计算方式:)
而刚好在前端领域,serverless也是当下炙手可热的技术,所以我也浏览了一些相关的文章。通过Node来开发云函数,可以使前端开发者向全栈转型,提升整体开发效率。比如在这篇文章千万级流量业务的Serverless实践,看FaaS给前端带来的变化中讲述了手淘中的哇哦视频是如何转型成serverless的(它是淘系首个Node Faas技术的项目),获得了FaaS零运维的优势,从而达到开发者的提效。
当然,论文中所说serverless在硬件和软件上还存在着各种挑战,如果可以克服的话,serverless会在更广阔的领域取得更大的成功。
看完了文章,我们也可以来简单来实验一下,这样也会对文章内容有更好地了解。
阿里云和腾讯云都有提供函数计算的服务,也有文档可以参考。
腾讯云Serverless Framework快速入门
阿里云函数计算快速入门
我们就按照腾讯云的文档,只需要几行代码,开始部署一个Serverless 服务
一、安装 Node.js 和 NPM
我这边已经安装好了,查看一下版本
C:\Users\63406>node -v
v12.16.1
C:\Users\63406>npm -v
6.13.4
二、安装 Serverless Framework CLI
这里我改用了淘宝镜像会比较快
C:\Users\63406>npm install -g cnpm --registry=https://registry.npm.taobao.org
C:\Users\63406\AppData\Roaming\npm\cnpm -> C:\Users\63406\AppData\Roaming\npm\node_modules\cnpm\bin\cnpm
+ [email protected]
added 686 packages from 950 contributors in 141.63s
C:\Users\63406>cnpm install -g serverless
安装完毕后查看下版本
C:\Users\63406>serverless -v
Framework Core: 1.64.1
Plugin: 3.4.1
SDK: 2.3.0
Components Core: 1.1.2
Components CLI: 1.4.0
三、通过模板创建服务
D:\wanshan\learn>cd serverless
# 创建一个serverless服务
D:\wanshan\learn\serverless>serverless create --template tencent-nodejs --path my-service
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "D:\wanshan\learn\serverless\my-service"
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| \___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v1.64.1
-------'
Serverless: Successfully generated boilerplate for template: "tencent-nodejs"
D:\wanshan\learn\serverless>cd my-service
# 安装依赖
D:\wanshan\learn\serverless\my-service>npm install
√ Installed 1 packages
√ Linked 197 latest versions
√ Run 0 scripts
Recently updated (since 2020-02-19): 5 packages (detail see file D:\wanshan\learn\serverless\my-service\node_modules\.recently_updates.txt)
√ All packages installed (209 packages installed from npm registry, used 6s(network 6s), speed 1016.14kB/s, json 198(400.77kB), tarball 5.4MB)
此时my-service下就有了serverless.yml文件
我们在里面配置触发器
service: my-service # service name
provider: # provider information
name: tencent
runtime: Nodejs8.9
credentials: ~/credentials #如不使用二维码一键登录,密钥字段需要和 credentials 文件路径一致
plugins:
- serverless-tencent-scf
functions:
hello_world: # 函数名称
handler: index.main_handler
runtime: Nodejs8.9
events:
- apigw:
name: hello_world_apigw
parameters:
stageName: release
serviceId:
httpMethod: ANY
四、部署服务
D:\wanshan\learn\serverless\my-service>serverless deploy
此时会弹出二维码,用微信来扫码登录或注册腾讯云。
看到这个就说明成功了
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Uploading service package to cos[sls-cloudfunction-ap-guangzhou]. my-service-dev-5CeckR-2020-02-26-19-23-23.zip
Serverless: Uploaded package successful D:\wanshan\learn\serverless\my-service\.serverless\my-service.zip
Serverless: Creating function my-service-dev-hello_world
Serverless: Created function my-service-dev-hello_world
Serverless: Setting tags for function my-service-dev-hello_world
Serverless: Creating trigger for function my-service-dev-hello_world
Serverless: Created apigw trigger hello_world_apigw for function my-service-dev-hello_world success. service id service-0147bmx4 url https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world
Serverless: Deployed function my-service-dev-hello_world successful
Serverless: Service Information
service: my-service
stage: dev
region: ap-guangzhou
stack: my-service-dev
resources: 1
functions: hello_world: my-service-dev-hello_world
ANY - https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world
D:\wanshan\learn\serverless\my-service>curl -X POST https://service-0147bmx4-1301390953.gz.apigw.tencentcs.com/release/my-service-dev-hello_world
"Hello World"
六、云端调用
D:\wanshan\learn\serverless\my-service>serverless invoke -f hello_world
Serverless:
"Hello World"
----------
Log:
START RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
Event RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
2020-02-26T11:33:30.099Z cb9b23f4-588b-11ea-acc2-525400c43e35 {}
END RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35
Report RequestId: cb9b23f4-588b-11ea-acc2-525400c43e35 Duration:1ms Memory:128MB MemUsage:61.7578MB
七、 移除服务
如果不再需要此服务,可以通过如下命令一键移除服务,该命令会清理相应函数和触发器资源。
serverless remove