草庐IT

《微服务架构设计模式》读书笔记 | 第1章 逃离单体地狱

多氯环己烷 2023-03-28 原文


前言

这是一本关于微服务架构设计方面的书,这是本人阅读的学习笔记。首先对一些符号做些说明:

()为补充,一般是书本里的内容;
[]符号为笔者笔注;


1. 迈向单体地狱的漫长旅程

在书中,作者以Food to Go(下简称FTGO)业务分析单体应用程序的优缺点。

1.1 FTGO应用程序单体架构

1.2 单体架构的好处

  • 应用开发简单;
  • 易对应用程序进行大规模修改;
  • 测试相对简单直观;
  • 部署简单明了;
  • 横向扩展不费吹灰之力;

1.3 FTGO应用程序单体地狱

1.4 什么是单体地狱

  • 过度复杂性会吓退开发者;
  • 开发速度慢;
  • 从代码提交到实际部署的周期很长,容易出问题;
  • 难以扩展;
  • 交付可靠的单体应用是一项挑战;
  • 需要长期依赖某个可能已过时的技术栈;

2. 为什么本书与你有关

什么人适合阅读:软件开发人员、架构师、CTO或工程研发副总裁;或者所负责的应用程序超出单体架构所能支撑的范围。

2.1 阅读门槛

  • 三层架构;
  • Web应用程序设计;
  • 使用面向对象设计来开发业务逻辑;
  • 关系型数据库:SQL和ACID事务的概念;
  • 使用消息代理和REST API进行进程间通信;
  • 安全,包括身份验证和访问授权;
  • Spring框架;

3. 你会在本书中学到什么

读完本书能理解与掌握的知识点与技术点。

3.1 需要重点关注的知识

  • 微服务架构的基本特点,它的好处与弊端,以及在什么时候使用微服务架构;
  • 分布式数据管理的架构模式;
  • 针对微服务架构应用程序的有效测试策略;
  • 微服务架构应用程序的部署方式;
  • 把单体应用重构为微服务架构的策略;

3.2 其他技术

  • 使用微服务的架构模式来设计应用程序的架构;
  • 为服务开发业务逻辑;
  • 使用Saga在进程间维护数据的一致性;
  • 实现跨服务的数据查询;
  • 更高效地测试服务架构应用程序;
  • 开发生产环境就绪的应用程序,实现安全性、可配置性和可观测性;
  • 把现有的单体应用重构为服务;

4. 拯救之道:微服务架构

主要介绍人微服务架构的一些定义与基本特性。

4.1 扩展应用程序的三个维度(扩展立方体)[微服务的定义]

  • X轴扩展:在多个实例之间实现请求的负载均衡,[简单来说就是Ctrl CV];
  • Z轴扩展:根据请求的属性路由请求,(用于应用程序需要处理增加的事务和数据量时),[流量分区扩容];
  • Y轴扩展:根据功能把应用拆分为服务,(亦称为功能性分解),[一般先进行Y轴扩展,再采用X、Z轴扩展];

4.2 微服务的基本特性

  • 扩展立方体;
  • 模块化,[指开发人员无法绕开服务的API访问内部组件];
  • 每个服务拥有自己的数据库;

4.3 FTGO的微服务架构

将Y轴分解应用于FTGO应用程序,将得到下图:


可以看出该模型的特点有:

  • 每个服务API清晰定义;
  • 每个服务可以独立开发、测试、部署和扩展;
  • 模块化;

4.4 微服务架构与SOA的异同


相似点:

  • 都是特定的风格架构;
  • 都以一系列服务方式组织系统;

不同点:

  • 完全不同的技术栈(微服务架构采用轻量级、开源技术以及哑管道通信);
  • 处理数据方式不同(微服务架构有自己的数据库);
  • 服务尺寸、规模不同(微服务架构中的服务相对较小);

5. 微服务架构的好处与弊端

5.1 微服务架构的好处

  • 使大型的复杂应用程序可以持续交付和持续部署,[支持自动化测试、独立部署、开发团队自主且松散耦合];
  • 每个服务都相对较小并容易维护;
  • 服务可以独立部署;
  • 服务可以独立扩展;
  • 微服务架构可以实现团队的自治;
  • 更容易实验和采纳新技术;
  • 更好的容错性;

5.2 微服务架构的弊端

  • 服务的拆分与定义是一项挑战;
  • 分布式系统带来各种复杂性,使开发、测试和部署变得困难;
  • 当部署跨越多个服务的功能时需要谨慎地协调更多开发团队;
  • 开发者需要思考到底应该在应用的什么阶段使用微服务架构;

6. 微服务架构的模式语言

一个用来表述多种架构设计的选择方案,并且可用来改进决策的方式,就是使用模式语言。微服务架构的模式是微服务架构设计的重难点,也是后续章节的重难点。

