From 2ae206cfdc2c05fd23cd59c1bb09d21887391904 Mon Sep 17 00:00:00 2001 From: Jimmy Song Date: Fri, 16 Sep 2022 12:04:55 +0800 Subject: [PATCH] update content --- README.md | 4 +- images/wechat.jpg | Bin 29968 -> 3499 bytes usecases/understanding-serverless.md | 132 +++++++++++++-------------- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index d06cdfa17..8a5a6899a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kubernetes 中文指南/云原生应用架构实战手册 -**注意:本手册中 Kubernetes 相关内容已迁移到云原生资料库中的 [《Kubernetes 基础教程》](https://lib.jimmysong.io/kubernetes-handbook),本手册不再继续维护,更多云原生内容请访问 [云原生资料库](https://lib.jimmysong.io)。** +**注意:本手册中 Kubernetes 相关内容已迁移到云原生资料库中的 [《Kubernetes 基础教程》](https://lib.jimmysong.io/kubernetes-handbook),本手册中 Kubernetes 相关内容不再继续维护,更多云原生内容请访问 [云原生资料库](https://lib.jimmysong.io)。** [Kubernetes](http://kubernetes.io) 是 Google 于 [2014 年 6 月](https://jimmysong.io/cloud-native/note/open-source/)基于其内部使用的 [Borg](https://research.google.com/pubs/pub43438.html) 系统开源出来的容器编排调度引擎,Google 将其作为初始和核心项目贡献给 [CNCF](https://cncf.io)(云原生计算基金会),近年来逐渐发展出了云原生生态。 @@ -87,4 +87,4 @@ Kubernetes Handbook 项目始于 2016 年底,开源于 2017 年 3 月,作为 云原生社区是中国最大的独立第三方云原生终端用户和泛开发者社区,由 CNCF 大使、开源意见领袖共同发起成立于 2020 年 5 月 12 日,提供云原生专业资讯,促进云原生产业发展。 -官方网站 ,关注云原生社区微信公众号,[申请加入社区](https://mp.weixin.qq.com/s/ppDxLapuFwo3isEpg3zfUQ)。 +官方网站 ,关注云原生社区微信公众号,[申请加入社区](https://cloudnative.to/community/join/)。 diff --git a/images/wechat.jpg b/images/wechat.jpg index 6cc308a7018c92ffa4d331aade602948f4a701d9..7f6665d09c6d62272826f79508dc8867d6e82253 100644 GIT binary patch literal 3499 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 HFYWp_=hV*% literal 29968 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

rY79@O8#=fH_c<&E=fjcyxydNt2R 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 izu%sGAJ2BO<0u%#2)^P027l No silver bullet. - The Mythical Man-Month -许多年前,我们开发的软件还是C/S(客户端/服务器)和MVC(模型-视图-控制器)的形式,再后来有了SOA,最近几年又出现了微服务架构,更新一点的有Cloud Native(云原生)应用,企业应用从单体架构,到服务化,再到更细粒度的微服务化,应用开发之初就是为了应对互联网的特有的高并发、不间断的特性,需要很高的性能和可扩展性,人们对软件开发的追求孜孜不倦,希望力求在软件开发的复杂度和效率之间达到一个平衡。但可惜的是,NO SILVER BULLET!几十年前(1975年)Fred Brooks就在The Mythical Man-Month中就写到了这句话。那么Serverless会是那颗银弹吗? +许多年前,我们开发的软件还是 C/S(客户端 / 服务器)和 MVC(模型 - 视图 - 控制器)的形式,再后来有了 SOA,最近几年又出现了微服务架构,更新一点的有 Cloud Native(云原生)应用,企业应用从单体架构,到服务化,再到更细粒度的微服务化,应用开发之初就是为了应对互联网的特有的高并发、不间断的特性,需要很高的性能和可扩展性,人们对软件开发的追求孜孜不倦,希望力求在软件开发的复杂度和效率之间达到一个平衡。但可惜的是,NO SILVER BULLET!几十年前(1975 年)Fred Brooks 就在 The Mythical Man-Month 中就写到了这句话。那么 Serverless 会是那颗银弹吗? 云改变了我们对操作系统的认知,原来一个系统的计算资源、存储和网络是可以分离配置的,而且还可以弹性扩展,但是长久以来,我们在开发应用时始终没有摆脱的服务器的束缚(或者说认知),应用必须运行在不论是实体还是虚拟的服务器上,必须经过部署、配置、初始化才可以运行,还需要对服务器和应用进行监控和管理,还需要保证数据的安全性,这些云能够帮我们简化吗?**让我们只要关注自己代码的逻辑就好了,其它的东西让云帮我实现就好了。** -## Serverless介绍 +## Serverless 介绍 Serverless(无服务器架构)指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存储资源所记录。 @@ -16,31 +16,31 @@ Serverless 是云原生技术发展的高级阶段,使开发者更聚焦在业 下图来自谷歌云平台官网,是对云计算的一个很好的分层概括,其中 serverless 就是构建在虚拟机和容器之上的一层,与应用本身的关系更加密切。 -Serverless架构是云的自然延伸,为了理解serverless,我们有必要回顾一下云计算的发展。 +Serverless 架构是云的自然延伸,为了理解 serverless,我们有必要回顾一下云计算的发展。 ### IaaS -2006年AWS推出EC2(Elastic Compute Cloud),作为第一代IaaS(Infrastructure as a Service),用户可以通过AWS快速的申请到计算资源,并在上面部署自己的互联网服务。IaaS从本质上讲是服务器租赁并提供基础设施外包服务。就比如我们用的水和电一样,我们不会自己去引入自来水和发电,而是直接从自来水公司和电网公司购入,并根据实际使用付费。 +2006 年 AWS 推出 EC2(Elastic Compute Cloud),作为第一代 IaaS(Infrastructure as a Service),用户可以通过 AWS 快速的申请到计算资源,并在上面部署自己的互联网服务。IaaS 从本质上讲是服务器租赁并提供基础设施外包服务。就比如我们用的水和电一样,我们不会自己去引入自来水和发电,而是直接从自来水公司和电网公司购入,并根据实际使用付费。 -EC2真正对IT的改变是硬件的虚拟化(更细粒度的虚拟化),而EC2给用户带来了以下五个好处: +EC2 真正对 IT 的改变是硬件的虚拟化(更细粒度的虚拟化),而 EC2 给用户带来了以下五个好处: -- 降低劳动力成本:减少了企业本身雇佣IT人员的成本 -- 降低风险:不用再像自己运维物理机那样,担心各种意外风险,EC2有主机损坏,再申请一个就好了。 -- 降低基础设施成本:可以按小时、周、月或者年为周期租用EC2。 +- 降低劳动力成本:减少了企业本身雇佣 IT 人员的成本 +- 降低风险:不用再像自己运维物理机那样,担心各种意外风险,EC2 有主机损坏,再申请一个就好了。 +- 降低基础设施成本:可以按小时、周、月或者年为周期租用 EC2。 - 扩展性:不必过早的预期基础设施采购,因为通过云厂商可以很快的获取。 - 节约时间成本:快速的获取资源开展业务实验。 -以上说了是IaaS或者说基础设施外包的好处,当然其中也有弊端,我们将在后面讨论。 +以上说了是 IaaS 或者说基础设施外包的好处,当然其中也有弊端,我们将在后面讨论。 -以上是AWS为代表的公有云IaaS,还有使用[OpenStack](https://www.openstack.org/)构建的私有云也能够提供IaaS能力。 +以上是 AWS 为代表的公有云 IaaS,还有使用 [OpenStack](https://www.openstack.org/) 构建的私有云也能够提供 IaaS 能力。 ### PaaS -PaaS(Platform as a Service)是构建在IaaS之上的一种平台服务,提供操作系统安装、监控和服务发现等功能,用户只需要部署自己的应用即可,最早的一代是Heroku。Heroko是商业的PaaS,还有一个开源的PaaS——[Cloud Foundry](https://www.cloudfoundry.org/),用户可以基于它来构建私有PaaS,如果同时使用公有云和私有云,如果能在两者之间构建一个统一的PaaS,那就是“混合云”了。 +PaaS(Platform as a Service)是构建在 IaaS 之上的一种平台服务,提供操作系统安装、监控和服务发现等功能,用户只需要部署自己的应用即可,最早的一代是 Heroku。Heroko 是商业的 PaaS,还有一个开源的 PaaS——[Cloud Foundry](https://www.cloudfoundry.org/),用户可以基于它来构建私有 PaaS,如果同时使用公有云和私有云,如果能在两者之间构建一个统一的 PaaS,那就是 “混合云” 了。 -在PaaS上最广泛使用的技术就要数[docker](https://www.docker.com/)了,因为使用容器可以很清晰的描述应用程序,并保证环境一致性。管理云上的容器,可以称为是CaaS(Container as a Service),如[GCE(Google Container Engine)](https://cloud.google.com/container-engine/)。也可以基于[Kubernetes](https://kubernetes.io)、[Mesos](http://mesos.apache.org/)这类开源软件构件自己的CaaS,不论是直接在IaaS构建还是基于PaaS。 +在 PaaS 上最广泛使用的技术就要数 [docker](https://www.docker.com/) 了,因为使用容器可以很清晰的描述应用程序,并保证环境一致性。管理云上的容器,可以称为是 CaaS(Container as a Service),如 [GCE(Google Container Engine)](https://cloud.google.com/container-engine/)。也可以基于 [Kubernetes](https://kubernetes.io)、[Mesos](http://mesos.apache.org/) 这类开源软件构件自己的 CaaS,不论是直接在 IaaS 构建还是基于 PaaS。 -PaaS是对软件的一个更高的抽象层次,已经接触到应用程序的运行环境本身,可以由开发者自定义,而不必接触更底层的操作系统。 +PaaS 是对软件的一个更高的抽象层次,已经接触到应用程序的运行环境本身,可以由开发者自定义,而不必接触更底层的操作系统。 ## 什么是 Serverless @@ -54,35 +54,35 @@ Serverless(无服务器架构)指的是服务端逻辑由开发者实现, **进阶版** -Serverless是由事件(event)驱动(e.g. http,pub/sub)的全托管计算服务。用户无需管理服务器等基础设施,只需编写代码和选择触发器(trigger),(比如rpc请求,定时器等)并上传。其余的工作(实例选择、 扩缩容、部署、容灾、监控、日志、安全补丁等)全部由serverless系统托管。用户只需要为代码实际运行消耗的资源付费——代码未运行则不产生费用。 +Serverless 是由事件(event)驱动(e.g. http,pub/sub)的全托管计算服务。用户无需管理服务器等基础设施,只需编写代码和选择触发器 (trigger),(比如 rpc 请求,定时器等)并上传。其余的工作(实例选择、 扩缩容、部署、容灾、监控、日志、安全补丁等)全部由 serverless 系统托管。用户只需要为代码实际运行消耗的资源付费 —— 代码未运行则不产生费用。 -Serverless相对于serverful,对业务用户强调noserver(serverless并不是说没有服务器,只是业务人员无需关注服务器了,代码仍然是运行在真实存在的服务器上)的运维理念,业务人员只需要聚焦业务逻辑代码。 +Serverless 相对于 serverful,对业务用户强调 noserver(serverless 并不是说没有服务器,只是业务人员无需关注服务器了,代码仍然是运行在真实存在的服务器上)的运维理念,业务人员只需要聚焦业务逻辑代码。 -Serverless相比serverful,有以下3个改变(from Berkeley的总结): +Serverless 相比 serverful,有以下 3 个改变(from Berkeley 的总结): 1. 弱化了存储和计算之间的联系。服务的储存和计算被分开部署和收费,存储不再是服务本身的一部分,而是演变成了独立的云服务,这使得计算变得无状态化,更容易调度和扩缩容,同时也降低了数据丢失的风险。 -1. 代码的执行不再需要手动分配资源。不需要为服务的运行指定需要的资源(比如使用几台机器、多大的带宽、多大的磁盘等),只需要提供一份代码,剩下的交由serverless平台去处理就行了。当前阶段的实现平台分配资源时还需要用户方提供一些策略,例如单个实例的规格和最大并发数,单实例的最大cpu使用率。理想的情况是通过某些学习算法来进行完全自动的自适应分配。 -1. 按使用量计费。Serverless按照服务的使用量(调用次数、时长等)计费,而不是像传统的serverful服务那样,按照使用的资源(ECS实例、VM的规格等)计费。 +1. 代码的执行不再需要手动分配资源。不需要为服务的运行指定需要的资源(比如使用几台机器、多大的带宽、多大的磁盘等),只需要提供一份代码,剩下的交由 serverless 平台去处理就行了。当前阶段的实现平台分配资源时还需要用户方提供一些策略,例如单个实例的规格和最大并发数,单实例的最大 cpu 使用率。理想的情况是通过某些学习算法来进行完全自动的自适应分配。 +1. 按使用量计费。Serverless 按照服务的使用量(调用次数、时长等)计费,而不是像传统的 serverful 服务那样,按照使用的资源(ECS 实例、VM 的规格等)计费。 -## Serverless的定义 +## Serverless 的定义 -Serverless不如IaaS和PaaS那么好理解,因为它通常包含了两个领域BaaS(Backend as a Service)和FaaS(Function as a Service)。 +Serverless 不如 IaaS 和 PaaS 那么好理解,因为它通常包含了两个领域 BaaS(Backend as a Service)和 FaaS(Function as a Service)。 ### BaaS -BaaS(Backend as a Service)后端即服务,一般是一个个的API调用后端或别人已经实现好的程序逻辑,比如身份验证服务Auth0,这些BaaS通常会用来管理数据,还有很多公有云上提供的我们常用的开源软件的商用服务,比如亚马逊的RDS可以替代我们自己部署的MySQL,还有各种其它数据库和存储服务。 +BaaS(Backend as a Service)后端即服务,一般是一个个的 API 调用后端或别人已经实现好的程序逻辑,比如身份验证服务 Auth0,这些 BaaS 通常会用来管理数据,还有很多公有云上提供的我们常用的开源软件的商用服务,比如亚马逊的 RDS 可以替代我们自己部署的 MySQL,还有各种其它数据库和存储服务。 ### FaaS -FaaS(Functions as a Service)函数即服务,FaaS是无服务器计算的一种形式,当前使用最广泛的是AWS的Lambada。 +FaaS(Functions as a Service)函数即服务,FaaS 是无服务器计算的一种形式,当前使用最广泛的是 AWS 的 Lambada。 -现在当大家讨论Serverless的时候首先想到的就是FaaS,有点甚嚣尘上了。FaaS本质上是一种事件驱动的由消息触发的服务,FaaS供应商一般会集成各种同步和异步的事件源,通过订阅这些事件源,可以突发或者定期的触发函数运行。 +现在当大家讨论 Serverless 的时候首先想到的就是 FaaS,有点甚嚣尘上了。FaaS 本质上是一种事件驱动的由消息触发的服务,FaaS 供应商一般会集成各种同步和异步的事件源,通过订阅这些事件源,可以突发或者定期的触发函数运行。 ![服务端软件的运行环境](../images/serverless-server-side-software.jpg) -传统的服务器端软件不同是经应用程序部署到拥有操作系统的虚拟机或者容器中,一般需要长时间驻留在操作系统中运行,而FaaS是直接将程序部署上到平台上即可,当有事件到来时触发执行,执行完了就可以卸载掉。 +传统的服务器端软件不同是经应用程序部署到拥有操作系统的虚拟机或者容器中,一般需要长时间驻留在操作系统中运行,而 FaaS 是直接将程序部署上到平台上即可,当有事件到来时触发执行,执行完了就可以卸载掉。 -![FaaS应用架构](../images/serverless-faas-platform.jpg) +![FaaS 应用架构](../images/serverless-faas-platform.jpg) ### Serverless 中的函数 @@ -98,9 +98,9 @@ FaaS(Functions as a Service)函数即服务,FaaS是无服务器计算的 ### 总结 -两者都为我们的计算资源提供了弹性的保障,BaaS其实依然是服务外包,而FaaS使我们更加关注应用程序的逻辑,两者使我们不需要关注应用程序所在的服务器,但实际上服务器依然是客观存在的。 +两者都为我们的计算资源提供了弹性的保障,BaaS 其实依然是服务外包,而 FaaS 使我们更加关注应用程序的逻辑,两者使我们不需要关注应用程序所在的服务器,但实际上服务器依然是客观存在的。 -当我们将应用程序迁移到容器和虚拟机中时,其实对于应用程序本身的体系结构并没有多少改变,只不过有些流程和规定需要遵守,比如12因素应用守则,但是serverless对应用程序的体系结构来说就是一次颠覆了,通常我们需要考虑事件驱动模型,更加细化的部署形式,以及在FaaS组件之外保持状态的需求。 +当我们将应用程序迁移到容器和虚拟机中时,其实对于应用程序本身的体系结构并没有多少改变,只不过有些流程和规定需要遵守,比如 12 因素应用守则,但是 serverless 对应用程序的体系结构来说就是一次颠覆了,通常我们需要考虑事件驱动模型,更加细化的部署形式,以及在 FaaS 组件之外保持状态的需求。 ## Serverless 的使用场景 @@ -122,7 +122,7 @@ Serverless 的使用场景示例如: CNCF Serverless whitepaper 中给出了诸多 Serverless 使用场景的详细描述。 -我们以一个游戏应用为例,来说明什么是serverless应用。 +我们以一个游戏应用为例,来说明什么是 serverless 应用。 一款移动端游戏至少包含如下几个特性: @@ -134,55 +134,55 @@ CNCF Serverless whitepaper 中给出了诸多 Serverless 使用场景的详细 ![传统应用程序架构](../images/non-serverless-game-arch.jpg) -- 一个app前端,iOS后者安卓 -- 用Java写的后端,使用JBoss或者Tomcat做server运行 -- 使用关系型数据库存储用户数据,如MySQL +- 一个 app 前端,iOS 后者安卓 +- 用 Java 写的后端,使用 JBoss 或者 Tomcat 做 server 运行 +- 使用关系型数据库存储用户数据,如 MySQL -这样的架构可以让前端十分轻便,不需要做什么应用逻辑,只是负责渲染用户界面,将请求通过HTTP发送给后端,而所有的数据操作都是有由后端的Java程序来完成的。 +这样的架构可以让前端十分轻便,不需要做什么应用逻辑,只是负责渲染用户界面,将请求通过 HTTP 发送给后端,而所有的数据操作都是有由后端的 Java 程序来完成的。 这样的架构开发起来比较容易,但是维护起来确十分复杂,前端开发、后端的开发都需要十分专业的人员、环境的配置,还要有人专门维护数据库、应用的更新和升级。 -![Serverless架构](../images/serverless-game-arch.jpg) +![Serverless 架构](../images/serverless-game-arch.jpg) -而在serverless架构中,我们不再需要在服务器端代码中存储任何会话状态,而是直接将它们存储在NoSQL中,这样将使应用程序无状态,有助于弹性扩展。前端可以直接利用BaaS而减少后端的编码需求,这样架构的本质上是减少了应用程序开发的人力成本,降低了自己维护基础设施的风险,而且利用云的能力更便于扩展和快速迭代。 +而在 serverless 架构中,我们不再需要在服务器端代码中存储任何会话状态,而是直接将它们存储在 NoSQL 中,这样将使应用程序无状态,有助于弹性扩展。前端可以直接利用 BaaS 而减少后端的编码需求,这样架构的本质上是减少了应用程序开发的人力成本,降低了自己维护基础设施的风险,而且利用云的能力更便于扩展和快速迭代。 -## Serverless架构的优点 +## Serverless 架构的优点 -> 今天大多数公司在开发应用程序并将其部署在服务器上的时候,无论是选择公有云还是私有的数据中心,都需要提前了解究竟需要多少台服务器、多大容量的存储和数据库的功能等。并需要部署运行应用程序和依赖的软件到基础设施之上。假设我们不想在这些细节上花费精力,是否有一种简单的架构模型能够满足我们这种想法?这个答案已经存在,这就是今天软件架构世界中新鲜但是很热门的一个话题——Serverless(无服务器)架构。 +> 今天大多数公司在开发应用程序并将其部署在服务器上的时候,无论是选择公有云还是私有的数据中心,都需要提前了解究竟需要多少台服务器、多大容量的存储和数据库的功能等。并需要部署运行应用程序和依赖的软件到基础设施之上。假设我们不想在这些细节上花费精力,是否有一种简单的架构模型能够满足我们这种想法?这个答案已经存在,这就是今天软件架构世界中新鲜但是很热门的一个话题 ——Serverless(无服务器)架构。 > > ——AWS 费良宏 -- **降低运营成本:** +**降低运营成本** -Serverless是非常简单的外包解决方案。它可以让您委托服务提供商管理服务器、数据库和应用程序甚至逻辑,否则您就不得不自己来维护。由于这个服务使用者的数量会非常庞大,于是就会产生规模经济效应。在降低成本上包含了两个方面,即基础设施的成本和人员(运营/开发)的成本。 +Serverless 是非常简单的外包解决方案。它可以让您委托服务提供商管理服务器、数据库和应用程序甚至逻辑,否则您就不得不自己来维护。由于这个服务使用者的数量会非常庞大,于是就会产生规模经济效应。在降低成本上包含了两个方面,即基础设施的成本和人员(运营 / 开发)的成本。 -- **降低开发成本:** +**降低开发成本** -IaaS和PaaS存在的前提是,服务器和操作系统管理可以商品化。Serverless作为另一种服务的结果是整个应用程序组件被商品化。 +IaaS 和 PaaS 存在的前提是,服务器和操作系统管理可以商品化。Serverless 作为另一种服务的结果是整个应用程序组件被商品化。 -- **扩展能力:** +**扩展能力** -Serverless架构一个显而易见的优点即“横向扩展是完全自动的、有弹性的、且由服务提供者所管理”。从基本的基础设施方面受益最大的好处是,您只需支付您所需要的计算能力。 +Serverless 架构一个显而易见的优点即 “横向扩展是完全自动的、有弹性的、且由服务提供者所管理”。从基本的基础设施方面受益最大的好处是,您只需支付您所需要的计算能力。 -- **更简单的管理:** +**更简单的管理** -Serverless架构明显比其他架构更简单。更少的组件,就意味着您的管理开销会更少。 +Serverless 架构明显比其他架构更简单。更少的组件,就意味着您的管理开销会更少。 -- **“绿色”的计算:** +**“绿色” 的计算** -按照《福布斯》杂志的统计,在商业和企业数据中心的典型服务器仅提供5%~15%的平均最大处理能力的输出。这无疑是一种资源的巨大浪费。随着Serverless架构的出现,让服务提供商提供我们的计算能力最大限度满足实时需求。这将使我们更有效地利用计算资源。 +按照《福布斯》杂志的统计,在商业和企业数据中心的典型服务器仅提供 5%~15% 的平均最大处理能力的输出。这无疑是一种资源的巨大浪费。随着 Serverless 架构的出现,让服务提供商提供我们的计算能力最大限度满足实时需求。这将使我们更有效地利用计算资源。 -在上面我们提到了使用IaaS给我们带来了五点好处,FaaS当然也包括了这些好处,但是它给我们带来的最大的好处就是**多快好省**。减少从概念原型到实施的等待时间,比自己维护服务更省钱。 +在上面我们提到了使用 IaaS 给我们带来了五点好处,FaaS 当然也包括了这些好处,但是它给我们带来的最大的好处就是 ** 多快好省 **。减少从概念原型到实施的等待时间,比自己维护服务更省钱。 **降低人力成本** -不需要再自己维护服务器,操心服务器的各种性能指标和资源利用率,而是关心应用程序本身的状态和逻辑。而且serverless应用本身的部署也十分容易,我们只要上传基本的代码单元,例如Javascript或Python的源代码的zip文件,以及基于JVM的语言的纯JAR文件。不需使用Puppet、Chef、Ansible或Docker来进行配置管理,降低了运维成本。同时,对于运维来说,也不再需要监控那些更底层的如磁盘使用量、CPU使用率等底层和长期的指标信息,而是监控应用程序本身的度量,这将更加直观和有效。 +不需要再自己维护服务器,操心服务器的各种性能指标和资源利用率,而是关心应用程序本身的状态和逻辑。而且 serverless 应用本身的部署也十分容易,我们只要上传基本的代码单元,例如 Javascript 或 Python 的源代码的 zip 文件,以及基于 JVM 的语言的纯 JAR 文件。不需使用 Puppet、Chef、Ansible 或 Docker 来进行配置管理,降低了运维成本。同时,对于运维来说,也不再需要监控那些更底层的如磁盘使用量、CPU 使用率等底层和长期的指标信息,而是监控应用程序本身的度量,这将更加直观和有效。 -在此看来有人可能会提出“NoOps”的说法,其实这是不存在的,只要有应用存在的一天就会有Ops,只是人员的角色会有所转变,部署将变得更加自动化,监控将更加面向应用程序本身,更底层的运维依然需要专业的人员去做。 +在此看来有人可能会提出 “NoOps” 的说法,其实这是不存在的,只要有应用存在的一天就会有 Ops,只是人员的角色会有所转变,部署将变得更加自动化,监控将更加面向应用程序本身,更底层的运维依然需要专业的人员去做。 **降低风险** -对于组件越多越复杂的系统,出故障的风险就越大。我们使用BaaS或FaaS将它们外包出去,让专业人员来处理这些故障,有时候比我们自己来修复更可靠,利用专业人员的知识来降低停机的风险,缩短故障修复的时间,让我们的系统稳定性更高。 +对于组件越多越复杂的系统,出故障的风险就越大。我们使用 BaaS 或 FaaS 将它们外包出去,让专业人员来处理这些故障,有时候比我们自己来修复更可靠,利用专业人员的知识来降低停机的风险,缩短故障修复的时间,让我们的系统稳定性更高。 **减少资源开销** @@ -192,35 +192,35 @@ Serverless架构明显比其他架构更简单。更少的组件,就意味着 **增加缩放的灵活性** -以AWS Lamba为例,当平台接收到第一个触发函数的事件时,它将启动一个容器来运行你的代码。如果此时收到了新的事件,而第一个容器仍在处理上一个事件,平台将启动第二个代码实例来处理第二个事件。AWS lambad的这种自动的零管理水平缩放,将持续到有足够的代码实例来处理所有的工作负载。 +以 AWS Lamba 为例,当平台接收到第一个触发函数的事件时,它将启动一个容器来运行你的代码。如果此时收到了新的事件,而第一个容器仍在处理上一个事件,平台将启动第二个代码实例来处理第二个事件。AWS lambad 的这种自动的零管理水平缩放,将持续到有足够的代码实例来处理所有的工作负载。 -但是,AWS仍然只会向您收取代码的执行时间,无论它需要启动多少个容器实例要满足你的负载请求。例如,假设所有事件的总执行时间是相同的,在一个容器中按顺序调用Lambda 100次与在100个不同容器中同时调用100次Lambda的成本是 一样的。当然AWS Lambda也不会无限制的扩展实例个数,如果有人对你发起了DDos攻击怎么办,那么不就会产生高昂的成本吗?AWS是有默认限制的,默认执行Lambada函数最大并发数是1000。 +但是,AWS 仍然只会向您收取代码的执行时间,无论它需要启动多少个容器实例要满足你的负载请求。例如,假设所有事件的总执行时间是相同的,在一个容器中按顺序调用 Lambda 100 次与在 100 个不同容器中同时调用 100 次 Lambda 的成本是 一样的。当然 AWS Lambda 也不会无限制的扩展实例个数,如果有人对你发起了 DDos 攻击怎么办,那么不就会产生高昂的成本吗?AWS 是有默认限制的,默认执行 Lambada 函数最大并发数是 1000。 **缩短创新周期** -小团队的开发人员正可以在几天之内从头开始开发应用程序并部署到生产。使用短而简单的函数和事件来粘合强大的驱动数据存储和服务的API。完成的应用程序具有高度可用性和可扩展性,利用率高,成本低,部署速度快。 +小团队的开发人员正可以在几天之内从头开始开发应用程序并部署到生产。使用短而简单的函数和事件来粘合强大的驱动数据存储和服务的 API。完成的应用程序具有高度可用性和可扩展性,利用率高,成本低,部署速度快。 -以docker为代表的容器技术仅仅是缩短了应用程序的迭代周期,而serverless技术是直接缩短了创新周期,从概念到最小可行性部署的时间,让初级开发人员也能在很短的时间内完成以前通常要经验丰富的工程师才能完成的项目。 +以 docker 为代表的容器技术仅仅是缩短了应用程序的迭代周期,而 serverless 技术是直接缩短了创新周期,从概念到最小可行性部署的时间,让初级开发人员也能在很短的时间内完成以前通常要经验丰富的工程师才能完成的项目。 -## Serverless架构的缺点 +## Serverless 架构的缺点 -我们知道没有十全十美的技术,在说了serverless的那么多优势之后,我们再来探讨以下serverless的劣势,或者说局限性和适用场景。 +我们知道没有十全十美的技术,在说了 serverless 的那么多优势之后,我们再来探讨以下 serverless 的劣势,或者说局限性和适用场景。 **状态管理** -要想实现自由的缩放,无状态是必须的,而对于有状态的服务,使用serverless这就丧失了灵活性,有状态服务需要与存储交互就不可避免的增加了延迟和复杂性。 +要想实现自由的缩放,无状态是必须的,而对于有状态的服务,使用 serverless 这就丧失了灵活性,有状态服务需要与存储交互就不可避免的增加了延迟和复杂性。 **延迟** -应用程序中不同组件的访问延迟是一个大问题,我们可以通过使用专有的网络协议、RPC调用、数据格式来优化,或者是将实例放在同一个机架内或同一个主机实例上来优化以减少延迟。 +应用程序中不同组件的访问延迟是一个大问题,我们可以通过使用专有的网络协议、RPC 调用、数据格式来优化,或者是将实例放在同一个机架内或同一个主机实例上来优化以减少延迟。 -而serverless应用程序是高度分布式、低耦合的,这就意味着延迟将始终是一个问题,单纯使用serverless的应用程序是不太现实的。 +而 serverless 应用程序是高度分布式、低耦合的,这就意味着延迟将始终是一个问题,单纯使用 serverless 的应用程序是不太现实的。 **本地测试** -Serverless应用的本地测试困难是一个很棘手的问题。虽然可以在测试环境下使用各种数据库和消息队列来模拟生产环境,但是对于无服务应用的集成或者端到端测试尤其困难,很难在本地模拟应用程序的各种连接,并与性能和缩放的特性结合起来测试,并且serverless应用本身也是分布式的,简单的将无数的FaaS和BaaS组件粘合起来也是有挑战性的。 +Serverless 应用的本地测试困难是一个很棘手的问题。虽然可以在测试环境下使用各种数据库和消息队列来模拟生产环境,但是对于无服务应用的集成或者端到端测试尤其困难,很难在本地模拟应用程序的各种连接,并与性能和缩放的特性结合起来测试,并且 serverless 应用本身也是分布式的,简单的将无数的 FaaS 和 BaaS 组件粘合起来也是有挑战性的。 -## Kubernetes上的Serverless 架构 +## Kubernetes 上的 Serverless 架构 Kubernetes 的蓬勃发展由催生了一系列以它为基础的 Serverless 应用,这是我整理的与 Serverless 相关的开源项目: @@ -248,14 +248,14 @@ Kubernetes 的蓬勃发展由催生了一系列以它为基础的 Serverless 应 ## 总结 -Karl Marx说的好,生产力决定生产关系,云计算的概念层出不穷,其本质上还是对生产关系和生产力的配置与优化,生产者抛开场景意味追求高大上的技术将譬如“大炮打蚊子”,小题大做,鼓励大家为了满足大家的好奇心进行折腾,毕竟那么多科学发现和重大发明都是因为折腾出来的,不想要一匹跑的更快的马,而是发明汽车的福特,捣鼓炸药的诺贝尔,种豌豆的孟德尔……同时还是要考虑将技术产业化(或许能改变生产关系),提高生产力。 +Karl Marx 说的好,生产力决定生产关系,云计算的概念层出不穷,其本质上还是对生产关系和生产力的配置与优化,生产者抛开场景意味追求高大上的技术将譬如 “大炮打蚊子”,小题大做,鼓励大家为了满足大家的好奇心进行折腾,毕竟那么多科学发现和重大发明都是因为折腾出来的,不想要一匹跑的更快的马,而是发明汽车的福特,捣鼓炸药的诺贝尔,种豌豆的孟德尔…… 同时还是要考虑将技术产业化(或许能改变生产关系),提高生产力。 ## 参考 - [CNCF Serverless Whitepaper v1.0](https://gw.alipayobjects.com/os/basement_prod/24ec4498-71d4-4a60-b785-fa530456c65b.pdf) - [Serverless Architectures - Martin Fowler](https://martinfowler.com/articles/serverless.html) -- [Serverless架构综述](http://dockone.io/article/1460) -- [2017年会是Serverless爆发之年吗?](https://www.infoq.cn/news/2017/04/2017-Serverless/) -- [从IaaS到FaaS—— Serverless架构的前世今生](https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/) +- [Serverless 架构综述](http://dockone.io/article/1460) +- [2017 年会是 Serverless 爆发之年吗?](https://www.infoq.cn/news/2017/04/2017-Serverless/) +- [从 IaaS 到 FaaS—— Serverless 架构的前世今生](https://aws.amazon.com/cn/blogs/china/iaas-faas-serverless/) - [Introducing Redpoint's FaaS Landscape](https://medium.com/memory-leak/this-year-gartner-added-serverless-to-its-hype-cycle-of-emerging-technologies-reflecting-the-5dfe43d818f0) - [Serverless Architectures - martinfowler.com](https://martinfowler.com/articles/serverless.html)