
传统的微服务应用正在经历着云原生技术的“洗礼”。随着该领域技术的不断变革与完善,以原生方式开发基于云的微服务成了降本提效的重要手段。FreeWheel 核心业务系统开发团队在多年的实践中探索出了一条云原生微服务应用构建之路。本书基于这些实践经验,从设计、开发到测试、部署,介绍了团队如何利用云原生技术为应用开发的全生命周期赋能。从架构技术选型到具体工程实践,书中内容理论联系实际,较为全面地剖析了容器落地、服务网格、无服务器计算、持续集成和持续部署等核心云原生技术,适合关注微服务、云原生技术的架构师、工程师及技术决策者阅读。
前 言 迈向云原生 作为一位技术领域的老兵,我在过去近20年的时间里见证了整个软件行业在技术架构上发生的翻天覆地的变化。 我依稀记得,自己在2004年刚刚加入IBM中国软件研发中心时,整个团队都专注于构建基于SOA(面向服务的架构)的项目和解决方案。当时的SOA还很“重”,底层的技术实现强依赖于J2EE、Web Service、SOAP等技术。对开发人员而言学习成本较高,实现和落地方案相对复杂,客户也需要花费一定时间去学习如何使用系统。另外,当时的技术栈对于分布式系统设计中需要着重考量的非功能性需求(如性能、可扩展性、安全性等)的支持也相对欠缺,这些非业务能力需要在设计阶段就被考虑并最终实现出来,任务繁重。 尽管如此,SOA这种在当时领先的系统架构设计理念还是给整个软件行业带来了很多启示和思考。“星星之火,可以燎原”,作为架构演进过程中不可或缺的一员,SOA对随后出现的各种致力于解耦软件系统复杂性的新技术、新架构的诞生起到了重要的推动作用。 现在,微服务、云原生技术几乎成为整个软件开发行业的风向标,很多公司、组织和团队都正在或计划将自己的业务迁移到云上,并基于微服务技术理念对系统架构进行改造升级。其实,不管是SOA还是微服务,最终的目的都是解耦复杂的系统设计,以“服务”的方式来定义和封装模块化的业务功能,从而实现系统设计、开发和维护的独立性。 然而凡事都有两面性,在我们享受微服务、云原生技术给系统设计开发工作带来便利的同时,同样也需要面对新技术带来的一系列挑战,例如分布式事务、服务治理等,而这些还只是构造一个强健、完备的微服务架构所要面临问题中的一小部分。究其根源,软件设计的本质即在各种制约因素之下小心翼翼地权衡利弊。银弹未现,取舍为真,在软件架构设计的道路上,我们仍需上下求索,朝夕不倦。 FreeWheel作为全球互联网视频广告技术的引领者和全美视频广告技术创新的奠基者,其业务和技术复杂度在微服务应用领域具有很强的代表性。从2016年开始,我们团队致力于技术架构的改造和升级,通过近4年的努力,团队基于微服务、云原生的理念重新设计并实现了整个广告核心业务系统。在技术架构升级的过程中,我们也不可避免地遇到了很多未知的技术问题和挑战,团队如涉世未深的少年,跌跌撞撞,消除了困惑与迷茫,不断探索并一路前行至今,也因此积累了很多宝贵的经验。 书中所有内容正是来源于我们在实际工作中的实践总结。参与撰写书中各章节的同事也都在一线负责具体的设计和开发工作,对技术细节有深入的了解。书中文字可能朴实无华,但字字珠玑,相信对致力于微服务架构设计的开发人员会大有裨益。 本书特色 本书具有以下特色。 (1)实践出真知 作为冲锋在第一线的工程师,我们团队深知真实案例对读者的重要性,也清楚实践对于技术学习的重要性。因此,书中所述案例大都来自真实发生的应用场景,相应的解决方案也是针对该场景的落地实践。这也是本书以“最佳实践”命名的原因。当然,我们也不能轻视理论学习的重要性,通过文献综述和知识溯源,团队力求以最准确的方式描述技术概念和底层原理,使实践有理可依,有法可循。 (2)全生命周期覆盖 不管基于何种架构风格来构建系统,都必然要经历从设计到部署上线的完整流程,微服务应用也如此。特别是在云原生技术的加持下,开发方式和设计思路在技术选型、实现、部署等多方面都会有所不同。因此,我们没有以离散的、无序的方式讲述这些技术,而是基于开发流程,循序渐进地将知识点融入整个软件开发生命周期,以带给读者合理和流畅的阅读体验。从技术选型到服务划分,从敏捷开发到代码管理,从服务治理到质量保证,我们在每一个阶段剖析相应的技术和实践,告诉读者如何将云原生技术融入软件开发生命周期的每个环节。 (3)个性化案例分享 重复性的记叙、随处可得的显性知识会让写作变得苍白,让读者失去翻书的兴趣。本书的一大特色就是基于团队自身经验总结了许多个性化的实践方法,比如用于构建无服务器计算的低代码开发平台、虚拟团队中台搭建法、有趣的Bug Bash活动等。相信这些会给读者耳目一新的感觉,我们也希望这些个性化案例能帮助各位读者优化自己的开发方式。 本书内容 本书主要介绍了基于云原生技术构建微服务应用的工程实践,全书共9章,每章的内容简介如下。 第1章 云原生时代下的微服务 云原生技术的出现改变了微服务应用的构建方式,传统的开发方式无法很好地与云环境适配。本章将从微服务的特性讲起,深入剖析云原生的概念和核心技术,探索在云原生时代下微服务应用需要以何种改变来应对技术洪流的挑战,总结从传统微服务转变到云原生应用的开发过程。 第2章 微服务应用设计方法 设计是软件开发生命周期中最重要的活动之一。本章我们将基于团队的实践经验,与读者探讨如何设计一个微服务应用。我们将从应用的架构选型谈起,介绍架构、通信层、存储层、业务层的解决方案,同时还会基于实际案例分析如何对遗留系统进行微服务改造。 第3章 服务开发与运维 “实现”是将软件设计的结果转化为软件产品的过程,是软件开发的实际产出。本章将围绕服务开发与运维,基于团队的工程实践,介绍如何通过Scrum敏捷开发方法完成整个开发过程,并介绍我们为了提高开发效率而构建的服务管理与运维平台。 第4章 微服务流量管理 服务网格是云原生时代下进行流量管理的首选方案。通过声明式配置,应用就能具有控制流量的能力,并且该配置对应用透明。本章将基于我们团队在服务网格方面的实践,为读者详细介绍如何使用Istio为微服务应用提供流量管理能力。 第5章 分布式事务 随着软件系统从单体时代迈向微服务和云原生时代,以及数据库选型呈现去中心化、异构化的趋势,单体应用上的本地事务会转变为分布式事务,这给数据一致性需求带来了挑战。本章将围绕分布式事务这一技术方向,介绍我们团队使用Saga模式进行的实践。 第6章 无服务器架构 通过无服务器计算技术构建弹性伸缩应用的优势越来越明显。作为一种新兴的应用架构,无服务器架构的核心概念是什么,它有哪些区别于传统架构的特点,它的优势和应用场景是什么,它能为应用的构建带来哪些变革?本章将对这些问题进行一一解答。 第7章 服务的可观察性 使用微服务架构并迁移上云后会面临诸多挑战,例如,查看应用中各个服务的状态,快速定位并解决线上问题,以及监控服务间的调用关系。构建具有可观察性的应用是保障服务质量的重要因素。本章将介绍服务可观察性的定义与应用,以及团队在该领域的落地实践。 第8章 质量保证实践 软件质量是贯穿于软件开发生命周期各个阶段的重要概念,在很大程度上决定了系统的可用性和用户体验。在这一章中,我们将为读者介绍在架构迁移过程中所积累的一些与质量保证相关的实践经验,讲述团队如何通过完善的测试技术和混沌工程来构建云原生时代下的质量保证体系。 第9章 持续集成和持续部署 持续集成和持续部署是构建云原生应用的必要条件,我们的团队在这方面积累了大量的经验。在这一章中,我们将从持续集成的自动化触发、差异化执行、产物归档等方面谈起,介绍经过微服务改造后的产品发布规划、云原生部署框架,以及持续部署对微服务应用全生命周期的支持。
目 录 第 1 章 云原生时代下的微服务 ............................................................................................... 1 1.1 从微服务谈起 ........................................................................................................................ 1 1.1.1 微服务架构的关键特性 ............................................................................................. 2 1.1.2 微服务的取舍 ............................................................................................................. 6 1.2 云原生应用 ............................................................................................................................ 9 1.2.1 什么是云原生 ............................................................................................................. 9 1.2.2 云原生技术 ............................................................................................................... 12 1.2.3 云原生应用的特点 ................................................................................................... 15 1.3 从微服务到云原生 .............................................................................................................. 17 1.3.1 非功能性需求的调整 ............................................................................................... 17 1.3.2 治理方式的改变 ....................................................................................................... 18 1.3.3 部署和发布的改变 ................................................................................................... 19 1.3.4 从微服务应用到云原生应用 ................................................................................... 20 1.4 本章小结 .............................................................................................................................. 21 第 2 章 微服务应用设计方法................................................................................................. 22 2.1 应用架构设计 ...................................................................................................................... 22 2.1.1 服务架构选型 ........................................................................................................... 22 2.1.2 服务通信策略 ........................................................................................................... 27 2.1.3 存储层设计和选型 ................................................................................................... 35 2.2 遗留系统改造 ...................................................................................................................... 37 2.2.1 绿地与棕地 ............................................................................................................... 38 2.2.2 绞杀者模式 ............................................................................................................... 39 2.3 业务逻辑设计 ...................................................................................................................... 43 2.3.1 拆分服务 ................................................................................................................... 43 2.3.2 设计 API ................................................................................................................... 50 2.4 本章小结 .............................................................................................................................. 54 第 3 章 服务开发与运维 ........................................................................................................ 55 3.1 敏捷开发流程 ...................................................................................................................... 55 3.1.1 从瀑布模型到敏捷开发 ........................................................................................... 56 3.1.2 基于 Scrum 的敏捷实践 ........................................................................................... 58 3.2 搭建运行环境 ...................................................................................................................... 64 3.2.1 开发环境 ................................................................................................................... 64 3.2.2 测试环境 ................................................................................................................... 65 3.2.3 预发布环境 ............................................................................................................... 66 3.2.4 生产环境 ................................................................................................................... 67 3.3 代码管理 .............................................................................................................................. 67 3.3.1 Git 分支管理 ............................................................................................................. 67 3.3.2 使用 Sonar 进行代码检查 ........................................................................................ 71 3.3.3 代码评审 ................................................................................................................... 75 3.3.4 代码提交与合并 ....................................................................................................... 76 3.4 低代码开发平台 .................................................................................................................. 77 3.4.1 低代码与开发平台 ................................................................................................... 77 3.4.2 低代码开发平台实践 ............................................................................................... 78 3.5 服务管理与运维平台 .......................................................................................................... 83 3.5.1 平台要解决的问题 ................................................................................................... 83 3.5.2 平台架构 ................................................................................................................... 83 3.5.3 平台功能模块 ........................................................................................................... 85 3.6 服务中台化 .......................................................................................................................... 87 3.6.1 什么是中台 ............................................................................................................... 87 3.6.2 中台的构建之路 ....................................................................................................... 88 3.7 本章小结 .............................................................................................................................. 93 第 4 章 微服务流量管理 ........................................................................................................ 94 4.1 云原生时代的流量管理 ...................................................................................................... 94 4.1.1 流量类型 ................................................................................................................... 95 4.1.2 服务网格 ................................................................................................................... 96 4.2 服务发现 .............................................................................................................................. 98 4.2.1 传统服务发现上云后的问题 ................................................................................... 98 4.2.2 Kubernetes 的服务发现机制 .................................................................................... 99 4.3 使用 Istio 服务网格进行流量管理 ................................................................................... 102 4.3.1 核心自定义资源 ..................................................................................................... 102 4.3.2 基于 Istio 的流量管理实践 .................................................................................... 112 4.3.3 常见落地问题与调试 ............................................................................................. 120 4.4 使用 Istio 提升应用的容错能力 ....................................................................................... 127 4.4.1 熔断器 ..................................................................................................................... 128 4.4.2 超时和重试 ............................................................................................................. 131 4.5 本章小结 ............................................................................................................................ 134 第 5 章 分布式事务 ............................................................................................................. 135 5.1 分布式事务的挑战 ............................................................................................................ 135 5.1.1 从事务到分布式事务 ............................................................................................. 135 5.1.2 ACID:传统意义上的事务约束............................................................................ 137 5.1.3 CAP:分布式系统的挑战 ..................................................................................... 138 5.1.4 BASE:高可用的代价 ........................................................................................... 139 5.1.5 写顺序 ..................................................................................................................... 139 5.2 分布式事务框架的方案选型 ............................................................................................ 140 5.2.1 现有研究与实践 ..................................................................................................... 140 5.2.2 分布式事务框架的设计目标 ................................................................................. 143 5.2.3 选择 Saga ................................................................................................................ 144 5.2.4 引入 Kafka .............................................................................................................. 145 5.2.5 系统架构 ................................................................................................................. 148 5.2.6 业务流程 ................................................................................................................. 148 5.3 基于 Saga 和 Kafka 的分布式事务落地实践 ................................................................... 149 5.3.1 Kafka 并行消费模型的改进 .................................................................................. 149 5.3.2 部署细节 ................................................................................................................. 151 5.3.3 系统可用性分析 ..................................................................................................... 152 5.3.4 线上问题及处理 ..................................................................................................... 152 5.4 本章小结 ............................................................................................................................ 155 第 6 章 无服务器架构 ......................................................................................................... 157 6.1 什么是无服务器架构 ........................................................................................................ 157 6.1.1 无服务器架构的定义 ............................................................................................. 157 6.1.2 无服务器架构的发展 ............................................................................................. 158 6.1.3 无服务器架构的优势 ............................................................................................. 160 6.1.4 无服务器架构的不足 ............................................................................................. 161 6.2 无服务器架构应用 ............................................................................................................ 163 6.2.1 构建 Web API 后端服务 ......................................................................................... 163 6.2.2 构建数据编排器 ..................................................................................................... 165 6.2.3 构建定时任务 ......................................................................................................... 166 6.2.4 构建实时流处理服务 ............................................................................................. 167 6.3 无服务器架构的落地实践 ................................................................................................ 169 6.3.1 为什么选择 AWS Lambda ..................................................................................... 169 6.3.2 大量数据的导入和处理 ......................................................................................... 171 6.3.3 日志数据的采集和处理 ......................................................................................... 179 6.4 本章小结 ............................................................................................................................ 190 第 7 章 服务的可观察性 ...................................................................................................... 191 7.1 什么是可观察性 ................................................................................................................ 191 7.1.1 可观察性的定义 ..................................................................................................... 191 7.1.2 可观察性的三大支柱 ............................................................................................. 192 7.1.3 可观察性与监控的联系与区别 ............................................................................. 193 7.1.4 社区产品现状及技术选型 ..................................................................................... 194 7.2 云原生下的日志解决方案 ................................................................................................ 195 7.2.1 日志分类与设计 ..................................................................................................... 195 7.2.2 云原生日志收集方案的演进 ................................................................................. 206 7.2.3 使用 Kibana 展示日志 ............................................................................................ 212 7.3 分布式追踪 ........................................................................................................................ 222 7.3.1 分布式追踪系统的核心概念 ................................................................................. 222 7.3.2 基于 Jaeger 的追踪方案 ......................................................................................... 223 7.4 度量指标 ............................................................................................................................ 233 7.4.1 利用 Prometheus 收集度量指标 ............................................................................ 233 7.4.2 使用 Grafana 展示度量指标 .................................................................................. 241 7.5 监控与告警设计 ................................................................................................................ 242 7.5.1 监控平台构建实践 ................................................................................................. 242 7.5.2 告警系统的搭建 ..................................................................................................... 254 7.6 本章小结 ............................................................................................................................ 258 第 8 章 质量保证实践 ......................................................................................................... 259 8.1 质量保证体系 .................................................................................................................... 259 8.1.1 质量挑战 ................................................................................................................. 260 8.1.2 测试策略 ................................................................................................................. 260 8.1.3 构建质量保证体系 ................................................................................................. 262 8.2 测试实践 ............................................................................................................................ 265 8.2.1 单元测试与 mock 实践 .......................................................................................... 266 8.2.2 基于 Godog 的集成测试实践 ................................................................................ 272 8.2.3 基于 Cypress 的端到端测试实践 .......................................................................... 277 8.2.4 测试自动化 ............................................................................................................. 280 8.3 混沌工程 ............................................................................................................................ 285 8.3.1 混沌工程的核心理念 ............................................................................................. 285 8.3.2 如何运行混沌实验 ................................................................................................. 292 8.3.3 系统资源类故障注入实验 ..................................................................................... 297 8.3.4 基于服务网格的网络流量故障注入方法 ............................................................. 306 8.4 类生产环境的质量保证 .................................................................................................... 311 8.4.1 线上服务的监测与分析 ......................................................................................... 311 8.4.2 Bug Bash 实践 ........................................................................................................ 313 8.4.3 Post-release Check 实践 .......................................................................................... 317 8.4.4 灾备策略与实践 ..................................................................................................... 319 8.5 本章小结 ............................................................................................................................ 322 第 9 章 持续集成和持续部署............................................................................................... 323 9.1 基于 Git 的持续集成 ......................................................................................................... 323 9.1.1 自动触发流水线 ..................................................................................................... 324 9.1.2 流水线差异化与统一协作 ..................................................................................... 331 9.1.3 流水线产物存储规划 ............................................................................................. 334 9.2 基于 Helm 的持续部署 ..................................................................................................... 337 9.2.1 部署规划 ................................................................................................................. 338 9.2.2 不同环境下多集群的部署框架 ............................................................................. 339 9.2.3 云原生的支持和任务维护 ..................................................................................... 345 9.3 基于 Kubernetes 的持续部署实践 .................................................................................... 348 9.3.1 Pod 资源配额及水平扩缩 ...................................................................................... 349 9.3.2 服务上下线流程和故障分析 ................................................................................. 351 9.4 本章小结 ............................................................................................................................ 354