参考书目:
1.《深入浅出Serverless技术原理与应用》----陈耿
2.《Serverless架构》----Cagatay Gurturk
3.《AWS IN ACTION》----Andreas Witting,Michael Witting
4.《Spring Microservices IN ACTION》----John Carnell
1.云计算基础
2.serverless原理
3.基于docker(或rkt),k8s平台的serverless总体架构图
4.相关资源总结
1.云计算基础
云计算类型:
- 公有云 Public Cloud:由某一机构,公司管理并对公众开放使用的云计算
- 私有云 Private Cloud:在单个的机构中通过虚拟化共享出来的IT基础设施
- 混合云 Hybird Cloud:公有云和私有云的混合
云计算服务类型:
传统:
-
IaaS:Infrastructure as a Service
基础设施即服务–提供计算,存储,网络等功能的基本资源,使用Amazon EC2,Google Compute Engine和Microsoft Azure虚拟机这一类虚拟服务器。 -
PaaS:Platform as a Service
平台即服务–提供将定制的应用部署到云上的平台,如AWS Elastic Beanstalk,Google App Engine和Heroku -
SaaS:Software as a Service
软件即服务–结合了基础设施和软件并且运行在云端,包括Amazon WorkSpaces,Google Apps for Work和Microsoft Office 365这一类办公应用
新兴:
-
FaaS:Function as a Service
函数即服务–基于FaaS的应用会使用像Amazon Lambda技术和Google Cloud函数这样的设施,应用将会以“无服务器(serverless)的形式部署,这些代码会完全在云计算提供商的平台计算设施上运行。使用FaaS平台,无需管理任何服务器基础设施,只需支付执行函数所需的计算周期。 -
CaaS:Container as a Service
容器即服务–使用容器即服务模型,开发人员将微服务作为便携式虚拟容器(如Docker或rkt)进行构建并部署到云供应商的云计算平台。与IaaS模型不同,使用IaaS的开发人员必须管理部署容器的虚拟机,而CaaS则是将服务部署在轻量级的虚拟容器中。云供应商会提供运行容器的虚拟服务器,以及用于构建,部署,监控和伸缩容器的综合工具。Amazon Elastic Container Service(Amazon ECS)就是一个基于CaaS平台的例子。
注意:使用云计算的FaaS和CaaS模型,开发人员任然可以构建基于微服务的架构。微服务的核心为在于构建有限职责的小型服务,并使用基于HTTP的接口进行通信。新型的云计算平台(FaaS,CaaS)是部署微服务的替代基础设施机制。
2.serverless原理
serverless简介
在Servrerless架构中,服务器由云计算平台透明帮你调度,用户无需关心。
Serverless应用只有处于在线状态下才进行计费,空闲状态下将不会产生费用。
而传统的服务只要你申请使用了云计算商的服务器,不论你的应用空闲还是繁忙都将产生费用。
因为对于传统的服务而言,你需要先向云计算商申请主机,你申请到的主机在使用期间内将由你掌管维护,而Serverless主要是去除了用户自主申请主机这一步骤,用户只需提供需要运行的程序即可,当你的程序处于运行状态时,云计算厂商自主为你的程序配置环境运行及主机等一切与程序运行相关的服务,当程序空闲时,厂商将释放掉这些资源,因而不会计费。
serverless架构的核心思想为:去基础架构,用户只需关心程序代码的具体实现,具体到程序的运行,sdk,网络,存储,服务器等所有程序运行所需的资源都交由云计算平台提供商的透明调度,用户无需关心维护。
serverless平台特点:
- 抽象了底层计算资源
- 按使用量计费
- 自动弹性扩展
- 事件驱动
serverless实现基础
FaaS是当前serverless实现的技术基础。
FaaS的核心为:应用程序不在是一个众多功能的集合体,而是一个个的驱动函数function。
每一个函数完成一个相对简单的业务逻辑,一个完整的应用由若干个函数组成。
注意:
serverless的核心观念为:为开发人员去基础设施,使其只关注应用程序本身功能的实现。
而FaaS恰好契合了这一观念,因此被广泛应用于serverless平台的实现,但是serverless并没有强制要求一定要基于FaaS平台实现。
FaaS平台架构图:
FaaS平台主要组件:
- 函数定义(Function Definition):一个函数实现一个业务逻辑
- 函数实例(Function Instance):处于运行状态的应用函数实例
- 控制器(Controller):负责应用函数的加载,执行等流程的管理
- 事件(Event):事件驱动架构中的事件
- 事件源(Event Source):事件驱动架构中的事件来源。可以是一个DB中插入了新的记录,一个目录里删除了一个文件,或是消息队列里收到了新的消息等等。
- 触发规则(Trigger Rule):定义事件与函数的关系及触发的规则。
- 平台服务(Platform Service):支撑应用运行的各类底层服务,如计算资源,网络,存储等。
函数的生命周期:
在FaaS上一个函数从创建到执行的生命周期:
- 用户根据所选定的FaaS平台的规范进行函数应用的开发。当前主流的FaaS平台都支持多种不同的编程语言。
- 编写好的函数将上传至FaaS平台。平台将负责编译和构建这些函数,并将构建的输出保存。一个完整的FaaS平台可以对函数进行版本控制
- 用户设置函数触发的规则,将事件源与特定的版本的函数进行关联。一个函数可以和多个不同版本的事件的事件源进行关联。
- 当事件到达且满足条件时,平台将会部署,编译构建后的函数并执行。平台将监控函数执行的状态,根据请求量的大小,平台负责对函数实例进行扩容和缩容。
3.基于docker(或rkt),k8s平台的serverless总体架构图
函数工作流:
一个应用场景的完成通常需要多个函数协作完成。当涉及多个函数时,就需要有逻辑处理执行的顺序,错误重试,异常捕获及状态传递等细节。
这种需求往往需要用户在早期实现函数时自行添加编排逻辑。
但是编排逻辑并非核心业务逻辑,它的引入影响了函数的开发效率。
故一些FaaS实现开始提供针对FaaS函数的流程编排服务或工具,以简化FaaS应用的流程编排,如==AWS Step Functions ==和 Fission Workflows
AWS Step Functions 主页:https://aws.amazon.com/step-functions
4.相关资源总结
serverless技术发展:
- serverless相关资源列表:https://github.com/anaibol/awesome-serverless
- serverless导图概览:https://github.com/cncf/wg-serverless
serverless相关资源分为如下几类:
-
serverless平台。
提供serverless应用开发和运维的公有云的私有云平台。
如:AWS Lambda,Azure Functions,Google Cloud Functions等公有云平台;OpenWhisk,Fission,Kubeless,Fn,OpenFaaS等可以被部署在私有数据中心的开源serverless平台。 -
serverless框架。
serverless平台为用户提供了开发和运行serverless的基础,但是不同的serverless平台的规范和开发方式不尽相同。(注意在此关注Knative技术,Knative为Google等公司对serverless规范化开发的技术)
为了方便用户同时在多个不同的平台上开发和部署应用,业界出现了一批serverless框架,以帮助用户降低serverless应用开发部署的复杂度。
如:Serverless Framework框架同时支持AWS,Azure,Google及OpenWhisk等众多平台。通过Serverless Framework用户可以屏蔽底层不同平台的差异,通过一个统一的接口部署,测试和管理在不同平台上的serverless应用。
Apex是一款针对AWS Lambda的serverless增强框架,可以让用户使用非AWS Lambda官方原生支持的编程语言开发应用函数,并将其发布到AWS Lambda平台上。 -
serverless工具。
各类serverless应用的辅助工具,简化serverless应用设计和部署的.architect。
如:帮助用户监控管理serverless应用的日志和性能的Dashbird和IO Pipe,帮助用户对serverless应用进行持续集成的LambCI -
编程语言库。
针对某种编程语言的serverless类库。
是一款基于python语言的serverless工具,可以简化基于python的AWS Lambda应用的开发和部署。 -
后台服务。
完整的serverless应用往往还依赖于第三方的后台服务,以解决安全,数据持久化,消息传递等需求。
如:安全服务Puresec,为serverless应用提供安全运行环境(Serverless Security Runtime Environment,SSRE);Snyk提供Serverless应用的安全漏洞扫描服务。传统的与服务如AWS S3,AWS DynamoDB,AWS ELB等都属于设计和构建serverless应用是的BaaS(Backend as a Service)。
serverless与公有云
-
Amazon Web Service
AWS Lambda :
主页:https://aws.amazon.com/lambda
最早的serverless实现,来自最大的云计算厂商aws,是AWS针对serverless架构推出的FaaS云服务。 -
Microsoft Azure
Azure Functions :
主页:https://azure.microsoft.com/en-us/services/functions/
所有功能文档:https://docs.microsoft.com/en-us/azure/
Azure Functions运行时文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-runtime-overview
微软公有云的serverless实现平台 -
Google Cloud Platform
Google Cloud Functions:
主页:https://cloud.google.com/functions/
Google Cloud Functions是Google公司推出的公有云的FaaS服务。
注意:2018年7月Google公布开源项目Knative。Knative提供基于容器的serverless FaaS平台能力,其目的如同其k8s统一了容器编排领域,Knative的目的在于统一serverless FaaS,将serverless标准化。 -
Webtask
主页:https://webtask.io
Webtask是Auth0公司提供的在线FaaS服务。适用于需要少量server端的单页应用程序。
Auth0是一家为手机应用提供在线身份验证服务的SP。在提供身份服务验证时,他们经常遇到用户需要加入一些自定义逻辑片段的情况。为了解决用户的自定义逻辑的需求,Auth0研发并推出了Webstack服务。 -
Hyper.sh
主页:https://hyper.sh/
Hyper.sh是一个在线容器运行服务,一个CaaS平台。
用户可以在Hyper.sh平台上运行所需的容器实例,Hyper.sh负责为容器实例提供底层所需的计算资源,网络,存储等服务。
一般的CaaS普遍构建在IaaS或虚拟化平台之上,由若干个容器实例运行在同一个虚拟机中,共享一个OS kernel。容器之间的隔离依赖Linux kernel的namespace和cgroups技术。
Hyper.sh和一般的CaaS的区别在于:Hyper.sh引入了一种叫做HyperContainer的特殊技术,在物理机上直接运行容器,并且为每个容器提供一个独立的OS kernel以提高隔离性。 -
阿里云
阿里云函数计算服务:
帮助文档:https://help.aliyun.com/product/50980.html?spm=a2c4g.11186623.6.540.4d162f01f1Szo6
产品主页:https://www.aliyun.com/product/fc?spm=5176.8142029.cloudEssentials.16.3dbd6d3efNQ16Q
所有产品文档:https://help.aliyun.com/document_detail/52895.html?spm=5176.137990.1214002.btn3.7c38224erHlkXM
阿里云函数计算执行环境:https://help.aliyun.com/document_detail/59223.html -
腾讯云
Serverless Cloud Function,SCF:
主页:https://cloud.tencent.com/product/scf
serverless与私有化部署
-
Knative
:
主页:https://knative.dev/
文档:https://knative.dev/docs/
Github:https://github.com/knative/
来自阿里云的介绍:
Knative 简介 https://yq.aliyun.com/articles/658800knative 是谷歌开源的 serverless 架构方案,旨在提供一套简单易用的 serverless 方案,把 serverless 标准化。目前参与的公司主要是 Google、Pivotal、IBM、Red Hat,2018年7月24日才刚刚对外发布,当前还处于快速发展的阶段。
来自开源中国的介绍:
基于 Kubernetes 与 Istio 的 Serverless 架构方案 Knative https://www.oschina.net/p/knative
-
Open Whisk:
主页:https://openwhisk.apache.org/
文档:https://openwhisk.apache.org/documentation.html
Github:https://github.com/apache/incubator-openwhisk
Open Whisk为开源的serverless FaaS平台。
这个源于IBM的serverless平台目前由Apache基金会管理和孵化。
OpenWhisk是一个功能完备的FaaS平台,包含事件驱动及函数执行时等核心平台组件。
OpenWhisk可以运行在不同的基础架构之上,包括各类物理机,虚拟机,容器平台(如k8s),PaaS(如OpenShift),公有云(如AWS,Azure)和私有云(如Open Stack)环境中。此外,IBM的云服务IBM Cloud哈提供了基于Open Whisk的公有云服务IBM Cloud FUnctions。 -
Kubeless:
主页:https://kubeless.io/
文档:https://kubeless.io/docs/
Github:https://github.com/search?q=kubeless&type=Repositories
Kubeless是一个基于k8s的开源serverless FaaS平台框架,其定位是增强k8s的能力,使k8s的应用场景可以延伸至serverless FaaS领域。
其为k8s的原生serverless实现,直接引用k8s的原生组件进行设计。
用户可以通过定制容器镜像来自定义函数的执行环境。 -
Fassion:
主页:https://fission.io/
文档:https://docs.fission.io/
Github:https://github.com/search?q=fission
Fassion由Platform 9公司创建的开源项目,是基于k8s平台构建的serverless框架,增强了k8s的能力,使其可以应用于FaaS。
用户可以在k8s集群上与运行Fission以提供FaaS平台服务。
通过k8s的容器编排能力,Fission对底层的容器化函数执行环境进行调度和编排。 -
OpenFaas:
主页:https://www.openfaas.com
文档:https://docs.openfaas.com/
Github:https://github.com/search?q=openfaas
OpenFaas是来自于Docker社区的一款serverless框架,其利用docker及k8s或Docker Swarm提供Faas计算平台。同Fission,Kubeless不同的是:OpenFaaS除了支持k8s外,还支持Docker Swarm。
Fission和Kubeless都倾向于向用户隐藏底层容器技术的细节,而OpenFaaS中函数是以容器的形式定义的,容器对于用户而言并不是抽象的,用户在定义函数时将指定具体的容器镜像。因为函数的封装格式是Docker容器镜像,因此用户可以使用任何运行在Docker容器中的技术来实现他们的函数逻辑。 -
Fn
主页:https://fnproject.io/
Fn为Oracle公司支持的一个开源的Serverless FaaS项目。
Fn项目的特点是基于容器技术(Docker native),支持多个不同的容器编排平台,包括k8s,Docker Swarm及Mesosphere,支持在不同的私有云和公有云平台上进行部署。
serverless框架和工具
serverless应用往往包含许多细粒度的函数。
serverless的运行环境是在远端的云环境之上。
目前serverless技术还为建立行业规范,每个serverless平台的用户接口都不相同。
(Google的Kantive正在试图使serverless服务规范化。)
为了解决如上问题,社区出现了一批框架和工具,以帮助用户进行serverless的开发。
-
Serverless Framewok
主页:https://github.com/serverless/serverless
Serverlesss Framework是一款帮助用户构建,部署和管理在不同serverless平台之上应用的命令行工具。由Node.js语言编写。 -
Chalice
主页:https://github.com/aws/chalice
Chalice是AWS官方支持的开源项目。基于python实现,用于简化用户定义和部署AWS Lambda上的应用。 -
Cloaudia.js
主页:https://github.com/claudiajs/claudia
Cloaudia.js采用Node.js语言编写,只支持Node.js的AWS Lambda应用。其目的为简化Node.js AWS Lambda的构建和部署。 -
Apex
主页:https://github.com/apex/apex
Apex采用go语言编写,为一款AWS Lambda工具,帮助用户部署和管理AWS Lambda应用。Apex支持多种语言:node.js,python.java,go。同时Apex还通过Shim支持AWS Lambda原生不支持的语言,如:rust和Clojure等。 -
Spring Cloud Function
主页:https://github.com/spring-cloud/spring-cloud-function
是Spring针对Serverless架构推出的一个新项目,其目的意在提供一种于具体平台无关的serverless的应用开发模式。
通过Spring Cloud Function,Java程序员可以使用Spring,Spring Boot的特性来开发Serverless应用,并将应用部署和运行在不同的云平台上。 -
AWS SAM
主页:https://github.com/awslabs/serverless-application-model
AWS SAM:AWS Serverless Apllication Model,它是AWS推出的一个Serverless应用的定义规范。SAM的目的是让用户可以更清晰更便捷的定义基于AWS Lambda的serverless应用。
用户根据SAM的规范编写JSON或者YAML格式的Serverless应用模板,在通过命令行工具对定义好的应用进行本地测试,并最终发布到AWS Lambda平台上。