古时的风筝-家乡的麦田
最近两年 Serverless 呈现出越来越火的趋势,各大云服务厂商开始提供 Serverless 服务,有些大厂也已经开始实践私有化的 Serverless。
服务架构发展
在介绍 Serverless 之前有必要先说一下服务架构的发展史。服务架构的演化标志着更方便、更有效率、更低成本的开发、运维方式。
IaaS
Infrastructure as a service,基础设施即服务。是指把IT基础设施作为一种服务通过网络对外提供。在这种服务模型中,用户不用自己构建一个数据中心,而是通过租用的方式来使用基础设施服务,包括服务器、存储和网络等。在使用模式上,IaaS与传统的主机托管有相似之处,但是在服务的灵活性、扩展性和成本等方面IaaS具有很强的优势。
这种方式在互联网早期流行,比方说我要做一个个人站点,程序开发完了,不管是用 Java 还是 PHP,那我要把服务发布出去一定要有一台服务器,并且这台服务器一定要有个公网的出口能被公网访问才行。这个时候怎么办呢,我可以去托管机房(比如联通、电信)租一台 VPS,这是比较古老的方式,现在更多的是去各大云平台买一台云服务器,比如阿里云 ECS。之后我就可以远程这台服务器,到上面安装、部署我写好的网站程序了。
PaaS
Platform as a service,平台即服务。是指将一个完整的软件研发和部署平台,包括应用设计、应用开发、应用测试和应用托管,都作为一种服务提供给客户。在这种服务模式中,客户不需要购买硬件和软件,只需要利用PaaS平台,就能够创建、测试和部署应用和服务。与基于数据中心的平台进行软件开发和部署相比,采用PaaS的成本和费用要低得多。
还是拿个人站点举例子,我的个人站点访问量比较大,数据库要和应用程序分开,而且需要用到缓存。怎么办呢,我还是到阿里云上,这时候,我不是再买一台 ECS 安装 MySQL 了,而是直接买一个 RDS 服务,然后就可以把它当做一个 MySQL 实例或者集群那样使用了。缓存我要用 Redis ,这时候,我也不再买一台 ECS 装一个 Redis 服务了,而是直接买一个云数据库 Redis 版,然后我就可以直接像操作 redis 一样去使用它了。
SaaS
Software as a service,软件即服务。SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得Saas平台供应商提供的服务。
还是拿个人网站举例子,我觉得开发一个个人网站有点浪费时间,平时就是发发文章什么的,也没有特殊的需求,那我直接到 wordpress 上在线创建一个个人博客平台就好了。
比如你是做零售行业的,想做一个在线商店,不用找人开发了,直接去「有赞」上注册账号、交费就可以马上得到属于自己的在线商城。
另外属于这个模式的还有企业微信、各种团队办公协作平台。开发团队也可能使用到的研发管理协作平台,比如腾讯的 TAPD。
FaaS
Function as a Services,函数即服务。而所谓的“函数”(Function)提供的是相比微服务更加细小的程序单元。例如,可以通过微服务代表为某个客户执行所有CRUD操作所需的代码,而FaaS中的“函数”可以代表客户所要执行的每个操作:创建、读取、更新,以及删除。从这一层意思来说,我们可以简单地将FaaS架构与 Serverless 概念等同起来。
Serverless 何方神圣
Serverless - 无服务器架构。听上去就感觉很洋气的样子,不用服务器就能完成开发部署。可以理解为 Serverless 是 PaaS 架构的进一步扩展延伸,PaaS 的服务(比如 RDS)启动后无法精确控制运行时间,而 Serverless 框架则是要做到这点。有一个界定这两者的简单方法:如果你的PaaS能够有效地在20毫秒内启动实例并运行半秒,那么就可以称之为Serverless。
特点
实现了细粒度的计算资源分配
粒度有多细呢,可以理解为细到接口,作为开发者来说,我们可以只接入用到的接口资源。
降低了开发、运维成本
对使用者来说,Serverless 服务是透明的。资源就在那儿,我们也不用去管它,只要按照正确的方式去使用它就可以了。
上面说了,Serverless 提供的服务其实就是一个个的函数、接口,这些接口都是经过验证的,开发者只要正确的调用就可以了,无需过多的调试、验证。
而对于运维来说,没有服务器,那自然运维的东西就少了很多,只需要及时的关注服务的健康状态等少量指标就可以了。
按需使用,按需计费
这是对个人开发者或者企业吸引力最大的地方,我的应用需要多少资源我就为多少资源付费。比如我的个人网站流量比较少,一天只有几百个 pv,那我就为这几百 pv 消耗的资源付费,而不用像以前一样,买一个大的服务器而白白的耗费钱财。
弹性扩容、缩容
还是个人站点,虽然之前一直是平稳的每天几百 pv,可是突然有一天莫名其妙的火了,pv 达到了几万 pv 甚至更高(当然排除 DDOS),如果之前我是买了一台低性能的服务器,那可能现在已经支撑不住了,如果买的是高性能的那就浪费了资源。
而使用 Serverless 之后呢,当流量上来之后也不用考虑服务器是不是能支撑的住了,需要多少资源 Serverless 自动就扩容多少,而流量下来之后,就把多余的资源释放掉。
举个例子
这不是广告,小程序也不用我做广告。
开发过小程序的同学肯定都知道,微信小程序有个云开发的功能。开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。包括了云函数、云数据库、云存储、云调用的功能。
下图是对于云开发的一个介绍说明:
我们之前做小程序开发部署流程是比较复杂的。
- 我们要完成小程序代码的开发,包括前端和后端。
- 假设用 Java 开发完后端,要部署到服务器上,假设你是用的 ECS ,那需要在 ECS 上安装 JDK 、tomcat 等。
- 如果有用到 redis 或数据库,还需要单独安装或者购买相应的 PaaS 服务。
- 如果用到数据存储的话,可能还要接入七牛之类的云存储服务。
- 然后你还要有个域名和一个 SSL 证书,因为小程序要求调用的后台接口是 HTTPS 的,需要到服务器上的 nginx 或者 tomcat 上配置 SSL 证书。
以上才算基本完成了小程序开发和部署工作,比如我很早之前为了学习小程序开发做的一个简单的小工具就是用的这种方式开发的,那时候腾讯还没有推出云开发,否则我是肯定不会自己这样折腾的。
而如果是用 Serverless (云开发)这种模式的话,只需要根据小程序开发文档进行开发就可以了,服务器运维什么的就不用操心了,当然了只要相应的付费就可以了,良心的是小程序云开发有免费资源,当你的流量很小的时候,几乎是免费的。
局限
现在的 Serverless 一般用在比较轻量的或者偏前端的应用上,这主要和 Serverless 的实现方式有关,Serverless 要求可以快速分发,并且要求启动时间尽可能短。Serverless 最早就是 nodejs 上的实践,比如小程序云开发其实就是用的 nodejs 作为云服务端,因为 nodejs 比较轻量级,容易分发,是目前 Serverless 的首选。而像 Java 这种比较重的语言可能还需要等待一段时间。
后话
从 IaaS 到 Serverless ,架构总是朝着越来越方便开发者和运维人员使用的方向进步和发展,作为开发人员,也要及时看到这种变化,做一个与架构同步发展的 IT 人。