
华为2012实验室自研的分布式内核——华为元戎,作为底座支撑了华为终端云通过Serverless快速开发和上线商业服务的应用场景。本书以此为例,系统地剖析了构建Serverless平台的设计思路和实现方案,帮助读者掌握理论知识和实践方法。本书共分10章,内容涵盖了从微服务到Serverless演进的机遇与挑战、基础知识与组件工具、当前生态与发展方向,以及华为元戎创新构建的有状态函数编程模型、高性能函数运行时、高效对接BaaS服务等一系列Serverless核心技术,并配套介绍了云数据库、云存储、云托管等一系列开箱即用的Serverless后端服务。最后,以华为终端云AppGallery Connect平台的翻译服务作为应用案例,完整展示了从技术选型、架构设计、代码示例到实现效果的端到端实践经验,启发读者活学活用Serverless技术。 本书可作为广大开发者、科研人员和信息专业的本科生与研究生等学习Serverless技术的入门读物,也可作为云计算与分布式系统等领域从业人员深入了解Serverless架构的参考书。
序一:Serverless使能应用极简开发和运维 云计算的不断发展,正在快速地改变着传统IT的开发、运维。虚拟机、容器、微服务等技术不断地提升着云计算的能力。 Serverless无服务器计算的出现,为软件开发带来了跨越式的变革。它让开发者只需关注软件产品的功能代码实现,而无须花费精力在计算、存储、网络等基础设施的资源分配与扩缩容上,也不必在软件的部署与运维等领域花精力。这些功能现在由云服务提供商以函数即服务(Function as a Service)和后端即服务(Backend as a Service)的云服务方式提供。Serverless极大地解放了开发者,已成为最有潜力的云计算技术发展方向,也必将成为智能数字化社会的未来开发模式。 随着移动应用、IoT和小程序等的快速发展,Serverless的架构思想和开发方式逐渐被开发者所接受,有望用来支撑应用现代化的新生态。Serverless对开发者的价值主要体现在三个方面: 第一、极简开发实现业务快速上线:在架构层面,函数的粒度相比微服务更小,业务构建更加灵活敏捷;在开发层面,函数计算平台提供了更简单的编程模型,让开发者更聚焦业务逻辑,而BaaS服务有效管理了后端服务的对接与协同。基于Serverless模式,可实现以天为单位完成业务上线。 第二、弹性自运维降低维护成本:对于互联网应用所面临的高可用及突发流量挑战,Serverless可以实现从计算到数据的大规模高并发弹性扩容,帮助开发者屏蔽底层基础设施的运维,降低了开发者的维护负担。 第三、按需收费降低资源使用成本:Serverless按实际使用量付费的特性,不但可以让大中型企业提升资源利用率,而且可以让创业公司降低基础设施投入和减少资源使用成本。 华为公司近年来在Serverless技术方向进行了持续的研发和实践。针对函数计算存在的一系列痛点,如函数缺少有状态支持、冷启动时间长、弹性扩容慢、后端服务及中间件管理复杂等问题,设计、实现了支持函数计算的分布式内核——华为元戎,并将其作为底座支撑华为终端云的云函数服务。在过去的三年中,华为终端云在丰富的业务场景上对函数计算服务进行了大量实践,如搜索、视频、游戏、机器学习、浏览器、全屋智能、运动健康等,并根据业务的反馈对函数计算内核进行了持续优化。截至目前,基于华为元戎的云函数服务在全球华为终端云正式上线,广泛服务于HMS生态的移动应用开发者。 本书系统性地介绍了Serverless的基础知识、关键技术,以及华为元戎在Serverless先进性上的创新探索,提供了华为终端云基于Serverless快速开发和上线翻译业务的端到端完整案例。希望读者通过阅读本书,在深入了解Serverless技术原理和架构的同时,能在业务实践中灵活运用Serverless高效构建应用。 华为云CEO、消费者云服务总裁 张平安 序二:Serverless将成为微服务架构的终极模式 计算范式演进的最终目标是为开发者提供高阶编程抽象,从而将他们从烦琐的工作中解脱出来,更加专注解决业务本身的问题,进而使得开发者可以方便地使用更高效(往往也更复杂)的算法,或者解决更大规模的问题。在过去的数十年中,为了应对应用快速大规模发展的需要,我们的软件开发模式从客户端/服务器模式(C/S),发展到模型/视图/控制(MVC),再到面向服务的架构(SOA),直至当前的微服务;应用的类型也从单体的企业应用,演化到大规模的分布式微服务应用。每一次这样的演进,都给我们的开发范式带来更大的灵活性,更高的可伸缩性,以及由此带来的性能提升,但是却使得开发范式本身变得更加复杂。相比数十年以前的单体应用,开发、调试、部署和维护大规模分布式微服务要复杂和困难许多。这不仅造成开发者的学习曲线相当陡峭,而且开发、维护一个微服务架构往往需要较高的初始成本。这种情况对于中小型应用是非常不友好的,这些应用的开发者在项目初期就需要面临两难的选择:要么在创业之初就承担昂贵的开发成本,要么在发展到一定规模之后承担痛苦的重构。云计算技术发展之初,尽管通过计算资源的虚拟化和池化,降低了我们部署应用的成本,但并没有从本质上解决上述计算范式演进面临的问题。而当前,伴随着企业数字现代化进程的加快,越来越多的应用“为云而生”,因而旨在简化云开发、方便构建分布式应用的新一代“云原生”Serverless技术应运而生了。 在华为2012实验室,有一支长期研究分布式并行和云计算技术的团队。从2017年起,他们就开始对Serverless技术进行深入研究和探索,从架构到理论,再到系统实现。华为元戎 (分布式内核)就是他们在过去四年中不断求索的成果。何为Serverless?从狭义上讲,就是面向“函数”的计算(或称“函数即服务”,FaaS);从广义上讲,还包含函数可以调用的一系列后端服务,如对象存储、数据管理、增长运营等。相比业界类似的Serverless技术,华为元戎首次将“状态”纳入函数计算的概念体系,从而可以方便高效地实现多函数协同的、复杂的有状态服务。同时,华为元戎进一步提出了统一、标准化的后端平台概念(Event Bridge和Service Bridge),不仅方便函数和后端服务的集成,而且有助于Serverless应用的跨云部署。可以说,华为元戎将Serverless技术推进到了一个新的高度。 2020年,通过各方通力合作,华为终端云服务推出基于华为元戎的Serverless解决方案,面向广大的开发者提供开发、构建、增长/运营及质量分析等一系列服务。本书通过对华为Serverless技术剖析,深入浅出地讲解了Serverless的原理、架构、系统实现,以及相应的关键技术,并列举了若干实战示例,帮助读者深入理解和学习Serverless技术。 值得一提的是,Serverless技术本身也是在持续发展的。从某种意义上讲,Serverless将会成为微服务架构的终极模式。那时,应用的模块化、独立部署、可扩缩、高可用和云计算技术可实现高度统一和深度结合。最终通过Serverless技术,云原生应用将会像单机应用一样可以简单便捷地进行开发,同时拥有高性能和高可扩缩的能力,从而彻底解决前文提到的云时代计算范式演进的困局。这种“单机思考,集群并行执行”的体验会深刻地改变云原生应用的开发模式,实现跨越式的生产力变革。正如伯克利RISE Lab主任Ion Stoica教授所言:“Serverless将会成为云时代默认的计算范式,并取代Serverful的计算模式”。我们希望借助本书,为广大的读者和工程技术人员提供一些灵感和启发,共同促进Serverless技术的进一步发展。 华为分布式与并行软件Lab主任 谭焜博士 前言 风起云涌的云计算,在以虚拟化和容器化为技术特征的“资源云化”阶段,极大地简化了基础设施运维。如今,在以Serverless新理念标志的“应用云化”阶段,云计算的目标是进一步简化云开发,屏蔽云端分布式系统和中间件等的复杂性。Serverless不但能使开发者聚焦业务逻辑以实现跨越式生产力变革,而且以极致弹性和免运维等优势帮助应用降低成本、开发增效,已成为云计算“下半场”中各大厂商和开源社区竞相拥抱的战略方向和新兴技术。甚至伯克利在《简化云编程:伯克利视角下的Serverless计算》一文中预言:Serverless将会成为云时代默认的计算范式,并取代Serverful(传统云)计算模式,而其商业模式变革也被生动地类比为从传统的“租车”服务发展为真正随用随付的“计程车”服务。 广大开发者、科研人员和信息专业的本科生与研究生应该如何把握快速发展的Serverless技术浪潮呢?最为行之有效的方法之一是,通过完整剖析一个有代表性的Serverless平台的设计思路和实现方案,来深入学习和掌握Serverless的技术原理与架构精髓,这亦是本书创作的初衷。本书以华为2012实验室研制的分布式内核——华为元戎在Serverless方向的创新探索为例,详细阐述了新一代Serverless编程模型、高性能运行时、后端服务对接等一系列关键技术,并深入剖析了华为终端云基于Serverless实现快速开发和上线翻译业务的端到端商用案例,帮助读者从理论走向系统实践,身临其境地体会如何灵活运用Serverless高效构建应用。 本书的第1章重点介绍了Serverless的基础知识、关键技术和生态现状。通过对第1章的阅读,读者可以了解Serverless如何解决微服务实施的痛点,了解当前典型的Serverless平台(如Lambda)和开源系统(如OpenWhisk)等的差异化设计,以及Serverless的周边组件,如开发与部署框架、事件总线、函数工作流等,进而通过总结当前Serverless系统的不足之处及下一步技术探索方向,为读者设计Serverless应用架构提供启发和技术参考。 本书的第2~5章详细介绍构建新一代Serverless平台的核心技术。第2章以华为的华为元戎为例介绍新一代Serverless平台的设计理念与技术架构,第3~5章分别对一系列核心技术展开剖析。其中,第3章介绍有状态函数编程模型的设计原理和技术实现,并通过生动的场景案例展示有状态函数编程模型的用法与优势。第4章分析如何在函数运行时中优化冷启动、弹性伸缩和函数调度的性能,并提供具体设计方案和范例性能评测。第5章涉及用函数对接各种BaaS服务的通用框架,以华为元戎的Event Bridge和Service Bridge为例分别详解云上各种服务如何规范化触发函数,以及在函数中如何标准化调用各种后端服务,如云存储和云数据库等。 完备的后端服务如云托管、云数据库和云存储等也是Serverless平台必不可少的组成部分,因此第6~8章介绍了华为终端云为用户和开发者提供的配套服务。其中,云数据库服务是一款Serverless化的数据库,提供简单易用的端/云SDK,适用于移动应用、网页和服务器开发,方便应用数据在各个客户端之间、客户端与服务端之间自动保持同步,帮助应用开发者快速构建安全可靠且多端协同的应用程序,从而让应用开发者聚焦业务逻辑,无须关注后端系统的复杂搭建、用户数据的安全保护、多端数据的同步及服务器部署维护等,可显著提高业务构建、部署和运营效率。云存储服务用于图片、视频、文件等内容的上传、下载、归档和备份等。相比于传统的存储服务,云存储服务具有支持断点续传、网络加速、可靠安全和弹性伸缩等特性,更适合移动应用的文件管理。云托管服务为开发者的网页内容提供快速和安全的全球托管服务,支持自定义域名和证书管理,开发者只需提供申请的域名,无须关注CDN加速和SSL配置,通过控制台一键发布版本即可向全球用户分发网站内容。 虽然Serverless平台为开发者提供了一系列开箱即用的云函数和后端服务,但是开发者在尝试用新模式构建实际业务时难免会面临各种挑战,例如,业务函数的划分粒度和策略、由数据变更触发的业务流程执行及事件驱动编程等。鉴于此,本书的第9~10章以华为的实践为例,从技术选型、架构设计到业务函数的划分,再到云函数、云托管、云数据库和云存储服务的搭配使用和代码示例,对基于Serverless技术构建的翻译服务进行端到端完整解析,让读者能够快速学习和全面掌握如何运用Serverless技术高效构建应用。 “众人拾柴火焰高”,感谢华为公司2012实验室中央软件院分布式与并行软件实验室的大力支持,以及华为元戎团队的不懈投入,感谢华为终端云同仁们的倾力贡献和紧密协作。大家共同践行了“研发一代、应用一代”的务实创新精神,促成了本书中的Serverless架构和技术从原型逐步走向商用,未来更加可期!感谢电子工业出版社的宝贵建议与细致工作,这保证了本书的质量和尽早问世。另外,本书部分内容参考了公开资料和网上调研成果,在此也对相关参考文献的作者及同行致以诚挚的谢意。 由于水平有限,加之Serverless技术日新月异且应用领域广泛,书中难免有疏漏和不足之处,恳请广大读者批评指正,以便我们在后续版本中改进,并共同推动Serverless生态的蓬勃发展!
1 Serverless综述 1 1.1 微服务面临的挑战 1 1.2 什么是Serverless 4 1.2.1 Serverless的定义 6 1.2.2 Serverless关键技术 8 1.3 Serverless带来的核心变化 10 1.3.1 Serverless的技术创新 10 1.3.2 Serverless的其他优点 13 1.3.3 Serverless和微服务的差异 14 1.4 Serverless生态现状 15 1.4.1 平台 16 1.4.2 框架 31 1.4.3 事件总线 35 1.4.4 函数工作流 38 1.5 Serverless的挑战与机遇 44 1.6 总结 48 2 新一代Serverless技术 50 2.1 设计理念 50 2.2 技术架构 52 2.2.1 概念模型 52 2.2.2 逻辑架构 53 2.2.3 核心技术创新盘点 55 3 有状态函数编程模型 56 3.1 设计原理 56 3.1.1 状态与有状态函数 56 3.1.2 有状态函数编程模型的实现 59 3.1.3 有状态函数的并发一致性模型 73 3.1.4 有状态函数应用场景 75 3.1.5 有状态函数的使用原则 82 3.2 自走棋游戏编程模型设计示例 83 3.2.1 自走棋游戏介绍 83 3.2.2 函数的实现分析及有状态函数重构 85 3.2.3 有状态函数的效果 94 4 高性能函数运行时 96 4.1 函数运行时的设计和实现 96 4.2 函数冷启动 100 4.2.1 问题分析 100 4.2.2 资源池化 101 4.2.3 代码缓存 102 4.2.4 调用链预测 103 4.3 弹性伸缩 105 4.3.1 弹性策略选择 105 4.3.2 华为元戎弹性方案设计 108 4.4 函数调度 111 4.4.1 调度的关键维度 111 4.4.2 调度策略 113 4.4.3 函数调度最佳实践 115 4.5 性能评测 116 5 高效对接BaaS服务 120 5.1 Event Bridge:BaaS服务连接函数的桥梁 120 5.1.1 Event Bridge基本概念 122 5.1.2 Event Bridge架构 123 5.1.3 CloudEvents 126 5.1.4 Event Bridge的应用 126 5.2 Service Bridge:函数访问BaaS服务的桥梁 130 5.2.1 Service Bridge设计目标 131 5.2.2 Service Bridge架构 134 5.2.3 Service Bridge功能 138 5.2.4 Service Bridge其他使用场景 143 6 云数据库服务 154 6.1 云数据库服务介绍 154 6.1.1 Serverless云数据库——Cloud DB 155 6.1.2 云数据库关键能力 156 6.2 云数据库数据模型 158 6.3 云数据库架构 159 6.3.1 弹性伸缩的多租户架构 159 6.3.2 多租户精细化管理 161 6.3.3 云数据库总结与挑战 162 7 云存储服务 163 7.1 云存储服务介绍 163 7.1.1 Serverless云存储服务 164 7.1.2 Serverless云存储服务关键能力 165 7.2 云存储架构 166 7.2.1 总体架构 166 7.2.2 弹性伸缩架构 167 7.2.3 声明式安全规则 168 7.3 云存储服务总结与挑战 170 8 云托管服务 171 8.1 云托管服务架构 172 8.1.1 系统架构 172 8.1.2 核心功能特性 173 8.2 云托管技术原理 174 8.2.1 自定义域名和证书管理 174 8.2.2 证书的自动更新 175 8.2.3 新的CDN接入 176 9 翻译服务的Serverless架构设计 177 9.1 Serverless平台与翻译服务 177 9.1.1 AppGallery Connect Serverless平台 178 9.1.2 云函数 178 9.1.3 云数据库 179 9.1.4 云存储 180 9.1.5 云托管 181 9.1.6 翻译服务 182 9.2 翻译服务架构技术选型 187 9.2.1 业务特点 187 9.2.2 团队特点 189 9.2.3 技术需求 190 9.2.4 成本需求 191 9.2.5 架构选型 192 9.3 翻译服务Serverless架构 195 9.3.1 功能架构 196 9.3.2 函数划分策略 197 9.3.3 技术架构 204 9.3.4 关键架构质量属性设计 205 10 翻译服务实战开发 217 10.1 基于Serverless技术的翻译服务开发 217 10.1.1 翻译服务网站托管 217 10.1.2 基于云函数开发后台逻辑 224 10.1.3 翻译稿件存储 244 10.1.4 使用云数据库管理数据 246 10.1.5 翻译服务上线效果 251 10.2 传统开发模式与Serverless模式对比 252 10.2.1 研发角色和职责变化 253 10.2.2 不同开发模式对比 254 10.2.3 研发效率对比 255 10.3 Serverless技术演进 257 10.3.1 传统中间件的Serverless化 257 10.3.2 Serverless模型化 258 10.3.3 与遗留系统的对接 258 10.3.4 关键技术瓶颈的突破 259 10.3.5 Serverless低代码平台 259