关于我们
![]() ![]() |
微服务架构设计模式 成功地开发基于微服务架构的应用软件,需要掌握一系列全新的架构思想和实践。在这本独特的书籍中,世界十大软件架构师之一、微服务架构先驱 Chris Richardson 收集、分类并解释了 44 个架构设计模式,这些模式用来解决诸如服务拆分、事务管理、查询和跨服务通信等难题。 本书将教会你如何开发和部署生产级别的微服务架构应用。这套宝贵的架构设计模式建立在数十年的分布式系统经验之上,Chris 还为开发服务添加了新的模式,并将它们组合成可在真实条件下可靠地扩展和执行的系统。本书不仅仅是一个模式目录,还提供了经验驱动的建议,以帮助你设计、实现、测试和部署基于微服务的应用程序。 本书包含: 如何(以及为什么)使用微服务架构 服务拆分的策略 事务管理和查询相关的模式 高效的测试策略 包括容器和Serverless在内的部署模式 本书专为熟悉标准企业应用程序架构的开发人员编写,使用 Java 编写所有示例代码。 本书由世界十大软件架构师之一、微服务架构的先驱、Java开发者社区的意见领袖Chris Richardson亲笔撰写,旨在帮助架构师和程序员学会使用微服务架构成功开发应用程序。书中描述了如何解决我们将面临的众多架构设计挑战,包括如何管理分布式数据,还介绍了如何将单体应用程序重构为微服务架构,涵盖44个架构设计模式,系统解决服务拆分、事务管理、查询和跨服务通信等难题。本书并不是鼓吹微服务架构的宣言,作者既介绍了微服务的原理、原则,又详细讲解了实际落地中的架构设计模式,将使你理解微服务架构、它的好处和弊端,以及应该何时使用微服务架构。本书将帮助你建立微服务的全局视野,并学会在纷繁复杂的情况下做出正确的架构选择和取舍。 写给中文版读者的话 7年前,我带着对美食和技术的热情,开始了我的首次中国之旅。在那之前,我对中国的美食和软件社区都知之甚少。7年之后,经过多次中国之行,我对这两者都有了深刻的认识:我爱上了地道的中国菜,也对中国的软件开发者印象深刻。 2012 年我首次访问中国,参加我在 VMware 公司的同事 Frank举办的几场开发者会议。我一口气在北京和上海做了好几场演讲,包括云计算、Cloud Foundry、Node.js、Spring、NoSQL数据库,当然,还有微服务。我与 2000 多位参加会议的来宾讨论 Cloud Foundry,这次旅行让我意识到中国开发者社区的规模和热情,也让我有机会品尝了地道的中国菜。我甚至还忙里偷闲,在北京参加了一天中餐烹饪课程。 2013 年,Frank 再次邀请我来到北京,参加中国首场SpringOne大会,发表关于微服务和NoSQL的演讲。这次旅行的亮点是访问豆瓣和百度,这是我与中国科技公司的第一次近距离接触。他们的规模和创新技术都给我留下了非常深刻的印象。在这次旅行中,我参观了北京奥林匹克公园,回忆了曾在这里举行的 2008年北京奥运会开幕式。我也抓住机会,继续进修中餐烹饪课程。 这次大会结束后不久,我离开VMware公司,再次走上了创业的道路。我搭建了 microservices.io 网站,撰写了大量的文章和课件,搭乘我钟爱的 United Airlines,为世界各地的客户提供微服务架构咨询和培训服务。我还创立了 eventuate.io 公司,发布了用于微服务架构的数据访问框架。这些工作促成了我和 Frank 的再度合作,我有幸在 2016 年 4 月和 8 月再次访问中国。从那以后,我在中美之间多次往返,帮助中国的企业客户实施微服务架构。这些公司的业务多种多样,包括保险、汽车制造、电信和企业软件。地域上的跨度,也从北京和上海延伸到了深圳、武汉和杭州。在这些旅行中,我爱上了烤鱼、新疆菜和蒙古菜。 中国企业和开发者对微服务架构的热情让我印象深刻。但如同我给所有客户的忠告一样,我想对本书的读者说: 第一,要记住微服务不是解决所有问题的万能银弹。 第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础。 第三,关注微服务的本质,即服务的分解和定义,而不是技术,如容器和其他工具。 第四,确保你的服务松耦合,并且可以独立开发、测试和部署,不要搞成分布式单体(Distributed Monolith),那将会是巨大的灾难。 第五,也是最重要的,不能只是在技术上采用微服务架构。拥抱DevOps的原则和实践,在组织结构上实现跨职能的自治团队,这必不可少。 还必须记住:实现微服务架构并不是你的目标。你的目标是加速大型复杂应用程序的开发。 最后,我要感谢中国的所有客户,让我有机会与你们探讨微服务。我还要感谢那些让我能够讨论技术而不用学说中文(这可比微服务难多了)的同传翻译。我希望你会喜欢阅读这本书,它会教你如何成功开发微服务。我期待着再次访问中国,与我的读者见面,帮助更多企业客户实施微服务架构。 Chris Richardson 2019年2月13日 前 言 我最喜欢的格言之一是: 未来已经到来,只是还没有平均分布。 威廉·吉布森,科幻小说作家 这句话的实质是在说,新的想法和技术需要一段时间才能通过社区传播开来并被广泛采用。我发现并深入关注微服务的故事,就是新思想缓慢扩散的一个极好例子。这个故事始于 2006 年,当时受到 AWS 布道师一次演讲的启发,我开始走上了一条最终导致我创建早期 Cloud Foundry 的道路,它与今天的 Cloud Foundry 唯一相同的是名称。Cloud Foundry 采用平台即服务(PaaS)模式,用于在 EC2 上自动部署 Java 应用程序。与我构建的其他每个企业级 Java 应用程序一样,我的 Cloud Foundry 采用了单体架构,它由单个 Java Web 应用程序(WAR)文件构成。 将初始化、配置、监控和管理等各种复杂的功能捆绑到一个单体架构中,这给开发和运维都带来了挑战。例如,你无法在不测试和重新部署整个应用程序的情况下更改它的用户界面。因为监控和管理组件依赖于维护内存状态的复杂事件处理(CEP)引擎,所以我们无法运行应用程序的多个实例!这是个令人尴尬的事实,但我可以说的是,我是一名软件开发人员,就让我这个无辜的码农来指出这些问题吧。 显然,单体架构无法满足应用程序的需求,但替代方案是什么?在eBay 和亚马逊等公司,软件界已经开始逐渐尝试一些新东西。例如,亚马逊在 2002 年左右开始逐步从单体架构迁移(https://plus.google.com/110981030061712822816/posts/AaygmbzVeRq)。新架构用一系列松散耦合的服务取代了单体。服务由亚马逊称为两个比萨的团队所维护:团队规模小到两个比萨饼就能让所有人吃饱。 亚马逊采用这种架构来加快软件开发速度,以便公司能够更快地进行创新并赢得竞争。结果令人印象深刻:据报道,亚马逊平均每11.6秒就能够将代码的更改部署到生产环境中! 2010年年初,当我转向其他项目之后,我终于领悟了软件架构的未来。那时我正在读Michael T. Fisher和Martin L. Abbott 撰写的《The Art of Scalability: Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise》(Addison-Wesley Professional,2009)。该书中的一个关键思想是扩展立方体,如第2章所述,它是一个用于扩展应用程序的三维模型。由扩展立方体定义的 Y 轴扩展功能将应用程序功能分解为服务。事后来看,这是显而易见的,但对我来说,这是一个让我醍醐灌顶的时刻!如果将 Cloud Foundry 设计为一组服务,我本可以解决两年前面临的挑战! 2012年4月,我首次就这种架构方法发表了题为Decomposing Applications for Scalability and Deployability的演讲(www.slideshare.net/chris.e.richardson/decomposing-applications-for-scalability-and-deployability-april-2012)。当时,这种架构并没有一个被普遍接受的名称。我有时称它为模块化多语言架构,因为服务可以用不同的语言编写。 未来还没有平均分布的另一个佐证是,微服务这个词在 2011 年的软件架构研讨会上被用来描述这种架构(https://en.wikipedia.org/wiki/Microservices)。当我听到 Fred George 在Oredev 2013 上发表演讲时,我第一次遇到这个词,我立刻喜欢上了它! 2014年1月,我创建了https://microservices.io 网站,以记录我遇到的与微服务有关的架构和设计模式。在 2014 年 3 月,James Lewis 和 Martin Fowler 发表了一篇关于微服务的博客文章(https://martinfowler.com/articles/microservices.html)。随着微服务这个术语被广泛传播,这篇博客文章使整个软件社区开始围绕微服务这个新概念展开更进一步的思考和行动。 小型、松散耦合的团队快速可靠地开发和运维微服务的思想正在通过软件社区慢慢扩散。但是,这种对未来的看法可能与日常现实截然不同。如今,业务关键型企业应用程序通常是由大型团队开发的大型单体应用。虽然软件版本不经常更新,但每次更新都会给所涉及的参与人员带来巨大的痛苦。IT经常难以跟上业务需求。大家都很想知道如何采用微服务架构来解决所有这些问题。 本书的目标就是回答这个问题。它将使读者对微服务架构、它的好处和弊端,以及应该何时使用微服务架构有一个很好的理解。书中描述了如何解决我们将面临的众多架构设计挑战,包括如何管理分布式数据,还介绍了如何将单体应用程序重构为微服务架构。但本书并不是鼓吹微服务架构的宣言。相反,它的内容围绕着一系列模式进行展开。模式是在特定上下文中发生的问题的可重用解决方案。模式的优点在于,除了描述解决方案的好处之外,还描述了成功实施解决方案时必须克服的弊端和问题。根据我的经验,在选择解决方案时,这种客观性会带来更好的决策。我希望你会喜欢阅读这本书,它会教你如何成功开发基于微服务架构的应用程序。 致谢 写作是一项孤独的活动,但是把粗略的草稿变成一本完整的图书,却需要来自各方的共同努力。 首先,我要感谢 Manning 出版社的 Erin Twohey和 Michael Stevens,他们一直鼓励我在《POJOs in Action》之后再写一本书。我还要感谢我的编辑 Cynthia Kane 和 Marina Michaels。Cynthia Kane 帮助我启动了这本书,并在前几章与我合作。Marina Michaels 接替 Cynthia 并与我一起工作到最后。Marina 对书的内容提出了细致和建设性的意见,我将永远感激不尽。我还要感谢 Manning 出版社参与了这本书的出版的其他成员。 我要感谢技术编辑 Christian Mennerich、技术校对员 Andy Miles以及所有的外部审校员:Andy Kirsch、Antonio Pessolano、AregMelik-Adamyan、Cage Slagel、Carlos Curotto、Dror Helper、Eros Pedrini、Hugo Cruz、Irina Romanenko、Jesse Rosalia、Joe Justesen、John Guthrie、KeerthiShetty、Michele Mauro、Paul Grebenc、Pethuru Raj、PotitoColuccelli、ShobhaIyer、Simeon Leyzerzon、SrihariSridharan、Tim Moore、Tony Sweets、Trent Whiteley、Wes Shaddix、William E. Wheeler 和ZoltanHamori。 我还要感谢所有购买 MEAP 预览版并在论坛或直接向我提供反馈的人。 我要感谢我曾经参与过的所有会议和聚会的组织者及与会者,他们给了我大量的机会,让我介绍和调整我关于微服务的想法。我要感谢我在世界各地的咨询和培训客户,让我有机会帮助他们将我关于微服务的想法付诸实践。 我还要感谢 Eventuate 公司的同事 Andrew、Valentin、Artem和Stanislav对 Eventuate 产品和开源项目的贡献。 最后,我要感谢妻子 Laura 和孩子Ellie、Thomas 和 Janet,感谢他们在过去的 18 个月里给予我的支持和理解。这段时间我一直盯着我的笔记本电脑,以至于接连错过了观看 Ellie 的足球比赛、Thomas 学习飞行模拟器,以及尝试与 Janet 一起开设新餐馆这些重要的家庭活动。 谢谢你们! ◆推荐序◆ 中文版序一 良马难乘,然可以任重致远;良才难令,然可以致君见尊。 墨子 曾经有一个客户把他们遇到的微服务问题列出来给我看,当时我觉得头绪万千但又无从说起,于是想到了墨子的这句话。 如果现在有人问我这个问题,那么我会推荐他们一边看 Chris Richardson 的这本书,一边在实践中尝试和体验各种模式的优势与特点,然后大家一起讨论遇到的问题并提出解决思路。 大概从五六年前开始,我在工作中越来越多地谈到了微服务,并参与了一些客户应用的微服务改造,其中不乏成功的例子,当然也有没达到预期的情况。随着网络基础设施的高速发展,以及越来越多的企业和组织需要通过互联网提供服务,在考虑构建可以支持海量请求以及多变业务的软件平台时,微服务架构成为多数人的首选。微服务架构的出现是符合事物发展规律的:当问题足够大、有足够多的不确定性因素时,人们习惯把大的问题拆分成小的问题,通过分割、抽象和重用小而可靠的功能模块来构建整体的方案。但是当这些小的、可重用的部分越来越多时,又会出现新的问题。在相似的阶段,人们遇到的问题通常也是相似的,这个时候我们需要一些共识,需要用一些通用的词汇来描述问题以及解题思路和方案,这也是人们知识的总结。微服务模式就是这样一种总结和概括,是一种可以通用的共识,用于描述微服务领域中的问题及解决方案、方法和思路。这是我向大家推荐这本书的理由之一:讨论微服务的时候,这本书提供了必要的共同语言。 在和Chris交流时,我深深地被他高度的思维能力所折服,尤其是对问题的深刻理解和对解决思路的高度抽象。与有敏锐思维且有高度抽象能力的人讨论问题是件快乐的事情,他总是能把自己的经验和概括总结出的信息用清晰的方式表述出来。现在,他把关于微服务的这些抽象整理成了这本书。可以说,这是广大微服务相关工作人员的福音。在这本书里,不仅有微服务领域已经识别出来的问题、解决思路和解决方案,也有相应的代码例子。这就使得高度抽象的内容有了非常具体的表现,可以帮助我们在遇到问题之前就了解可能的潜在问题;有些代码例子甚至是可以直接使用的。这种知行合一的能力,是我钦佩 Chris 的又一个重要原因,也是我向大家推荐这本书的理由之二:这本书可以帮助微服务相关人员构建知行合一的能力。 在一次关于架构的关键是什么的讨论中,我们和 Chris 很快达成了共识:架构就是取舍,进而架构师就是做出取舍的人。大家都认同,做架构的人的特征之一应该是Independent(独立),这也是我选择做独立解决方案进而设计产品的重要原因。在我们看来,只有独立才有可能让我们在做架构设计时做出中立和独特的方案。面对问题时,大多数人会希望有人可以给出正确的建议,但是多数时候,困扰人们的不是什么才是正确的,而是取舍之间。这正是我推荐这本书的理由之三:这是一本可以帮你在设计微服务架构时做出取舍的书,它能在你处理微服务相关问题左右为难的时候给你提供参考和建议。 我们生活在一个高速发展的时代,微服务领域的技术、产品、模式日新月异,我们非常有幸参与和见证这个时代的发展。我们从解决昨天的问题里走出来,又走向更多的问题。在这个过程中,我们解决的问题的规模和复杂度都是成倍提升的。相信很多和我一样喜欢体验这种从无到有的过程、喜欢亲手解决问题的成就感、喜欢用独立思维去面对问题的人,都会喜欢这本书。在此,再次对 Chris Richardson 先生表示感谢,他为这个领域贡献了宝贵的知识财富。 蔡 书 独立顾问,PolarisTech联合创始人 中文版序二 国际数据公司(IDC)研究表明,2018~2021年间,全球数字化转型方面的直接支出将达到 5.9万亿美元。埃森哲(Accenture)指出,目前在中国仅有 7% 的企业成功地实现了数字化转型,而这些成功转型的公司,它们的业绩复合增长率是尚未转型的同行企业的 5 倍之多。 数字化转型依赖技术创新。美国风险投资机构 Work-Bench 在《2018 企业软件调研年报》中推论:以微服务为代表的云原生技术是帮助企业实现有效数字化转型的唯一技术途径。数字化转型背景下客户的预期越来越高,需要企业的线上业务能快速迭代满足动态的市场需求,并能弹性扩展应对业务的突发式增长;而微服务由于其敏捷灵活等特性成了满足这些诉求的最佳答案。因此,微服务可成为企业进行数字化转型的强力催化剂。 微服务的概念虽然直观易懂,但细节是魔鬼,微服务在实操落地的环节中存在诸多挑战。我们在为企业提供 PaaS、人工智能、云原生平台等数字化转型解决方案时也发现,企业实现云原生,并充分利用 PaaS 能力的第一步,往往是对已有应用架构进行现代化微服务改造,而如何进行微服务拆分、设计微服务逻辑、实现微服务治理等实操问题成为很大的挑战。 本书英文原作由微服务权威架构师 Chris Richardson 先生所著。书中既包含了微服务的原理、原则,又包含了实际落地中的架构设计模式;既包含可举一反三的理念和概念,也包含类似领域驱动设计、Saga 实现事务操作、CQRS 构建事件驱动系统等具体可套用的范式。本书可以帮助读者把传统的单体巨石型应用循序渐进地改造为微服务架构,从微服务的拆分,微服务架构下业务逻辑的设计以及事务、API、通信等的实现,一直到微服务系统的测试与生产上线,帮助读者建立从无到有的完整微服务系统搭建的生命周期。 本书译者在云计算、云原生与微服务领域有多年实践经验和建树,译文既精确地还原了原著的内容,又结合译者自身的理解,让中文版本更加通俗易懂。虽身在云计算行业多年,我在通读译著后依然受益匪浅。相信本书对于企业 CIO 推动公司数字化转型战略、软件开发者提升自身技术架构功力,以及云原生爱好者以微服务切入最新的云原生体系,都有着极其重要的实践指导意义。 张 鑫 才云科技CEO 译 者 序 2012年年初,我有幸加入了VMware公司的Cloud Foundry团队,与 Chris Richardson、Patrick Chanezon、Josh Long等业界大咖共事,在全球范围内开展 Cloud Foundry 开发者社区和生态建设工作。7年前,云计算的市场格局与现在大为不同。那时,IaaS 正高歌猛进,PaaS 的价值仍旧备受质疑,十二原则还不为人所知,云端分布式系统的架构演化也正摸着石头过河。在这个时候,Chris Richardson 率先在业界提出了Functional Decomposition(功能性拆分)的概念,提出云计算环境下的分布式软件,应该按照功能性拆分的方式进行架构重构。这个想法与稍后业界公认的微服务概念不谋而合。 在VMware公司工作期间,以及之后各自的创业经历中,我跟 Chris 保持着良好的个人关系和工作合作关系。Chris是一个风趣、博学、经验丰富的架构师,他在软件行业有将近 30 年的经验,在 Java 社区更是享有盛名。在离开VMware公司后,他建立了 microservices.io网站,专注微服务架构的咨询和培训工作,我也曾为他牵线搭桥,使他有机会为国内的企业客户提供咨询服务。 经过这些年的发展,微服务已经成为软件领域的新宠,国外Netflix、Amazon的成功案例,国内数字化转型的一波波浪潮,推动着PaaS厂商和开发者深度关注微服务。大家围绕着微服务展开了大量的讨论。在这个过程中,我们认识到,虽然很多企业客户视微服务如救命稻草,但微服务并不能解决一切问题。很多客户,亦盲从于各种厂商的忽悠,着力建设底层基础设施。 面对这些迷茫,Chris 曾对我说,软件的架构设计,就是选择和取舍。面对围绕微服务的众多杂音,开发者和架构师应该具备选择和取舍的能力,应该站在比较高的角度俯瞰全局、权衡利弊,做出正确的架构和技术选择。这也是最初Chris写作本书的动机之一:为架构师提供一个微服务的全局视野,并教会架构师如何在纷繁复杂的情况下做出正确的架构选择和取舍。 本书英文版的写作开始于2017年春天,2018 年 10 月正式出版。在英文版出版后,我集中利用两个多月的时间完成了中文版的翻译工作。这是一本30万字的大部头,Chris曾数次对英文版做出较大的结构性修改。为了确保中文版的一致性和准确性,并且以最快速度翻译出版,中文版初稿完成后,先后经历了7轮修改润色和校对。在后期校对阶段,我邀请了数位好友帮助把关,他们是:薛江波、王天青、季奔牛、刘果、蔡书、张鑫、张扬、黄雨婷、毛艳玲。我特别感谢这些朋友,因为他们细致地校对了所有翻译稿,帮我找到并修正了大量足以让我晚节不保的低级错误。蔡书和张鑫还在繁忙的创业工作之余细读整本书,并撰写了推荐序。 本书的中文版出版后,我将与 Chris 重启针对中国市场的微服务咨询和培训业务。为此,我们发布了中文网站 www.chrisrichardson.cn,并有针对性地设计了微服务培训和技术咨询的服务项目。我们期待与读者面对面交流的机会。 喻 勇 2019年2月14日 克里斯·理查森(Chris
Richardson) 喻勇 Chris 与喻勇曾在 VMware 全球开发者关系团队共事多年,现在他们合作为国内企业客户提供微服务相关的咨询和培训服务,他们的中文网站是:www.chrisrichardson.cn ◆目录 ◆ 目 录 写给中文版读者的话 译者序 中文版序一 中文版序二 前言 引言 第1章 逃离单体地狱 / 1 1.1 迈向单体地狱的漫长旅程 / 2 1.1.1 FTGO应用程序的架构 / 3 1.1.2 单体架构的好处 / 4 1.1.3 什么是单体地狱 / 4 1.2 为什么本书与你有关 / 7 1.3 你会在本书中学到什么 / 8 1.4 拯救之道:微服务架构 / 8 1.4.1 扩展立方体和服务 / 9 1.4.2 微服务架构作为模块化的一种形式 / 11 1.4.3 每个服务都拥有自己的数据库 / 12 1.4.4 FTGO的微服务架构 / 12 1.4.5 微服务架构与SOA的异同 / 14 1.5 微服务架构的好处和弊端 / 15 1.5.1 微服务架构的好处 / 15 1.5.2 微服务架构的弊端 / 17 1.6 微服务架构的模式语言 / 19 1.6.1 微服务架构并不是银弹 / 20 1.6.2 模式和模式语言 / 21 1.6.3 微服务架构的模式语言概述 / 24 1.7 微服务之上:流程和组织 / 29 1.7.1 进行软件开发和交付的组织 / 30 1.7.2 进行软件开发和交付的流程 / 31 1.7.3 采用微服务架构时的人为因素 / 32 第2章 服务的拆分策略 / 34 2.1 微服务架构到底是什么 / 35 2.1.1 软件架构是什么,为什么它如此重要 / 35 2.1.2 什么是架构的风格 / 37 2.1.3 微服务架构是一种架构风格 / 40 2.2 为应用程序定义微服务架构 / 43 2.2.1 识别系统操作 / 45 2.2.2 根据业务能力进行服务拆分 / 50 2.2.3 根据子域进行服务拆分 / 53 2.2.4 拆分的指导原则 / 54 2.2.5 拆分单体应用为服务的难点 / 56 2.2.6 定义服务API / 59 第3章 微服务架构中的进程间通信 / 63 3.1 微服务架构中的进程间通信概述 / 64 3.1.1 交互方式 / 64 3.1.2 在微服务架构中定义API / 66 3.1.3 API的演化 / 67 3.1.4 消息的格式 / 69 3.2 基于同步远程过程调用模式的通信 / 70 3.2.1 使用REST / 71 3.2.2 使用gRPC / 74 3.2.3 使用断路器模式处理局部故障 / 75 3.2.4 使用服务发现 / 78 3.3 基于异步消息模式的通信 / 82 3.3.1 什么是消息传递 / 83 3.3.2 使用消息机制实现交互方式 / 84 3.3.3 为基于消息机制的服务API创建API规范 / 86 3.3.4 使用消息代理 / 87 3.3.5 处理并发和消息顺序 / 91 3.3.6 处理重复消息 / 92 3.3.7 事务性消息 / 93 3.3.8 消息相关的类库和框架 / 97 3.4 使用异步消息提高可用性 / 99 3.4.1 同步消息会降低可用性 / 99 3.4.2 消除同步交互 / 101 第4章 使用Saga管理事务 / 106 4.1 微服务架构下的事务管理 / 107 4.1.1 微服务架构对分布式事务的需求 / 108 4.1.2 分布式事务的挑战 / 109 4.1.3 使用Saga模式维护数据一致性 / 109 4.2 Saga的协调模式 / 113 4.2.1 协同式Saga / 113 4.2.2 编排式Saga / 117 4.3 解决隔离问题 / 121 4.3.1 缺乏隔离导致的问题 / 122 4.3.2 Saga模式下实现隔离的对策 / 123 4.4 Order Service和Create Order Saga的设计 / 127 4.4.1 OrderService类 / 128 4.4.2 Create Order Saga的实现 / 129 4.4.3 OrderCommandHandlers类 / 136 4.4.4 OrderServiceConfiguration类 / 138 第5章 微服务架构中的业务逻辑设计 / 141 5.1 业务逻辑组织模式 / 142 5.1.1 使用事务脚本模式设计业务逻辑 / 143 5.1.2 使用领域模型模式设计业务逻辑 / 144 5.1.3 关于领域驱动设计 / 146 5.2 使用聚合模式设计领域模型 / 146 5.2.1 模糊边界所带来的问题 / 147 5.2.2 聚合拥有明确的边界 / 149 5.2.3 聚合的规则 / 150 5.2.4 聚合的颗粒度 / 152 5.2.5 使用聚合设计业务逻辑 / 153 5.3 发布领域事件 / 154 5.3.1 为什么需要发布变更事件 / 154 5.3.2 什么是领域事件 / 155 5.3.3 事件增强 / 155 5.3.4 识别领域事件 / 156 5.3.5 生成和发布领域事件 / 157 5.3.6 消费领域事件 / 161 5.4 Kitchen Service的业务逻辑 / 162 5.5 Order Service的业务逻辑 / 167 5.5.1 Order聚合 / 169 5.5.2 OrderService类 / 173 第6章 使用事件溯源开发业务逻辑 / 176 6.1 使用事件溯源开发业务逻辑概述 / 177 6.1.1 传统持久化技术的问题 / 177 6.1.2 什么是事件溯源 / 179 6.1.3 使用乐观锁处理并发更新 / 186 6.1.4 事件溯源和发布事件 / 186 6.1.5 使用快照提升性能 / 188 6.1.6 幂等方式的消息处理 / 189 6.1.7 领域事件的演化 / 190 6.1.8 事件溯源的好处 / 192 6.1.9 事件溯源的弊端 / 193 6.2 实现事件存储库 / 194 6.2.1 Eventuate Local事件存储库的工作原理 / 195 6.2.2 Eventuate的Java客户端框架 / 198 6.3 同时使用Saga和事件溯源 / 201 6.3.1 使用事件溯源实现协同式Saga / 203 6.3.2 创建编排式Saga / 203 6.3.3 实现基于事件溯源的Saga参与方 / 205 6.3.4 实现基于事件溯源的Saga编排器 / 208 第7章 在微服务架构中实现查询 / 212 7.1 使用API组合模式进行查询 / 213 7.1.1 findOrder()查询操作 / 213 7.1.2 什么是API组合模式 / 214 7.1.3 使用API组合模式实现findOrder()查询操作 / 215 7.1.4 API组合模式的设计缺陷 / 216 7.1.5 API组合模式的好处和弊端 / 219 7.2 使用CQRS模式 / 220 7.2.1 为什么要使用CQRS / 220 7.2.2 什么是CQRS / 223 7.2.3 CQRS的好处 / 226 7.2.4 CQRS的弊端 / 227 7.3 设计CQRS视图 / 228 7.3.1 选择视图存储库 / 229 7.3.2 设计数据访问模块 / 230 7.3.3 添加和更新CQRS视图 / 232 7.4 实现基于AWS DynamoDB的CQRS视图 / 233 7.4.1 OrderHistoryEventHandlers模块 / 234 7.4.2 DynamoDB中的数据建模和查询设计 / 235 7.4.3 OrderHistoryDaoDynamoDb类 / 239 第8章 外部API模式 / 244 8.1 外部API的设计难题 / 245 8.1.1 FTGO移动客户端API的设计难题 / 246 8.1.2 其他类型客户端API的设计难题 / 248 8.2 API Gateway模式 / 250 8.2.1 什么是API Gateway模式 / 250 8.2.2 API Gateway模式的好处和弊端 / 256 8.2.3 以Netflix为例的API Gateway / 257 8.2.4 API Gateway的设计难题 / 258 8.3 实现一个API Gateway / 260 8.3.1 使用现成的API Gateway产品或服务 / 261 8.3.2 开发自己的API Gateway / 262 8.3.3 使用GraphQL实现API Gateway / 269 第9章 微服务架构中的测试策略(上) / 282 9.1 微服务架构中的测试策略概述 / 284 9.1.1 什么是测试 / 284 9.1.2 微服务架构中的测试挑战 / 289 9.1.3 部署流水线 / 295 9.2 为服务编写单元测试 / 296 9.2.1 为实体编写单元测试 / 298 9.2.2 为值对象编写单元测试 / 299 9.2.3 为Saga编写单元测试 / 300 9.2.4 为领域服务编写单元测试 / 302 9.2.5 为控制器编写单元测试 / 303 9.2.6 为事件和消息处理程序编写单元测试 / 305 第10章 微服务架构中的测试策略(下) / 308 10.1 编写集成测试 / 308 10.1.1 针对持久化层的集成测试 / 311 10.1.2 针对基于REST的请求/响应式交互的集成测试 / 312 10.1.3 针对发布/订阅式交互的集成测试 / 316 10.1.4 针对异步请求/响应式交互的集成契约测试 / 320 10.2 编写组件测试 / 324 10.2.1 定义验收测试 / 325 10.2.2 使用Gherkin编写验收测试 / 326 10.2.3 设计组件测试 / 328 10.2.4 为FTGO的Order Service编写组件测试 / 330 10.3 端到端测试 / 334 10.3.1 设计端到端测试 / 335 10.3.2 编写端到端测试 / 335 10.3.3 运行端到端测试 / 336 第11章 开发面向生产环境的微服务应用 / 338 11.1 开发安全的服务 / 339 11.1.1 传统单体应用程序的安全性 / 340 11.1.2 在微服务架构中实现安全性 / 343 11.2 设计可配置的服务 / 349 11.2.1 使用基于推送的外部化配置 / 350 11.2.2 使用基于拉取的外部化配置 / 352 11.3 设计可观测的服务 / 353 11.3.1 使用健康检查API模式 / 355 11.3.2 使用日志聚合模式 / 357 11.3.3 使用分布式追踪模式 / 358 11.3.4 使用应用程序指标模式 / 361 11.3.5 使用异常追踪模式 / 364 11.3.6 使用审计日志模式 / 365 11.4 使用微服务基底模式开发服务 / 367 11.4.1 使用微服务基底 / 368 11.4.2 从微服务基底到服务网格 / 368 第12章 部署微服务应用 / 371 12.1 部署模式:编程语言特定的发布包格式 / 374 12.1.1 使用编程语言特定的发布包格式进行部署的好处 / 376 12.1.2 使用编程语言特定的发布包格式进行部署的弊端 / 377 12.2 部署模式:将服务部署为虚拟机 / 378 12.2.1 将服务部署为虚拟机的好处 / 380 12.2.2 将服务部署为虚拟机的弊端 / 380 12.3 部署模式:将服务部署为容器 / 381 12.3.1 使用Docker部署服务 / 383 12.3.2 将服务部署为容器的好处 / 385 12.3.3 将服务部署为容器的弊端 / 386 12.4 使用Kubernetes部署FTGO应用程序 / 386 12.4.1 什么是Kubernetes / 386 12.4.2 在Kubernetes上部署Restaurant Service / 389 12.4.3 部署API Gateway / 392 12.4.4 零停机部署 / 393 12.4.5 使用服务网格分隔部署与发布流程 / 394 12.5 部署模式:Serverless部署 / 402 12.5.1 使用AWS Lambda进行Serverless部署 / 403 12.5.2 开发Lambda函数 / 404 12.5.3 调用Lambda函数 / 404 12.5.4 使用Lambda函数的好处 / 405 12.5.5 使用Lambda函数的弊端 / 406 12.6 使用AWS Lambda和AWS Gateway部署RESTful服务 / 406 12.6.1 AWS Lambda版本的Restaurant Service / 407 12.6.2 把服务打包为ZIP文件 / 411 12.6.3 使用Serverless框架部署Lambda函数 / 412 第13章 微服务架构的重构策略 / 415 13.1 重构到微服务需要考虑的问题 / 416 13.1.1 为什么要重构单体应用 / 416 13.1.2 绞杀单体应用 / 417 13.2 将单体应用重构为微服务架构的若干策略 / 420 13.2.1 将新功能实现为服务 / 420 13.2.2 隔离表现层与后端 / 422 13.2.3 提取业务能力到服务中 / 423 13.3 设计服务与单体的协作方式 / 429 13.3.1 设计集成胶水 / 430 13.3.2 在服务和单体之间维持数据一致性 / 434 13.3.3 处理身份验证和访问授权 / 438 13.4 将新功能实现为服务:处理错误配送订单 / 440 13.4.1 Delayed Delivery Service的设计 / 441 13.4.2 为Delayed Delivery Service设计集成胶水 / 442 13.5 从单体中提取送餐管理功能 / 444 13.5.1 现有的送餐管理功能 / 444 13.5.2 Delivery Service概览 / 446 13.5.3 设计Delivery Service的领域模型 / 447 13.5.4 Delivery Service集成胶水的设计 / 450 13.5.5 修改FTGO单体使其能够与Delivery Service交互 / 451
你还可能感兴趣
我要评论
|