# 序言
三言两语,不如细心探索。
前段时间,使用 Amazon Serverless 部署了一个项目。现在对这一方面做个总结。
> 本文会介绍以下四个模块:
>
> - 云计算
> - serverless
>
> - Amazon serverless 架构
>
> - 问题&解决方案
希望此文,能帮助读者对 Amazon Serverless 有一个初步的了解
<!--StartFragment-->
## 1.1 为什么会出现云计算
其实主要有两个原因。
1. 硬件设备复杂程度越来越高
2. 运维复杂程度越来越高
所以就有人提出了,可不可以把复杂的硬件管理放云上,运维的部分工作交给第三方。于是云计算就应运而生了。
在业内,有一个比较认可的定义,我们来看一下:
1. 一种模型
2. 广泛的网络接入
3. 快速弹性伸缩
4. 按需自助服务
云计算解决了成千上万台计算机或软件组件的部署和协作问题
云计算的关注点是如何在实现大规模部署下的综合管理
## 1.2 云计算发展流程
可以看几个云计算发展过程中的典型事件。
1.1961年,麻省理工学院百周年纪念典礼上,约翰麦卡锡(1971年图灵奖获得者)第一次提出了 "Utility Computing" 的概念
这个概念可以认为是云计算的一个“最初的",超前的"遐想模型,它翻译成现今的大意就是:计算机在未来,将变成一种公共资源,会像生活中的水、电、煤气一样,被每一个人使用。
2.1996年,康柏 (Compaq) 公司的一群技术主管在讨论计算业务的发展时,首次使用 了 Cloud Computing 这个词,并认为商业计算会向 Cloud Computing 的方向转移。
这也是"云计算”从雏形到正式被提出的基本过程。
3.2009年,UC Berkeley 发表了: Above the Clouds: A Berkeley View of Cloud Computing。 在该文章中,明确指出:云计算是一个即将实现的古老梦想,是计算作为基础设施这一长久以来梦想的新称谓,它在最近正快速变为商业现实。在该文章中,明确的为云计算做了定义:云计算包含互联网上的应用服务及在数据中心提供这些服务的软硬件设施。
## 1.2 云计算的十个问题
![image.png](https://dev-media.amazoncloud.cn/03fb607f1e93405786fe0d0a6811dcd9_image.png "image.png")
# 2.Serverless
说完了云计算,那么什么是 serverless 呢?
其实从云计算到 serverless 的发展,是有一定必然性的,serverless 解决了云计算概念下提出的一些问题。
也可以理解为,serverless 是云计算发展到一定时间的产物,下面先看下 serverless 的发展流程
## 2.1 发展流程
1. 2012年由 lron.io 的副总裁 Ken Form 所写的一篇名为 Why The Future of Software and Apps is Serveress 的文章中,提出了一个新的观点:云应用正在朝着[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)方向发展
2. 2014年 Amazon 发布了 Amazon Lambda 让"Serverless"这一范式提高到一个全新的层面
3. 2016年10月在伦敦举办了第一届的 ServerlessConf, 在两天时间里面,来自全世界40多位演讲嘉宾为开发者分享了关于这个领域进展,并且对未来进行了展望,这个大会,在 Serverless 的发展史 上具有里程碑的意义。
![image.png](https://dev-media.amazoncloud.cn/84feea6eec3a49fe885e53b85bfe6896_image.png "image.png")
其实可以看到,从2012年 serverless 名词被提出,到2014年亚马逊云科技将它正式商业化,之后。整个 serverless 的发展,是逐渐变快的一个过程。
2016年之后,serverless 是步入了一个飞速发展的时期。
- 2016年全球一些头部的云厂商,像 IBM,谷歌,微软,都已经开始布局他们的serverless架构
- 2017年,国内的一些头部云厂商,阿里,腾讯,华为也开始布局自己的 FaaS平台,函数即服务相关的服务,布局自己的 serverless 方向。
## 2.3 Serverless 定义
Serverless = FaaS + BaaS
- FaaS: 函数即服务
- BaaS: 后端即服务
特点:
- 弹性伸缩
- 按量付费
![image.png](https://dev-media.amazoncloud.cn/af7f1f0e1b574c7dadac96e0b6d28774_image.png "image.png")
<!--StartFragment-->
# 3.Amazon Serverless
亚马逊云科技有布局自己的 serverless 架构,其中分了以下3个模块
- 计算
- 应用程序集成
- 数据存储
其中,每个模块里有细分了很多内容,如下图,(红色部分,是我比较熟悉的几个内容)。
![image.png](https://dev-media.amazoncloud.cn/1528454c89554455b62c324e4d0bf44d_image.png "image.png")
## 3.1 Lambda 简单使用过程
Amazon Lambda 是一项[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)事件驱动型计算服务
- 原理:容器技术
- 代码:可以运行任何类型的应用程序/后端服务的代码
- 费用:按量付费
- 适用场景: 主要有11种场景:Web 应用程序;文件处理;流处理 ; IoT 后端;后端服务;并发和扩展控制; 容器函数 ;全性校验;Lambda 扩展;函数蓝图 ;访问数据库
**下面来看下使用流程:**
![image.png](https://dev-media.amazoncloud.cn/7802c529e2be4381be402f8cbb0e2bd0_image.png "image.png")
首先,左侧是一个开发者,他编写完代码,可以上传到 FaaS 服务里面,即函数计算一个服务里面,也就是 serverless 架构的一个服务,上传之后,他可以通过 api/sdk 进行调用或者触发,自测一下,如果没有问题,那他这方面的工作就已经结束了。就可以准备其他项目的开发了。
下面是调用者或者事件源,如果需要用到这个函数实例,他拿到对应的请求地址,在自己的项目中去调用使用。
在没有请求的时候,这个函数是没有对应实例启动的,一旦有请求过来,函数会启动对应的实例去应对。所以当有一个请求,就会启动一个实例。10个请求,启动十个实例。
但是,这里也不是无上限的去启动,这里 FaaS 平台就会根据触发的并发度等弹性执行对应的函数。会有一些设置,去实现动态扩缩容。最后用户可以根据实际资源使用量进行按量付费
从这个流程中,可以看到 serverless 架构有弹性伸缩的一个概念的,同样底层的服务,底层服务器的运维这些都是交给亚马逊云科技来做的。
可以看出整个过程,是把更专业的事情交给更专业的人。
整个从安全性,服务器的稳定性,其实都是有一个更加有利的保障了。
**总结下来就是:**
- 编写代码
- 上传代码
- 事件触发
- 弹性执行
- 按量付费
## 3.2 架构比较
![image.png](https://dev-media.amazoncloud.cn/583170d11afd432389bd729d79337d82_image.png "image.png")
左侧为传统的架构,首先是客户端,服务端,然后数据库,是一个标准的一个 C/S 架构。在这样一个架构下,要在服务端里面做很多操作,比如首先得购买服务器,安装操作系统,环境搭建,应用部署,日志监测,账号权限,测试,后期的维护等等一系列的工作。
右侧为简单的 serverless 架构,一看图感觉是复杂了,但是仔细看下,其实只需要关注函数的业务逻辑,在这个例子里面,只需要实现两个函数的业务逻辑即可,其他的服务器,账号交给亚马逊云科技
可以思考一下:从左侧,过渡到右侧,发生了什么本质的改变?
原先需要关注的很多,鉴权系统,登录,oss等等,但是在 Amazon Serverless 架构下,只需要关注业务代码即可。
serverless 架构,主张的是更专业的事情,交给更专业的人,开发者只关注自身的业务逻辑即可。关注更少的事情,得到更多的回报。
# 4.问题&解决方案
**存在问题:**
- 冷启动:函数即服务冷启动问题
- 缺乏统一标准:呈现碎片化,各家都有各自的实现
## 4.1 冷启动解决方案
![image.png](https://dev-media.amazoncloud.cn/172013e3376c4b868369a7b4a058adf5_image.png "image.png")
## 4.2 标准化解决方案
- Knative 是谷歌牵头发起的 Serverless 项目。
- 其目标是基于 Kubernetes 的 Serverless 解决方案,旨在标准化 Serverless,简化其学习成本。
- Knative 是以 Kubernetes 的一组自定义资源类型(CRD)的方式来安装的,因此只需使用几个 YAML 文件就可以轻松地开始使用 Knative 了。
- 在本地或者托管云服务上,任何可以运行 Kubernetes 的地方都可以运行 Knative 和代码。
- 定义标准化、可移植、可重用、性能高效的构建方法
# 5.总结
总结下来,Serverless 目前还处于飞速发展的时期,也会存在很多问题
但是问题换个角度,就是一种新机会。
相信在全世界的 serverless 工程师共同的努力下,未来一定会发展的越来越好。
**Serveless 未来的发展可能会:**
- 大面积取代 Serverful
- 变为默认的计算范式
- 拥抱整个容器生态
- 加速运维关系的变化
- 复杂任务编排、工具链及可观测等能力提升
- 让业务开发和维护变的更加简单
*审核人:zxzhang*