一文讲透什么是Serverless

一个新技术的出现不是无中生有,从石头中凭空蹦出来的,而是在原有基础上的继承和发展。Serverless也不例外,我们回顾下 IT 基础设施的发展,就会发现 Serverless 自然就会浮现出来。

局域网时代

上世纪90年代,如果你是一家IT部门的负责人,公司需要建立一个信息管理系统,这时候的系统都是局域网的,即C/S模式,业务逻辑主要在客户端软件中,需要被安装到各个电脑上去,然后访问同一个数据库。

一文讲透什么是Serverless

在部署这个系统之前,你需要做很多的工作:

  • 搭建局域网,购买交换机,路由器
  • 买服务器,安装操作系统
  • 安装数据库软件,例如 mysql

然后再把那些用 C++ 等语言写的客户端安装到电脑上,整个系统跑起来了。

C/S 模式的很大弊端就是客户端更新特别麻烦。

Web 兴起后,你们公司的应用也与时俱进,从 C/S 模式变成了 B/S 模式,用户主要使用浏览器来访问应用,业务逻辑在服务器端运行

不过,你还是需要买服务器等一系列的软硬件。

总之,这样一套系统,非常麻烦。

虚拟化

但是,如果你的网站没人访问了,这一套复杂的系统,这些昂贵的服务器和软件产品就会变成摆设,你想卖都很难卖掉,这是巨大的浪费。

一个想法就会自然而然浮现出来:为什么要用物理服务器? 

谁要是能提供虚拟机给我就好了,用完了就可以”扔掉”!

于是那些有实力的大厂就这么做了,把这些物理服务器的计算能力,存储能力统一管理,统一调配,对外提供的就是虚拟机

它们把这种方式叫做云计算,你使用了云计算以后,有很多好处。

首先,物理服务器不用买了,申请虚拟机就可以了,什么样的CPU, 多少内存,多大的硬盘,对应的价格也不同。 

其次,操作系统会按照你的要求自动给你安装好。

最后,网络自然不用操心, 要多大带宽直接买就行。

这些虚拟机可以包月,包年计费。

由云计算开始,就诞生了SaaSBaaSPaaSIaaS,为了更好地理解,下面将以一个场景作为例子来讲解释它们之间的区别。

什么是SaaSBaaSPaaSIaaS

比如说,你有一家制造衣服的工厂,你准备把工厂里面的衣服通过网上渠道卖出去,这是这件事情的出发点。

你从网上了解到,弄一个电商系统就可以了,这样就可以把衣服放到网上去卖,顾客可以在你的电商系统上面买衣服。

再接下去,你继续了解到,要找一个产品经理设计一个电商系统,所以这时候你找了一个产品经理。

之后,产品经理把电商系统设计好了,他告诉你,需要程序员把设计好的东西开发出来,他还告诉你,分别至少需要一个前端程序员和一个后端程序员。

你问为什么要这么多人,产品经理告诉你,后端程序员写业务逻辑,前端程序员写页面展示,他们通过接口传输数据,这叫前后端分离

然后,你找了程序员,东西也开发好了,程序员告诉你,这东西还不能直接用,要放到服务器上面。

于是你又买了服务器,程序员又告诉你,他不会部署服务器,要找专门的运维,才能部署服务器。这时,你心里已经有一万头草泥马在狂奔。

没办法,你又招了运维人员来,服务器也部署好了,这时候程序员告诉你,还是不能用,还要搭软件的环境,因为是他是用 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服务商。

从上面的过程中可以看出,这些服务跟最初的方案比较,只是将一部分工作交给了第三方服务商去完成,也就是将一部分不重要的工作交给更为专业的第三方服务商,我们可以做出一个以下的对比图(打勾表示需要自己做的部分,打叉表示交给第三方服务商做的部分):

一文讲透什么是Serverless

理想模式

不管你是采用SaaSBaaSPaaSIaaS的哪一种模式,你都会买一些云计算产品,这些产品可以按月、按年付费。

但是,如果没有人访问你的应用,没有流量,你也得掏钱

想必你的脑海中已经浮现出了解决方案:能不能按使用情况来收费?

如果有人访问,把应用部署到某个服务器上,执行这次请求,返回给用户,然后卸载这个应用。如果没有人访问你的应用,就不要部署它,这样只会占用一点点存储空间,不用使用CPU和内存;

和之前的方式相比,最大的特色是即用即走,不会在服务器/虚拟机中常驻

但是这么做可能吗?

