前言
自2006年8月9日,Google首席执行官埃里克·施密特(Eric Schmidt)在搜索引擎大会(SESSanJose2006)首次提出“云计算”(Cloud Computing)的概念之后,云计算的发展可以用日新月异这个词来形容。
在短短十几年的发展过程中,云计算也从IaaS到PaaS,再到SaaS,逐渐的将去服务器化的趋势表现的愈发的明显。同时,全球各大IT企业,也都紧罗密布的部署自己的“云事业”。但是,这几年,大家不难发现,包括AWS、Google Cloud、Azure、阿里云、腾讯云、华为云等在内的云厂商,在疯狂的提出一个新的概念:Serverless!是的,正如上图所示,SaaS的下一个阶段,可能就是BaaS+FaaS+Others,即Serverless!
什么是Serverless
Serverless可以说是一种架构,一种云计算发展的产物,至于具体说什么是Serverless,可能没有谁能给他一个明确的概念,如果非要说要这样一个可以稍微受众一些的概念,那或许可以参考Martin Fowler在《Serverless Architectures》中对Serverless这样定义:Serverless was first used to describe applications that significantly or fully incorporate third-party, cloud-hosted applications and services, to manage server-side logic and state. These are typically “rich client” applications—think single-page web apps, or mobile apps—that use the vast ecosystem of cloud-accessible databases (e.g., Parse, Firebase), authentication services(e.g., Auth0, AWS Cognito), and so on. These types of services have been previously described as “(Mobile) Backend as a service", and I use "BaaS" as shorthand in the rest of this article. Serverless can also mean applications where server-side logic is still written by the application developer, but, unlike traditional architectures, it’s run in stateless compute containers that are event-triggered, ephemeral (may only last for one invocation), and fully managed by a third party. One way to think of this is “Functions as a Service” or "FaaS".(Note: The original source for this name—a tweet by @marak—isno longer publicly available.) AWS Lambda is one of the most popular implementations of a Functions-as-a-Service platform at present, but there are many others, too.
当然这个描述貌似很长,但是大家可以简单的粗暴的把他认为是Serverless = BaaS + FaaS,如果用一张图来表示他的描述,那就是:
说到这里,可能各位看官已经在自己的内心知道了什么是Serverless,或者说有了自己想象中的Serverless的样子了,但是可能还会有一些疑问:这个叫Serverless的东西,他的具体表现是什么?他和IaaS,PaaS等又有什么区别?
首先说,他的表现,以用户通过访问一个网站或者说使用一个Web服务为例:
在这个这里面,服务器中可能涉及路由规则,鉴权逻辑以及其他各类复杂的业务代码,同时,开发团队要付出很大的精力在这个服务器的运维上面,包括客户量突然增多时是否需要扩容服务器;服务器上的脚本,业务代码等是否还在健康运行;是否有黑客在不断地对服务器发起攻击;当我们把这个思路切换到Serverless的逻辑之后,变成了这样:
可以认为,当客户端和数据库未发生变的前提下,服务器变化巨大,之前需要开发团队维护的路由模块以及鉴权模块都将接入服务商提供的API网关系统以及鉴权系统,开发团队无须再维护这两部分的业务代码,只需要持续维护相关规则即可。同时业务代码也被拆分成了函数粒度,不同函数表示不同的功能。同时,在这个结构下,我们已经看不到服务器的存在,是因为Serverless的目的是让使用者只关注自己的业务逻辑即可,所以一部分安全问题,资源调度问题(例如用户量暴增、如何实现自动扩容等)全都交给云厂商负责,并且相对于传统项目而言,传统项目无论是否有用户访问,服务都在运行中,都是有成本支出,而Serverless而言,只有在用去发起请求时,函数才会被激活并且执行,进而节约了成本。
那么再说第二个问题,对比IaaS,PaaS,在Serverless架构下,不同人员的分工发生了哪些变化呢?
使用Serverless架构,用户不需要再自己维护服务器,也不需要自己操心服务器的各种性能指标和资源利用率,而是可以让用户付出更多的时间和精力去关心和关注应用程序本身的状态和逻辑。同时Serverless应用本身的部署十分容易,我们只要上传基本的代码,例如Python程序只需要上传其逻辑与依赖包,C/C++、Go等语言只需上传其二进制文件,Java只需要上传其Jar包等即可,同时不需使用Puppet、Chef、Ansible或Docker来进行配置管理,大大降低了运维成本。对于运维来说,Serverless架构也不再需要监控底层的数据,例如不再需要监控磁盘使用量、CPU使用率等,可以更加专注的将监控目光放到监控应用程序本身的度量。同时在Serverless架构上,运维人员的工作角色会有所转变,部署将变得更加自动化,监控将更加面向应用程序本身。
总而言之,Serverless是在传统容器技术和服务网格上发展起来,他更多指的是后端服务与函数服务的结合,对于开发者而言,而是让开发者将更多的经理关注在函数服务商,更侧重让使用者只关注自己的业务逻辑即可。它是云计算发展到一定阶段的必然产物,云计算作为普惠科技,发展到最后一定是绿色科技(最大程度利用资源,减少空闲资源浪费),大众科技(成本低,包括学习成本及使用成本)的产品,而Serverless将很好的诠释这些!Serverless架构被称为是“真正实现了当初云计算的目标”,这种说法虽然有些夸张,但是也从另一方面表现出了大家对Serverless架构的期盼和信心,自2012年被提出至今,Serverless架构也是经历了7年时间,正在逐渐的走向成熟。
什么是Serverless
或许看到这里,已经有的小伙伴彻底蒙了,刚才那一部分不叫作什么是Serverless么,怎么这里又出现了一个什么是Serverless?请各位看官平静一下,听我说:
在Serverless技术开始发展没多久,有这样一群人,注册了一个叫Serverless的公司,并且买了一个域名:serverless.com,同时他们又做了一个工具或者说是软件,也起名叫做Serverless!
就相当于我们说:近年,中国电信行业发展迅速。这里面的中国电信行业实际上说的是中国的电信行业,而不是说中国电信这个运营商。同样的道理,Serverless这个开发者工具和Serverless架构其实也是两个东西,我在这里只能由衷的敬佩:这个公司很厉害,蹭热点蹭到了这个程度!
蹭热点都蹭到了这种程度,那一定不能浪费这个名字啊,所以可想而知,Serverless这个公司推出的产品,自然而然就是和热点技术Serverless架构紧密相关!
在各个云厂商都有自己的函数计算的业务的时候,Serverless团队做了一个类似多云管理平台的工具,可以认为是多Serverless管理的工具。通过这个工具,你可以快速直接使用AWS的Lambda,Azure的Funtion以及腾讯云SCF等众多云厂商的函数计算相关服务,大体支持的功能如下(部分工业化的云厂商):
通过这个表,大家可以看到,其实这个公司开发的这个工具,或者说开发的这个软件实际上就是一个开发者工具, 帮助我们可以快速使用多个云厂商的函数,帮大家打包、部署、回滚......当然,各个厂商也都有自己的类似的工具,例如AWS的SAM,腾讯云的SCFCLI等。
貌似这个工具除了多云部署也没啥了......
大错特错,这个公司推出了这个工具没多久,便开始尝试更加“狂拽酷炫“的操作,那就是不仅仅关注Serverless中的FaaS,也要关注Serverless中的BaaS,即将API网关,对象存储,CDN,数据库......众多的后端服务和函数计算有机集合,让用户可以一站式开发,一站式部署,一站式更新,一站式维护!
所以,这个CLI被一分为二!上面那些内容,更多的是一种以插件(Plugin)形式提供的各个云厂商的函数计算功能,接下来,他们开发了一个有趣的功能,叫作Components!什么是Components呢?可以认为是很多的Component的组合,就是很多组件的组合,例如我们要部署一个网站,可能会有几个部分:静态资源部分、函数计算部分、API网关部分、CDN部分、域名解析部分等,那么这个Components就可以同时帮我们部署这些所有的资源,帮我们一键部署,自动关联(如果是刚才说的Plugin形式,则是我们可以部署函数计算部分的资源,然后手动去处理API网关、CDN、静态资源等相关内容)。除了这些之外,他还提供了若干的框架上Serverless,例如腾讯云的Components中有tencent-koa、tencent-express、tencent-flask......等众多主流框架的Component,用户可将自己已有的,或者使用这些框架开发的项目,直接一键部署到云端,这对于开发者来说,是多么方便的一件事情啊!
通过上表可能对Plugin和Component表述的还不是很清楚,那么我站在一个开发者角度,可以说是深度使用了这两个部分的用户,来说一下我对这两个内容的感受(以腾讯云的Plugin和Component为例):
- Plugin部署到线上的函数,会自动变更名字,例如我的函数是myFunction,我的服务和阶段是myService-Dev,那么函数部署到线上就是myService-Dev-myFunction,这样的函数名,很可能会让我的函数间调用等部分产生很多不可控因素。例如我现在的环境是Dev,我函数间调用就要写函数名是myService-Dev-myFunction,如果是我的环境是Test,此时就要写myService-Test-myFunction,我始终觉得,我更改环境应该只需要更改配置,而不是更深入的代码逻辑。所以我对Plugin的这个换名字问题很烦躁;
- Plugin也是有优势的,例如他有Invoke、Remove以及部署单个函数的功能,同时Plugin也有全局变量,我觉得这个更像一个开发者工具,我可以开发、部署、调用、查看一些信息、指标以及删除回滚等操作,都可以通过Plugin完成,这点很给力,我喜欢;
- Components可以看作是一个组件集,这里面包括了很多的Components,可以有基础的Components,例如cos、scf、apigateway等,也有一些拓展的Components,例如在cos上拓展出来的website,可以直接部署静态网站等,还有一些框架级的,例如Koa,Express,这些Components说实话,真的蛮方便的,腾讯官方也是有他们的最佳实践;
- Components除了刚才所说的支持的产品多,可以部署框架之外,对我来说,最大吸引力在于这个东西,部署到线上的函数名字就是我指定的名字,不会出现额外的东西,这个我非常看重;
- Components相对Plugin在功能上略显单薄,除了部署和删除,再没有其他,例如Plugin的Invoke,Rollback等等一切都没有,同时,我们如果有多个东西要部署,写到了一个Components的yaml上,那么我们每次部署都要部署所有的,如果我们认为,我们只修改了一个函数,并且不想重新部署其他函数从而注释掉其他函数,那么很抱歉告诉你,不行!他会看到你只有一个函数,并且帮你把你注释掉的函数在线上删除;
- Components更多的定义是组件,所以每个组件就是一个东西,所以在Components上面,是没有全局变量这一说法,这点我觉得很坑(不过我自己做了一个Component实现了全局变量,欢迎大家使用:https://github.com/anycodes/serverless-global )。
综上所述的几点,就是在除了官方文档的描述之外,我对Plugin和Components的对比,感情真的可谓是错综复杂,也很期待产品策略可以将二者合并,或者功能对齐,否则单用Plugin,功能上是很全面了,但是产品支持不全面,名字变化我真的不能忍(可能很多人都不能忍),单用Components,没有全局变量,没有更多功能,可谓是产品广度变了,便利增加了,但是功能太淡薄了,我对二者的感情,又恨又爱。
总结
我接触Serverless有一段时间了,无论是Serverless架构还是Serverless的这个开发者工具,我也不断的在社区中贡献一些Serverless相关的经验、分享,以及Serverless这个工具的相关组件和功能。经历长久的和用户的沟通交流,我发现很多用户对Serverless架构和Serverless的这个开发者工具很模糊很迷茫,好不容易弄懂了,又对这个工具提供的Plugin和Components感到模糊。所以一直都想写一篇文章,来描述一下什么是Serverless架构,什么是Serverless开发者工具,以及Serverless开发者工具中的Plugin和Components有什么区别。并不想说明什么事情,只是希望,我们在使用这些东西的时候,头脑是清楚了,知道我在做什么,我为什么这么做。而不是说,一脸懵逼,双眼迷离的按照Demo简单的走了一下流程。