6.1 一些概念(模式、模式语言等)

  • 模式:针对特定上下文中发生的问题的可重用解决方案;
  • 模式语言:解决特定领域内问题的相关模式的集合;
  • 软件模式:通过定义一组互相协作的软件元素来解决软件架构或设计问题;

6.2 常用的模式结构包括三个重要部分

  • 需求(Forces):必须解决的问题;
  • 结果上下文(Resulting context):采用模式后可能带来的后果(包含好处、弊端、问题);
  • 相关模式(Related patterns):5种不同类型的关系(前导、后续、替代、泛化、特化);

6.3 微服务架构模式语言


上图有四个模式组

  • 应用程序架构模式组:最左边,分为单体架构模式与微服务架构模式;
  • 应用相关模式组:解决开发人员面对的具体技术和架构问题;
  • 应用基础设施相关模式组:解决应用层面的基础设施相关问题;
  • 基础设施相关模式组:解决通常在开发环节跟基础设施有关的问题;

6.4 微服务的主要几组模式【重点】

服务拆分相关模式:

【第2章重点介绍】将系统拆分本质上是一门艺术,但可以有一定策略,如下图所示:

通信相关模式:

【第3与第8章介绍】进程间通信(IPC)是分布式系统的重要组成部分,其包括:

  • 通信风格:使用哪类进程间通信机制;
  • 服务发现:客户端如何获取服务具体实例的IP地址;
  • 可靠性:在服务不可用情况下,如何确保服务间的可靠通信;
  • 事务性消息:如何将消息发送、事件发布这样的动作与更新的业务数据的数据库事务集成;
  • 外部API:应用程序的客户端如何与服务进行通信;

实现事务管理的数据一致性相关模式:

【第4~6章介绍】使用Saga模式确保数据一致性,而不是两步式提交(2PC)方式。下图展示数据一致性相关模式:

在微服务架构中查询数据的相关模式:

【第7章介绍】可以使用API组合模式,逐一调用服务的API,然后将所有的返回聚合在一起,如下图所示:

服务部署相关模式:

【第12章介绍】往往需要一个高度自动化部署的基础设施,一个部署平台(可以是UI图形化界面、命令行等),如下图所示:

可观测性相关模式:

【第11章介绍】指弄清应用在运行时的一些行为,同时根据错误的请求或高延迟等故障进行诊断排错。以下模式可用来设计具备可观测性的服务:

  • 健康检查API:可以返回服务健康状态的API;
  • 日志聚合:把服务产生的日志写入一个集中式的日志服务器,这个服务器可以提供日志搜索,也可以根据日志情况触发报警;
  • 分布式追踪:为每一个外部请求分配一个唯一的ID,用于在各个服务之间追踪外部请求;
  • 异常跟踪:把程序异常发送到异常跟踪服务,这个服务会排除重复异常,给开发者发送报警并且跟踪每一个异常的解决;
  • 应用指标:供维护使用的指标,如计数器等,导出到指标服务器;
  • 审计日志:记录用户的行为;

实现服务自动化测试的相关模式:

【第9~10章介绍】需要注意测试不同服务是否协同工作。以下通过单独测试服务简化测试的模式:

  • 消费者端驱动的契约测试:验证服务满足客户端所期望的功能;
  • 消费端契约测试:验证服务的客户端可以正常与服务通信;
  • 服务组件测试:在隔离的环境中测试服务;

解决基础设施和边界问题的相关模式:

【第11章介绍】每个服务都必须实现许多跟基础设施相关的功能,此外必须实现外部化配置模式。在开发新服务时可以使用微服务基底模式解决一些基础设施的相关问题。

安全相关模式:

【第11章介绍】在用户身份验证工作中常用访问令牌模式,用户信息传递后的服务可以验证令牌获取用户信息。


7. 微服务之上:流程和组织

架构不是唯一需要关注的领域,还必须思考流程与组织。

7.1 架构、流程与组织间的关系



8. 本章小结

  • 单体架构模式将应用程序构建为单个可部署单元;
  • 微服务架构模式将系统分解为一组可独立部署的服务,每个服务都有自己的数据库;
  • 单体架构是简单应用的不错选择,微服务架构通常是大型复杂应用的更好选择;
  • 微服务架构使小型自治团队能够并行工作,从而加快软件开发的速度;
  • 微服务架构不是银弹:它存在包括复杂性在内的诸多弊端;
  • 微服务架构模式语言是一组模式,可帮助你使用微服务架构构建应用程序。它可以帮助你决定是否使用微服务架构,如果你选择微服务架构,模式语言可以帮助你有效地应用它;
  • 你需要的不仅仅是通过微服务架构来加速软件交付。成功的软件开发还需要DevOps和小而自治的团队;
  • 不要忘记采纳微服务过程中的人性层面。你需要考虑员工的情绪才能成功转换到微服务架构。


最后

新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!

有关《微服务架构设计模式》读书笔记 | 第1章 逃离单体地狱的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  10. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

随机推荐