
拥抱“云”,更多指的是如何设计你的应用程序,而不是你在哪里部署它们。本书是一本架构指南,指导你如何让应用程序在动态的、分布式的、虚拟的云世界中茁壮成长。本书介绍了云原生应用程序的多种思维模型,以及支持其构建的模式、实践和工具,同时提供了一些实际案例和专家建议,帮助你更好地开发和使用应用程序、数据、服务、路由等。本书分为两部分。第 1 部分定义了云原生的上下文环境,并展示了软件部署环境的特点。第2 部分深入探讨了云原生模式,包括请求 / 响应、事件驱动、断路器等。无论你是否有云原生的开发经验,通过本书提供的众多模式,一定可以更好地理解和掌握云原生开发。
译者序 当我们讨论云原生时,究竟在讨论什么?这些年来我一直在思索这个问题,大家的观点可能不尽相同。三年前从我翻译了第一本云原生领域的图书开始,陆续参与翻译和创作了一系列云原生作品,同时通过对云原生领域的开源项目、社区、基金会、应用云化过程的参与和观察,我得出了下面的结论 :云原生是一种行为方式和设计理念,究其本质,凡是能够提高云上资源利用率和应用交付效率的行为或方式都是云原生的。云计算的发展史就是一部云原生化的历史。云原生是云计算适应社会分工的必然结果,将系统资源、底层基础设施和应用编排交由云平台管理,让 开发者专注于业务逻辑,这不正是云计算长久以来孜孜以求的吗?云原生应用追求的是快速构建高容错性、弹性的分布式应用,追求极致的研发效率和友好的上线与运维体验,随之云原生的理念应运而生,它们天生适合部署在云上,可以最大限度地利用云计算带来的红利。 在此之前我曾翻译过几本云原生主题的图书,其中 Cloud Native Go 的作者 Kevin Hoffman,《云原生 Java》的作者 Josh Long,他们都来自 Pivotal 或曾在Pivotal 工作多年,当看到此书时,我惊奇地发现,作者 Cornelia Davis 同样来自这家公司,Pivotal 真可谓是云原生的“黄埔军校”。此书的内容跟以往的云原生图书有所不同,对于模式的梳理标新立异,因此我立即联系了电子工业出版社的张春雨编辑。经他了解到张若飞正在翻译此书,此前我与他合作翻译了《云原生 Java》,本书算是我跟他的第二次合作,他翻译图书的精准和高效着实让我佩服,我们各自 翻译了本书一半的内容。 人人都在讨论云原生,但是究竟如何实现却莫衷一是。本书主要关注的是云原生应用的数据、服务与交互,即应用层面的设计模式,这些模式穿插于本书第 2 部分的各个章节中,基本覆盖了云原生应用的各个方面,并将理论与实践结合,带领读者使用 Java 实现了一个云原生应用。 同时还要感谢 ServiceMesher 社区、云原生社区的成员及志愿者们对于云原生在中国的发展做出的贡献,你们的鼓励和支持是我在云原生领域不断努力和探索的动力。本书的翻译难免有一些纰漏,还望读者指正。 宋净超 2020 年 7 月 4 日于北京 序 六年来,我有幸与 Nicole Forsgren 和 Jez Humble 合作编写了《DevOps 现状报告》(State of DevOps Report),该报告收集了来自三万多名受访者的数据。这份报告给我的最大启示之一就是软件架构的重要性 :高效能团队的架构能够使开发人员快速、独立、安全、可靠地开发、测试和部署软件,从而为客户不断创造价值。 几十年前,我们可以开玩笑地说,软件架构师只擅长使用 Visio、绘制 UML 图表以及制作没人看的 PowerPoint 幻灯片,但今非昔比,大量企业在市场上的成败取决于它们所开发的软件。应该说,没有什么比它们每天必须使用的架构更能影响开发人员的日常工作了。 本书填补了理论与实践之间的一段空白。事实上,我认为只有少数人可以将它写出来。Cornelia Davis 是极其合适的人选,她曾在攻读博士学位时学习了编程语言,对函数式编程和不可变性产生了浓厚的兴趣,拥有数十年大型软件系统的开发经验,并且帮助大型软件企业获得过巨大的成功。 在过去的五年中,我多次联系她寻求帮助和建议,我们经常讨论有关诸如CQRS 和事件源模式、LISP 和 Clojure 语言(我最喜欢的编程语言)、命令式编程和状态的危险性,甚至像递归这样简单的事情。 本书的亮点在于 Cornelia 不仅仅从模式入手。她从模式的基本理论开始,然后通过论证(有时通过逻辑或者流程图)来证明它们的有效性。除了理论本身,她还通过 Java Spring 框架一个一个地实现了这些模式,以便让你更好地理解这些知识。 我发现,这本书兼具娱乐性和教育性,并且使我对大量以前只是略知皮毛的知识有了更深入的了解。我现在致力于通过 Clojure 语言来实现她的示例,以证明我可以将这些知识付诸实践。 本书可能会让你联系起一些令人感到兴奋甚至惊讶的概念。对我而言,其中一个概念就是无论是面向切面的编程(AOP)、Kubernetes 的挎斗(sidecar)模式,还是 Spring Retry 注入,都是为了统一处理横切关注点(cross-cutting concerns)。 希望你能像我一样喜欢这本书! — Gene Kim,研究员以及 The Phoenix Project、The Devops Handbook 和 Accelerate 的联合作者 前言 我的职业生涯始于图像处理。我曾在休斯飞机公司(Hughes Aircraft)的导弹系统部工作,研究红外图像处理,处理边缘检测和帧与帧之间的关联。(这些功能在如今的手机应用上无处不见,这都要归功于 20 世纪 80 年代的研究!) 我们在图像处理中常用的计算之一是标准差。我从来不羞怯于提出问题,而我早年经常问的一个问题就是关于标准差的。我的一个同事总是会写下标准差的公式。真见鬼,三个月过去了,这个公式我大概已经写了六遍。 我真正想问的是 :“在这种情况下,标准差究竟意味着什么?”实际上,标准差是用来定义什么是“正常的”,这样我们可以寻找离群值。如果我正在计算标准差,然后发现了超出正常值范围的情况,那么是否表示我的传感器可能出现了故障,并且我需要舍弃这一帧图像,还是表示它暴露了潜在敌人的行动? 所有这些与云原生有什么关系?没有。但这一切与模式有关。正如你所见,我虽然知道这个模式(标准差计算),但是由于当时缺乏经验,所以不知道何时以及为什么要使用它。 在本书中,我将向你介绍云原生应用程序的多种架构模式,是的,我将向你展示许多的“公式”,但是为了说明何时及为何使用这些模式,我会在介绍上下文环境上花费更多的时间。实际上,模式通常并不那么困难(例如,第 9 章介绍的请求重试模式很容易实现),困难的是决定何时应用某个模式,以及如何正确地应用该模式。 在应用这些模式时,你需要了解很多的上下文环境,并且坦率地说,这些环境有可能很复杂。 那么上下文环境是什么呢?从根本上来说,它是一个分布式系统。当我三十多年前开始工作时,并不认识很多从事分布式系统工作的人,在大学也没有学过分布式系统的课程。没错,虽然人们在这个领域中工作,但说实话,这是一个非常小的领域。 如今,绝大多数软件都是分布式系统。软件的某些部分在浏览器中运行,而另一些部分在服务器上运行,或者我敢说,在一大堆服务器上运行。这些服务器可能在你公司的数据中心运行,也可能在俄勒冈州普莱恩维尔的一个数据中心运行,或者同时在两地运行。所有这些都是通过网络(可能是互联网)进行通信的,而且软件的数据也很可能是分布式的。简单地说,云原生软件是一个分布式的系统。此外,事情在不断变化 — 服务器正在不断下架,网络经常中断(即便是非常短暂的中断),存储设备可能会在没有任何警告的情况下崩溃 — 即使是这样,我们依然希望软件能够继续正常运行。这是一个非常具有挑战性的环境。 但是这完全是可控制的!本书的目的就是帮助你理解这种上下文环境,并为你提供一些工具,让你成为一名精通云原生的架构师和开发人员。 我从来没有像现在这样感受到如此剧烈的脑力激荡。这在很大程度上是因为技术领域正在发生重大变化,而云原生就是这个变化的核心。我绝对热爱我所从事的工作,我希望每个人,尤其是你,也能像我一样喜欢编写软件。这就是我编写这本书的原因 :我想与你分享整个行业正在面临的那些疯狂而又酷炫的问题,帮助你踏上解决这些问题的旅程。我很荣幸有机会与你一起踏上云原生之旅,哪怕是在其中扮演一个小小的配角。 我的云原生之旅始于 2012 年,当时我的老板 Tom Maguire 让我开始研究 PaaS(平台即服务)。作为 EMC CTO 办公室架构组的一员,关注新兴技术对我们来说并不新鲜 — 但是,这一次终于成功了!我将永远感激 Tom 给了我探索的动力和空间。 到 2013 年年初,我已经学到了足够多的东西,预见到未来我会在这个领域工作,而随着 Pivotal Software 公司的创立,我有了一个工作的地方。首先,我要感谢 Elisabeth Hendrickson,感谢她在我还在 EMC 的时候就邀请我参加 Cloud Foundry会议,感谢她把我介绍给 James Watters。我经常说,我做过的最好的职业选择是为James 工作。我感谢他给了我很多机会,感谢他的信任让我全身心投入工作,感谢与他大量的深度对话让彼此共同理解了什么是云原生,以及感谢我们之间六年的深厚友谊。 我很感恩自从 Pivotal 公司成立我就加入了公司,和这么多聪明、敬业、善良的同事一起学习。我要感谢 Elisabeth Hendrickson、Joshua McKenty、Andrew Clay-Shafer、Scott Yara、Ferran Rodenas、Matt Stine、Ragvender Arni,以及其他许多人(如果我漏掉了任何人,请原谅)帮助我学习,并与我一起度过我人生中最美好的六年! 我还要特别感谢 Pivotal 公司,特别是 Ian Andrews 和 Kelly Hall,感谢他们赞助了《云原生基础》(Cloud-Native Foundations)迷你书。 我从许多同行那里学到了很多知识,无法一一列举,但是感谢每一个人。我特别想感谢 Gene Kim。我还记得我们见面的那天晚上(再次感谢 Elisabeth Hendrickson,感谢她促成了我们那次会面),我立刻意识到,我们将合作很长一段时间。我感谢Gene 给了我在 DevOps 企业峰会(DevOps Enterprise Summit)上与他共事的机会,通过那次峰会,我认识了许多在不同公司工作的创新人才。我感谢他为我带来了一些鼓舞人心、让我开阔思路的对话。我感谢他为这本书撰写了序。 当然,我要感谢 Manning 出版社给我写这本书的机会,首先感谢 Mike Stephens,他帮助我将对写书的好奇变成了真正的投入。我非常感谢我的开发编辑 ChristinaTaylor。她带着一个初出茅庐的作者,从一个长达 20 章、杂乱无章的想法,以及一个 70 多页的草稿开始,帮助我写出了一本结构清晰、内容翔实的书。她陪伴了我两年半,在我绝望的时候鼓励我,在我成功的时候赞美我。我还要感谢制作团队,包括 Sharon Wilkey、Deirdre Hiam、Neil Croll、Carol Shields 和 Nichole Beard,他们让本书最终得以出版。感谢我的审校 — Bachir Chihani、Carlos Roberto、VargasMontero、David Schmitz、Doniyor Ulmasov、Gregor Zurowski、Jared Duncan、JohnGuthrie、Jorge Ezequiel Bo、Kelvin Johnson、Kent R. Spillner、Lonnie Smetana、Luis Carlos Sanchez Gonzalez、Mark Miller、Peter Paul Sellars、Raveesh Sharma、Sergey Evsikov、Sergio Martinez、Shanker Janakiraman、Stefan Hellweger、Win Oo 和 Zorodzayi Mukuya。你们的反馈对本书的内容有重要影响。 最重要的是,我要感谢我的丈夫 Glen 和儿子 Max,感谢他们对我的耐心、鼓励和始终不渝的信任。相比任何其他人,他们是让这一切成为可能的两个人,他们不仅在过去近三年的时间里给予了我支持,而且在之前的几十年里帮助我奠定了基础。我对你们俩表示深深的感激。而你,Max,也和我一样爱上了计算机,并允许我成为你旅程的旁观者,这趟旅程甜美得好像是巧克力蛋糕上的双份巧克力糖衣 — 谢谢你! 谁应该读这本书 拥抱“云”,更多指的是如何设计你的应用程序,而不是你在哪里部署它们。本书是一本指导如何开发出健壮的应用程序的指南,这些应用程序可以在动态的、分布式的、虚拟的云世界中茁壮成长。本书介绍了云原生应用程序的思维模型,以及支持其构建的模式、实践和工具。在这本书中,你会发现一些实际案例和专家建议,它们可以帮助你开发和使用应用程序、数据、服务、路由等。 从根本上说,这是一本架构方面的书,其中包含了支持架构设计的相关代码示例。你会发现,我经常会在书中提到当前模式与我们过去做事方式之间的差异。不过,你并不需要拥有以往架构模式的经验或者知识。因为我不仅讨论了模式本身,而且还讨论了它们的动机,以及应用它们时上下文环境之间的细微差别,所以不管你在软件行业工作了多少年,都应该能够从本书中发现重要的价值。 尽管书中出现了许多示例代码,但这不是一本编程书,它不会教你如何编程。示例代码是用 Java 编写的,但是如果你有任何其他编程语言的使用经验,都应该能够轻松理解它们。对客户端 / 服务器交互(尤其是通过 HTTP 通信)有基本的了解,会很有帮助,但这不是必需的。 关于本书 本书是如何组织的:路线图 本书一共 12 章,分为两部分。 第 1 部分定义了云原生的上下文环境,并展示了软件部署环境的如下特点。 第 1 章定义了什么是云原生,并将其与云计算区分开来。本章提供了一个思维模型,并且在此基础上构建出后面的多种模式,这种思维模型的实体是应用 / 服务、服务之间的交互,以及数据。 第 2 章介绍了云原生的运维 — 这些模式和实践用来保证生产环境中的云原生软件,当遇到不可避免的故障时如何继续运行。 第 3 章介绍了云原生平台,这是一个开发和运行时环境,能够支持甚至实现本书第 2 部分中的许多模式。尽管对你来说理解所有这些模式很重要,但是你不必自己实现所有的模式。 第 2 部分深入探讨了云原生模式。 第 4 章与云原生的交互有关,还涉及了一些数据,介绍了基于事件驱动的通信模式,来代替熟悉的请求 / 响应的通信模式。尽管后者在当今的大多数软件中几乎无处不在,但是事件驱动常常能够为高度分布式的云原生软件提供 巨大的优势,当你学习后续其他模式时,要同时考虑这两种通信模式。 第 5 章和云原生应用 / 服务及其与数据的关系有关,介绍了如何为应用程序部署(通常是大规模的)冗余实例,为什么及如何使它们成为无状态的,以及如何将它们与指定的有状态服务进行关联。 第 6 章与云原生应用 / 服务有关,介绍了在一个大规模分布式基础设施中部署大量实例时,如何统一维护应用程序的配置。这一章还介绍了当应用程序的环境不断发生变化时,如何正确地应用配置。 第 7 章与云原生应用 / 服务有关,介绍了应用程序的生命周期和大量的零停机时间升级实践,包括滚动升级和蓝 / 绿升级。 第 8 章与云原生交互有关,它既关注应用程序如何找到它们需要的服务(服务发现),即使这些服务在不断发生变化,也关注请求最终如何找到正确的服务(动态路由)。 第 9 章与云原生交互有关,主要关注交互的客户端。在解释了为什么需要交互冗余,并且介绍了重试(请求失败后重新发送请求)之后,这一章还介绍了可能会导致应用程序重试的一些问题,以及如何避免这些问题的方法。 第 10 章与云原生交互有关,主要关注交互的服务端。即使发起交互的客户端是可靠的,服务也必须保护自己不被误用和滥用。这一章介绍的内容包括断路器和 API 网关。 第 11 章与应用程序和交互有关,介绍了如何观察软件中各个分布式系统的行为和性能。 第 12 章与数据有关,它对组成云原生软件的服务之间的交互有重要的影响。这一章介绍了几种将单体数据库分解为分布式数据结构的模式,并最终回到了本书第 2 部分开始介绍的事件驱动模式。 云原生应用程序的各种模式 以下列举的模式大致按照它们在本书中出现的顺序排列 : 请求 / 响应模式 — 这是一种服务间的通信协议,一个客户端会向某个远程服务发起一个请求,并且在大多数情况下希望接收到一个响应。这种通信可以是同步的,也可以是异步的,通常基于 HTTP 完成。 事件驱动模式 — 这是一个分布式系统中各个实体之间进行事件通信的协议,在一个云原生的应用程序中,各个服务之间通过这些事件来保持最新的状态。 CQRS(Command Query Responsibility Segregation,命令查询职责分离)模式 — 在这种模式中,对某个领域实体的查询处理(读)与命令处理(写)是分开的。 多服务实例模式 — 通过部署应用程序 / 服务的多个实例来保证弹性、可伸缩性及云原生的运维实践。 水平伸缩模式 — 通过创建额外的应用程序实例来增加某个服务的容量。 无状态服务模式 — 应用程序 / 服务不会被后续的服务调用,在内存或者本地磁盘中不会存储任何状态。 有状态服务模式 — 指用来持久化状态的服务,例如,数据库和消息队列。这些服务用来为无状态服务提供持久化数据。 通过环境变量配置应用程序的模式 — 在应用程序启动时,通过环境变量将参数值注入应用程序。 配置服务模式 — 这是一个(有状态的)服务,用来将配置参数传递给多个应用程序的实例,以确保各个实例的行为是一致的。 配置即代码模式 — 通过对配置文件进行版本控制来管理配置。 零停机时间升级模式 — 一种让应用程序 / 服务在升级所有实例时仍然可以提供完整功能的方法。 滚动升级模式 — 一种通过分批次、增量式升级部分服务实例,来实现应用程序整体零停机时间升级的技术。 蓝 / 绿升级 — 一种通过部署一组新的应用程序实例,然后全部切换到这些实例来升级应用程序的技术。 应用程序健康检查 — 实现一个可以被调用的端点,用来访问某个应用程序的健康状态。 活性探测 — 定期调用应用程序的健康端点,如果健康检查失败,则重新创建一个应用程序实例。 服务端负载均衡 — 一种将请求在多个应用程序实例之间路由的方法,使得客户端只需向一个单独实体(负载均衡器)发送请求。 客户端负载均衡 — 一种将请求在多个应用程序实例之间路由的方法,客户端知道并且可以控制路由到某个服务的多个实例。 服务发现 — 客户端可以发现它所要调用服务的一个或多个地址。 重试 — 当客户端无法接收到服务的响应时,可以重复发起一次请求。 安全服务 — 一个服务无论被调用零次或者多次,返回的结果都是一样的。 幂等服务 — 一个服务无论被调用一次或者多次,返回的结果都是一样的。 回调 — 当发往下游服务的请求无法生成一个结果时,执行的应用程序逻辑。 断路器 — 一种用来阻止不断向某个故障服务实例发送请求,并且当服务恢复正常后允许继续发送请求的技术。 API 网关 — 一个具有多种用途的服务代理,包括访问控制、审计、路由等。 挎斗 — 一种服务代理方法,代理服务本身与服务在一起。 服务网格 — 多个挎斗的网络和控制台。 分布式跟踪 — 一种为了跟踪问题原因,用一个线程来跟踪一系列相关的分布式服务的方法。 事件溯源 — 一种将事件日志作为软件的真实来源,并通过物化视图来满足服务实例需求的模式。
第1部分 云原生上下文 第1章 什么是“云原生”...............................................................................................3 1.1 现代应用程序的需求 ...........................................................................................7 1.1.1 零停机时间 ...............................................................................................7 1.1.2 缩短反馈周期 ...........................................................................................8 1.1.3 移动端和多设备支持 ...............................................................................8 1.1.4 互联设备(物联网) .................................................................................9 1.1.5 数据驱动 ...................................................................................................9 1.2 云原生软件简介 .................................................................................................10 1.2.1 定义“云原生” .......................................................................................10 1.2.2 云原生软件的思维模型 .........................................................................12 1.2.3 云原生软件实战 .....................................................................................17 1.3 云原生与世界和平 .............................................................................................21 1.3.1 云和云原生 .............................................................................................22 1.3.2 什么不是云原生 .....................................................................................23 1.3.3 云原生的价值 .........................................................................................24 小结 ..............................................................................................................................26 第2章 在生产环境中运行云原生应用程序. ...................................................................27 2.1 面临的困难 .........................................................................................................28 2.1.1 碎片化的变化 .........................................................................................30 2.1.2 有风险的部署 .........................................................................................31 2.1.3 认为变化是例外 .....................................................................................35 2.1.4 生产环境的不稳定性 .............................................................................35 2.2 解决办法 .............................................................................................................36 2.2.1 持续交付 .................................................................................................37 2.2.2 可重复性 .................................................................................................41 2.2.3 安全部署 .................................................................................................46 2.2.4 变化是一定的 .........................................................................................49 小结 ..............................................................................................................................52 第3章 云原生软件平台................................................................................................53 3.1 云(原生)平台的发展 .....................................................................................54 3.1.1 从云计算开始 .........................................................................................54 3.1.2 云原生的“拨号音” ...............................................................................56 3.2 云原生平台的核心原则 .....................................................................................59 3.2.1 先聊聊容器 .............................................................................................60 3.2.2 支持“不断变化” ...................................................................................61 3.2.3 支持“高度分布式” ...............................................................................64 3.3 人员分工 .............................................................................................................68 3.4 云原生平台的其他功能 .....................................................................................70 3.4.1 平台支持整个软件开发生命周期 .........................................................70 3.4.2 安全性、变更控制和合规性(管控功能) ...........................................73 3.4.3 控制进入容器的东西 .............................................................................75 3.4.4 升级与安全漏洞修补 .............................................................................77 3.4.5 变更控制 .................................................................................................79 小结 ..............................................................................................................................81 第2部分 云原生模式 第4章 事件驱动微服务:不只是请求/响应. ..................................................................85 4.1 我们(通常)学习的是命令式编程 .................................................................86 4.2 重新介绍事件驱动的计算 .................................................................................88 4.3 我的全球食谱 .....................................................................................................89 4.3.1 请求 / 响应 ..............................................................................................90 4.3.2 事件驱动 .................................................................................................96 4.4 命令查询职责分离模式 ...................................................................................106 4.5 不同的风格,相同的挑战 ...............................................................................108 小结 ............................................................................................................................110 第5章 应用程序冗余:水平伸缩和无状态. .................................................................111 5.1 云原生应用程序会部署许多实例 ...................................................................113 5.2 云环境中的有状态服务 ...................................................................................114 5.2.1 解耦单体程序并绑定到数据库 ...........................................................115 5.2.2 错误处理会话状态 ...............................................................................119 5.3 HTTP会话和黏性会话 .....................................................................................133 5.4 有状态服务和无状态应用程序 .......................................................................136 5.4.1 有状态服务是特殊的服务 ...................................................................136 5.4.2 让应用程序变得无状态 .......................................................................138 小结 ............................................................................................................................143 第6章 应用程序配置:不只是环境变量.....................................................................144 6.1 为什么要讨论配置 ...........................................................................................145 6.1.1 动态伸缩 — 增加和减少应用程序实例的数量 ...............................146 6.1.2 基础设施变化会导致配置变化 ...........................................................146 6.1.3 零停机时间更新应用程序配置 ...........................................................148 6.2 应用程序的配置层 ...........................................................................................148 6.3 注入系统/环境值 ..............................................................................................153 6.3.1 实际案例 :使用环境变量进行配置 ...................................................153 6.4 注入应用程序配置 ...........................................................................................162 6.4.1 配置服务器简介 ...................................................................................163 6.4.2 安全方面的额外需求 ...........................................................................171 6.4.3 实际案例 :使用配置服务器的应用程序配置 ...................................171 小结 ............................................................................................................................174 第7章 应用程序生命周期:考虑不断的变化..............................................................175 7.1 运维同理心 .......................................................................................................177 7.2 单实例应用程序生命周期和多实例应用程序生命周期 .........................................178 7.2.1 蓝 / 绿升级 ............................................................................................182 7.2.2 滚动升级 ...............................................................................................183 7.2.3 并行部署 ...............................................................................................184 7.3 协调多个不同的应用程序生命周期 ...............................................................187 7.4 实际案例:密码轮换和应用程序生命周期 ...................................................191 7.5 处理临时运行时环境 .......................................................................................200 7.6 应用程序生命周期状态的可见性 ...................................................................202 7.6.1 实际案例 :健康端点和探测 ...............................................................207 7.7 无服务器架构 ...................................................................................................210 小结 ............................................................................................................................212 第8章 如何访问应用程序:服务、路由和服务发现...................................................214 8.1 服务抽象 ...........................................................................................................217 8.1.1 服务示例 :用 Google 进行搜索 .........................................................218 8.1.2 服务示例 :我们的博客聚合器 ...........................................................220 8.2 动态路由 ...........................................................................................................221 8.2.1 服务端负载均衡 ...................................................................................221 8.2.2 客户端负载均衡 ...................................................................................222 8.2.3 路由刷新 ...............................................................................................223 8.3 服务发现 ...........................................................................................................226 8.3.1 Web 的服务发现 ...................................................................................229 8.3.2 服务发现和客户端负载均衡 ...............................................................230 8.3.3 Kubernetes 中的服务发现 ....................................................................232 8.3.4 实际案例 :使用服务发现 ...................................................................234 小结 ............................................................................................................................237 第9章 交互冗余:重试和其他控制循环.....................................................................238 9.1 请求重试 ...........................................................................................................240 9.1.1 基本的请求重试 ...................................................................................240 9.1.2 实际案例 :简单的重试 .......................................................................241 9.1.3 重试 :可能出了什么问题 ...................................................................246 9.1.4 创建一个重试风暴 ...............................................................................247 9.1.5 实际案例 :创建一个重试风暴 ...........................................................248 9.1.6 避免重试风暴 :友好的客户端 ...........................................................259 9.1.7 实际案例 :成为一个更友好的客户端 ...............................................259 9.1.8 什么时候不需要重试 ...........................................................................265 9.2 回退逻辑 ...........................................................................................................266 9.2.1 实际案例 :实现回退逻辑 ...................................................................266 9.3 控制循环 ...........................................................................................................272 9.3.1 了解控制循环的类型 ...........................................................................272 9.3.2 如何控制控制循环 ...............................................................................273 小结 ............................................................................................................................275 第10章 前沿服务:断路器和API网关........................................................................277 10.1 断路器 .............................................................................................................279 10.1.1 软件中的断路器 ...............................................................................279 10.1.2 实现一个断路器 ...............................................................................282 10.2 API网关 ..........................................................................................................294 10.2.1 云原生软件中的 API 网关 ..............................................................296 10.2.2 API 网关拓扑 ...................................................................................297 10.3 服务网格 .........................................................................................................299 10.3.1 挎斗 ...................................................................................................299 10.3.2 控制平面 ...........................................................................................302 小结 ............................................................................................................................304 第11章 故障排除:如同大海捞针..............................................................................305 11.1 应用程序日志 .................................................................................................306 11.2 应用程序度量指标 .........................................................................................310 11.2.1 从云原生应用程序中获取指标 .......................................................311 11.2.2 由云原生应用程序推送指标 ...........................................................314 11.3 分布式跟踪 .....................................................................................................317 11.3.1 跟踪器的输出 ...................................................................................320 11.3.2 通过 Zipkin 组合跟踪轨迹 ..............................................................323 11.3.3 实现细节 ...........................................................................................328 小结 ............................................................................................................................329 第12章 云原生数据:打破数据单体..........................................................................331 12.1 每个微服务都需要一个缓存 .........................................................................334 12.2 从请求/响应到事件驱动 ................................................................................337 12.3 事件日志 .........................................................................................................339 12.3.1 实际案例 :实现一个事件驱动的微服务 .......................................341 12.3.2 主题和队列的新特点 .......................................................................354 12.3.3 事件载荷 ...........................................................................................358 12.3.4 幂等性 ...............................................................................................360 12.4 事件溯源 .........................................................................................................361 12.4.1 到目前为止的旅程 ...........................................................................361 12.4.2 真实来源 ...........................................................................................363 12.4.3 实际案例 :实现事件溯源 ...............................................................365 12.5 我们只是介绍了一些皮毛 .............................................................................368 小结 ...............................................................