不行,应用的粒度太大,一个应用几十、上百模块,每个请求来了就部署整个应用,只执行那么一点儿代码,然后就卸载掉。

如果每个请求这么来回地部署和卸载,你是疯了吗,兄弟?

那微服务呢?粒度还是太大。

如果是微服务中的一个API,或者说就是一个”函数”呢?这个粒度应该差不多了。

这里说的函数到底是什么?

需要看具体的业务来划分,比如搜索产品,图像转换,它需要足够小,足够单一,能快速启动,运行,卸载。

一文讲透什么是Serverless

一个”函数”只做一件事情,并且不保持状态

这样一来它可以轻松地被扩展到任意多的服务器、虚拟机、docker容器中去。请求多了就扩容,请求少了,就收缩,请求没了,就卸载,实在是太爽了。

这种方式现在称为Serverless,并不是说没有服务器,而是说服务器对用户来说是透明的,应用的装载、启动、卸载,路由需要平台来搞定。

Serverless的开发模式和运行模式类似这样:

  1. 程序员编写完成业务的函数代码;
  2. 上传到支持Serverless的平台,设定触发的规则;
  3. 请求到来,Serverless平台根据触发规则加载函数,创建函数实例,运行;
  4. 如果请求比较多,会进行实例的扩展,如果请求较少,就进行实例的收缩;
  5. 如果无人访问,卸载函数实例;

这里的函数称为云函数,或者称为 FaaS (Function as a Server,函数即服务)。

按需装载,自动伸缩,不用你苦逼地去规划硬件,安装软件,还可以按照使用情况付费,这么好的东西,我们是不是马上投入Serverless的怀抱?

为了达到上面的目标,你必须得牺牲一个很重要的东西:状态

函数没有状态的,每次启动都可能会被部署到一个全新的”服务器”中,这就有两个问题:

  • 用户的会话状态肯定是无法保持的;
  • 函数无法做本地的持久化,没法访问本地硬盘的任何东西(服务器看不见了,怎么能看见硬盘呢?)。

所有想持久化的东西必须得保存到外部的系统或者存储中,例如 Redis,MySQL等。 很明显,这些东西也应该以”服务”的方式来呈现,即 Backend as a Service (BaaS)。

因此,FaasBaaS一起,可以称为 Serverless 产品。通过组合这些产品,开发者可以构建自身的业务 Serveless 架构。

serverless带给前端工程师什么?

Node.js 出现以后,以 Express 为代表的超轻量框架,因为相对简单又是 JS 语言,因此在前端圈掀起了一股 “全栈开发” 的热潮。有些小应用就是适合用 Node.js 写,速度快效率高用过都说好。

但是在一些大型生产应用上,前端就够不着了。我相信有很多优秀的前端工程师,用 Node.js 接个数据库,写一些业务逻辑的接口,完全没有问题。

但是,如果让你搞一些后端的高级玩法,做一些服务器运维的事情,你可能就整不来了。

这部分人我们可以称作是”全栈工程师”。所谓的全栈要么是一端深一端浅,要么是两端都浅(当然超级大牛忽略),所以开发小应用可以,大型生产应用就没全栈什么事了。

而现在随着 Serverless 云函数横空出世,屏蔽了服务器和后端应用的部分,使后端开发门槛大幅降低。前端仿佛又看到了希望,我们可以不用写接口,只需要编写云函数,也能实现生产应用的后端开发。

以前有高墙,前端卷不进来。现在墙拆了,你说我们进不进?

典型的例子是微信小程序云开发。前端在微信开发者工具上编写云函数,一键上传与部署。然后在小程序代码中获取并调用这个远程函数,相当于整个流程前后端都是自己实现自己调试,直到应用开发完成。

使用 Serverless 云函数不光能轻松实现后端的业务功能,而且监控,并发,负载这些由云厂商统一实现,一应俱全。因此在稳定性可靠性上也非常有保障。

另外,函数计算是按照调用次数,访问流量计费的,比云服务器要更节约资源更省钱。

未来会有越来越多的 web 应用接入到 serverless,因此更多的前端开发工程师会独立开发一个完整的项目。

以前,前端要实现一些自己的想法,必须要有后端的接口配合,而且还需要后端或运维帮忙在线上部署。但是现在不用了,我们有机会自己搞定这一切。

这对前端来说是巨大的机会,一个可以将自己的想法变成一个应用的好机会。

原文链接:https://juejin.cn/post/7241452728747425853 作者:小p

(0)
上一篇 2023年6月6日 上午10:26
下一篇 2023年6月7日 上午10:05

相关推荐

发表回复

登录后才能评论