一个新技术的出现不是无中生有,从石头中凭空蹦出来的,而是在原有基础上的继承和发展。Serverless
也不例外,我们回顾下 IT 基础设施的发展,就会发现 Serverless
自然就会浮现出来。
局域网时代
上世纪90年代,如果你是一家IT部门的负责人,公司需要建立一个信息管理系统,这时候的系统都是局域网的,即C/S
模式,业务逻辑主要在客户端软件中,需要被安装到各个电脑上去,然后访问同一个数据库。
在部署这个系统之前,你需要做很多的工作:
- 搭建局域网,购买交换机,路由器
- 买服务器,安装操作系统
- 安装数据库软件,例如
mysql
然后再把那些用 C++ 等语言写的客户端安装到电脑上,整个系统跑起来了。
C/S 模式的很大弊端就是客户端更新特别麻烦。
Web 兴起后,你们公司的应用也与时俱进,从 C/S 模式变成了 B/S 模式,用户主要使用浏览器来访问应用,业务逻辑在服务器端运行。
不过,你还是需要买服务器等一系列的软硬件。
总之,这样一套系统,非常麻烦。
虚拟化
但是,如果你的网站没人访问了,这一套复杂的系统,这些昂贵的服务器和软件产品就会变成摆设,你想卖都很难卖掉,这是巨大的浪费。
一个想法就会自然而然浮现出来:为什么要用物理服务器?
谁要是能提供虚拟机给我就好了,用完了就可以”扔掉”!
于是那些有实力的大厂就这么做了,把这些物理服务器的计算能力,存储能力统一管理,统一调配,对外提供的就是虚拟机。
它们把这种方式叫做云计算,你使用了云计算以后,有很多好处。
首先,物理服务器不用买了,申请虚拟机就可以了,什么样的CPU, 多少内存,多大的硬盘,对应的价格也不同。
其次,操作系统会按照你的要求自动给你安装好。
最后,网络自然不用操心, 要多大带宽直接买就行。
这些虚拟机可以包月,包年计费。
由云计算开始,就诞生了SaaS
、BaaS
、PaaS
和IaaS
,为了更好地理解,下面将以一个场景作为例子来讲解释它们之间的区别。
什么是SaaS
、BaaS
、PaaS
和 IaaS
比如说,你有一家制造衣服的工厂,你准备把工厂里面的衣服通过网上渠道卖出去,这是这件事情的出发点。
你从网上了解到,弄一个电商系统就可以了,这样就可以把衣服放到网上去卖,顾客可以在你的电商系统上面买衣服。
再接下去,你继续了解到,要找一个产品经理设计一个电商系统,所以这时候你找了一个产品经理。
之后,产品经理把电商系统设计好了,他告诉你,需要程序员把设计好的东西开发出来,他还告诉你,分别至少需要一个前端程序员和一个后端程序员。
你问为什么要这么多人,产品经理告诉你,后端程序员写业务逻辑,前端程序员写页面展示,他们通过接口传输数据,这叫前后端分离。
然后,你找了程序员,东西也开发好了,程序员告诉你,这东西还不能直接用,要放到服务器上面。
于是你又买了服务器,程序员又告诉你,他不会部署服务器,要找专门的运维,才能部署服务器。这时,你心里已经有一万头草泥马在狂奔。
没办法,你又招了运维人员来,服务器也部署好了,这时候程序员告诉你,还是不能用,还要搭软件的环境,因为是他是用 PHP 语言写的,还要搭一个 PHP 的环境才能运行程序。
最后,环境搭好了,程序终于跑起来了,你也终于累瘫了。
为了弄一个电商系统,你总共招了1个产品经理,1个前端工程师,1个后端工程师,1个运维工程师,还买了一台服务器。
SaaS
这个时候,你意识到,自己只是想要建立网上渠道来卖衣服,只要弄个别人已经开发好的电商系统就够了,完全没必要自己去开发一套新的,能用就好,管他谁开发的呢。
这就是SaaS
(Software as a Service,软件即服务)的概念,直接购买第三方服务商已经开发好的软件来使用,从而免去了自己去组建一个团队来开发的麻烦。
我们可以算一笔账,来计算使用 SaaS
节省下来的费用,以上面的这个例子,搭建这样一个团队,按最低配置算,需要至少4人,开发周期至少2月,人力成本算平均1.5W/人·月,那就至少需要12W,这还不包括后期维护的成本。
但是如果使用SaaS
,每年只需要付几百到几千的费用,就能达到更好的效果,两者相比,差距很明显。
实际上,第三方服务商开发这样一套软件,也需要这样多的成本,为什么他就能挣钱呢?
原因在于,他开发出来的软件,不是只卖给一个人用的,可能卖给了成千上万的人使用。可以按照一个用户一年1000元计算,只要能够卖给120个用户以上,就稳赚不赔了。
这就是 SaaS
的商业模式。
需要注意的是,SaaS
卖的不仅是软件,而是对软件开箱即用的服务,软件是部署在SaaS服务商那里的,不需要客户自行部署软件运营的环境和服务器等。
像有赞、十二赞、微盟等,就是典型的SaaS
服务商,注册账号后就可以直接使用一套完整的电商系统,无需自己进行任何开发工作。
还有你经常使用的百度云网盘等产品,都是属于SaaS
。
你发现,使用SaaS
,上面原本要招的4个人你一个都不用招了,服务器也不用买了,省了一大笔开支。
BaaS
用了一段时间的SaaS
后,你发现,SaaS
好是好,但是缺点也有,那就是东西都被定好了,自己没得改。
自己想在某个页面加一个亮闪闪的东西上去,结果被告知没得改,SaaS
服务商答复说,那么多用户在用,不能为了你一个人而改。
你了解到,自己要改的东西,只需要前端改了就可以了,后端部分完全不需要改。这时候你动脑筋,可以招了前端工程师,前端页面自己做,后端部分还是用服务商的。
这就是BaaS
(Backend as a Service,后端即服务),自己只需要开发前端部分,剩下的所有都交给了服务商。
举个例子,我们常用的阿里云的云数据库
,对象存储
,都属于 BaaS
。
事实上不管是数据库还是静态资源存储,我们完全可以自己在服务器上搭建。但是因为有了像 云数据库 这类的产品,我们可以绕过服务器,直接使用一个云端的数据库。
BaaS
模式跟SaaS
模式比较,多出了需要自己开发前端。这就至少需要1个前端工程师了,但是这种方案跟最初的方案比,还是能够省下1个产品经理,1个后端工程师,1个运维和1台服务器。
PaaS
随着业务规模的变大,你发现,即便是使用BaaS
,也有很多不能满足的地方,因为后端被完全限制了,后端部分决定了你的系统能够做什么事情,前端只是做一个展现以及作为做这些事情的一个渠道,后端做不到的事情,前端无论怎么改都做不到。
于是你又招了1个后端工程师来进行开发,考虑到需要自行设计业务逻辑,同时也招了1个产品经理,自行设计开发一个电商系统。但是软件运行的环节还是使用服务商的。
这就是PaaS
(Platform as a Service,平台即服务),自己只需关心软件本身,至于软件运行的环境由服务商提供。
我们常说的云引擎、云容器等就是PaaS
。
例如你的程序是用PHP写的,你就可以选一个已经搭建好PHP运行环境的平台,如果是用Python写的,就选一个搭建好Python环境的,以此类推。
使用PaaS
跟最初的方案比,能够省下1个运维和1台服务器。
IaaS
使用了一段时间的PaaS,你发现缺点是,可能有的环境服务商没提供或者支持不好,于是你决定环境还是自己进行搭配,服务商只需要提供能够运行的服务器就可以了。
这就是IaaS
(Infrastructure as a Service,基础设施即服务),由服务商提供服务器,一般为云主机,客户自行搭建环境部署软件。
例如阿里云、腾讯云等就是典型的IaaS
服务商。
从上面的过程中可以看出,这些服务跟最初的方案比较,只是将一部分工作交给了第三方服务商去完成,也就是将一部分不重要的工作交给更为专业的第三方服务商,我们可以做出一个以下的对比图(打勾表示需要自己做的部分,打叉表示交给第三方服务商做的部分):
理想模式
不管你是采用SaaS
、BaaS
、PaaS
和IaaS
的哪一种模式,你都会买一些云计算产品,这些产品可以按月、按年付费。
但是,如果没有人访问你的应用,没有流量,你也得掏钱。
想必你的脑海中已经浮现出了解决方案:能不能按使用情况来收费?
如果有人访问,把应用部署到某个服务器上,执行这次请求,返回给用户,然后卸载这个应用。如果没有人访问你的应用,就不要部署它,这样只会占用一点点存储空间,不用使用CPU和内存;
和之前的方式相比,最大的特色是即用即走,不会在服务器/虚拟机中常驻。
但是这么做可能吗?
不行,应用的粒度太大,一个应用几十、上百模块,每个请求来了就部署整个应用,只执行那么一点儿代码,然后就卸载掉。
如果每个请求这么来回地部署和卸载,你是疯了吗,兄弟?
那微服务呢?粒度还是太大。
如果是微服务中的一个API,或者说就是一个”函数”呢?这个粒度应该差不多了。
这里说的函数到底是什么?
需要看具体的业务来划分,比如搜索产品,图像转换,它需要足够小,足够单一,能快速启动,运行,卸载。
一个”函数”只做一件事情,并且不保持状态。
这样一来它可以轻松地被扩展到任意多的服务器、虚拟机、docker
容器中去。请求多了就扩容,请求少了,就收缩,请求没了,就卸载,实在是太爽了。
这种方式现在称为Serverless
,并不是说没有服务器,而是说服务器对用户来说是透明的,应用的装载、启动、卸载,路由需要平台来搞定。
Serverless
的开发模式和运行模式类似这样:
- 程序员编写完成业务的函数代码;
- 上传到支持
Serverless
的平台,设定触发的规则; - 请求到来,
Serverless
平台根据触发规则加载函数,创建函数实例,运行; - 如果请求比较多,会进行实例的扩展,如果请求较少,就进行实例的收缩;
- 如果无人访问,卸载函数实例;
这里的函数称为云函数,或者称为 FaaS
(Function as a Server,函数即服务)。
按需装载,自动伸缩,不用你苦逼地去规划硬件,安装软件,还可以按照使用情况付费,这么好的东西,我们是不是马上投入Serverless
的怀抱?
为了达到上面的目标,你必须得牺牲一个很重要的东西:状态。
函数没有状态的,每次启动都可能会被部署到一个全新的”服务器”中,这就有两个问题:
- 用户的会话状态肯定是无法保持的;
- 函数无法做本地的持久化,没法访问本地硬盘的任何东西(服务器看不见了,怎么能看见硬盘呢?)。
所有想持久化的东西必须得保存到外部的系统或者存储中,例如 Redis,MySQL等。 很明显,这些东西也应该以”服务”的方式来呈现,即 Backend as a Service (BaaS)。
因此,Faas
和 BaaS
一起,可以称为 Serverless
产品。通过组合这些产品,开发者可以构建自身的业务 Serveless
架构。
serverless带给前端工程师什么?
Node.js 出现以后,以 Express 为代表的超轻量框架,因为相对简单又是 JS 语言,因此在前端圈掀起了一股 “全栈开发” 的热潮。有些小应用就是适合用 Node.js 写,速度快效率高用过都说好。
但是在一些大型生产应用上,前端就够不着了。我相信有很多优秀的前端工程师,用 Node.js 接个数据库,写一些业务逻辑的接口,完全没有问题。
但是,如果让你搞一些后端的高级玩法,做一些服务器运维的事情,你可能就整不来了。
这部分人我们可以称作是”全栈工程师”。所谓的全栈要么是一端深一端浅,要么是两端都浅(当然超级大牛忽略),所以开发小应用可以,大型生产应用就没全栈什么事了。
而现在随着 Serverless
云函数横空出世,屏蔽了服务器和后端应用的部分,使后端开发门槛大幅降低。前端仿佛又看到了希望,我们可以不用写接口,只需要编写云函数,也能实现生产应用的后端开发。
以前有高墙,前端卷不进来。现在墙拆了,你说我们进不进?
典型的例子是微信小程序云开发。前端在微信开发者工具上编写云函数,一键上传与部署。然后在小程序代码中获取并调用这个远程函数,相当于整个流程前后端都是自己实现自己调试,直到应用开发完成。
使用 Serverless
云函数不光能轻松实现后端的业务功能,而且监控,并发,负载这些由云厂商统一实现,一应俱全。因此在稳定性可靠性上也非常有保障。
另外,函数计算是按照调用次数,访问流量计费的,比云服务器要更节约资源更省钱。
未来会有越来越多的 web 应用接入到 serverless,因此更多的前端开发工程师会独立开发一个完整的项目。
以前,前端要实现一些自己的想法,必须要有后端的接口配合,而且还需要后端或运维帮忙在线上部署。但是现在不用了,我们有机会自己搞定这一切。
这对前端来说是巨大的机会,一个可以将自己的想法变成一个应用的好机会。
原文链接:https://juejin.cn/post/7241452728747425853 作者:小p