项目从0到1,架构选型 :单体架构优先考虑

news2024/9/20 20:38:39

当我听到关于团队使用微服务架构的故事时,我注意到了一个共同的现象。

  1. 几乎所有成功的微服务故事都是从一个过于庞大的庞然大物开始的,后来这个庞然大物被拆分了
  2. 我所听说的几乎所有从零开始构建微服务系统的案例,最终都陷入了严重的麻烦。

这种模式导致我的许多同事认为,你不应该用微服务开始一个新项目,即使你确信你的应用程序足够大,值得这样做。
在这里插入图片描述
微服务是一种有用的体系结构,但即使是它们的拥护者也说,使用它们会产生显著的微服务溢价,这意味着它们只对更复杂的系统有用。这种溢价,本质上是管理一套服务的成本,将会拖慢团队的速度,而倾向于为更简单的应用程序提供一个整体。这导致了对单体优先策略的有力论证,在这种策略中,您应该首先将新应用程序构建为单体,即使您认为它可能会在以后从微服务架构中受益。

第一个原因是经典的雅格尼。当你开始一个新的应用程序时,你有多确定它对你的用户有用?可能很难扩展一个设计糟糕但成功的软件系统,但这仍然比它的反面要好。正如我们现在所认识到的,通常发现一个软件想法是否有用的最好方法是构建一个简单的版本,然后看看它的效果如何。在第一阶段,你需要优先考虑速度(以及反馈的周期时间),所以微服务的溢价是你应该避免的拖累。

从微服务开始的第二个问题是,只有在服务之间有良好的、稳定的边界时,它们才能很好地工作——这本质上是绘制正确的BoundedContexts集合的任务。服务之间的任何功能重构都比在一个整体中要困难得多。但是,即使是在熟悉的领域工作的经验丰富的架构师,在开始时也很难得到正确的边界。通过首先构建一个整体,您可以在微服务设计在其上刷上一层糖霜之前弄清楚正确的边界是什么。它还为您提供了开发细粒度服务所需的microservice先决条件的时间。

我听说过不同的执行“巨石优先”策略的方法。合乎逻辑的方法是仔细设计一个整体,注意软件内部的模块化,包括API边界和数据存储方式。做好这一点,向微服务的转变就相对简单了。然而,如果我听过大量这样的故事,我就会对这种方法感到更放心。

更常见的方法是从一个整体开始,逐渐剥离边缘的微服务。这样的方法可以在微服务体系结构的核心留下一个庞大的单体,但是大多数新的开发都发生在微服务中,而单体相对静止。

另一种常见的方法是完全更换巨石。很少有人认为这是一种值得骄傲的方法,然而,建造一块巨石作为祭祀建筑是有好处的。不要害怕建立一个你会抛弃的庞然大物,特别是如果一个庞然大物可以让你快速进入市场。

我遇到的另一种方法是从几个粗粒度的服务开始,这些服务比您期望的要大。使用这些粗粒度服务来习惯使用多个服务,同时享受这样的粗粒度减少了必须进行的服务间重构的数量。然后随着边界的稳定,分解成更细粒度的服务。

虽然我的大部分联系人都倾向于单一优先的方法,但这绝不是一致的。相反的观点认为,从微服务开始可以让您习惯在微服务环境中开发的节奏。以一种足够模块化的方式构建一个单体,以便它可以很容易地分解成微服务,这需要很多,也许是太多的纪律。通过从微服务开始,你可以让每个人从一开始就习惯在独立的小团队中开发,并且通过服务边界将团队分开可以在需要时更容易地扩展开发工作。这对于系统替换尤其可行,因为您有更好的机会尽早提出足够稳定的边界。

尽管证据很少,但我认为除非您在团队中具有构建微服务系统的合理经验,否则不应该从微服务开始。

我觉得我还没有足够的轶事来确定如何决定是否使用“单一优先”策略。这些都是微服务的早期阶段,相对而言,很少有趣闻轶事可以借鉴。因此,任何人在这些话题上的建议都必须被视为试探性的,无论他们多么自信地争辩。

Sam Newman描述了一个团队考虑在新项目中使用微服务的案例研究。

  • 注1:
    您不能假设您可以任意取一个系统并将其分解为微服务。大多数系统的模块之间都有太多的依赖关系,因此无法合理地拆分。我听说过很多这样的例子:试图分解一块巨石,结果很快就弄得一团糟。我也听说过一些逐步实现微服务的成功案例——但这些案例需要一个相对较好的模块化设计作为开始。
  • 注2:
    严格来说,我认为你应该称之为“双石”,但我认为这种方法遵循了单石优先策略的本质:从粗粒度开始获取知识,然后再拆分。

我从我的同事那里偷了很多想法:James Lewis, Sam Newman, Thiyagu Palanisamy和Evan Bottcher。斯蒂芬·蒂尔科夫(Stefan Tilkov)对早期草稿的评论在澄清我的想法方面发挥了关键作用。查德·库里创造了可爱的雕文龙。Steven Lowe, Patrick Kua, Jean Robert D’amore, Chelsea Komlo, Ashok Subramanian, Dan Siwiec, Prasanna Pendse, Kief Morris, Chris Ford和Florian Sellmayr在我们的内部邮件列表中讨论了草稿。

在这里插入图片描述

自从微服务第一次进入软件世界的视野以来,我和我的同事们就一直在写关于微服务的文章。本指南页面有关于何时使用微服务、开始时应该具备的实践、如何有效地测试它们以及如何分解单体的文章。 - by Martin Fowler

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DRF从入门到精通二(Request源码分析、DRF之序列化组件)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结: 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验 …

大文件传输之传输协议TCP和UDP之间的区别

传输协议是一种规定数据包格式、顺序、重传、确认等细节的约定,确保在不同设备之间正确传送和接收数据。目前常见的协议主要有两种,一是TCP,另一是UDP,它们各自有优势和劣势。下面我们来深入了解。 TCP和UDP的特点和区别&#xff…

力扣题目学习笔记(OC + Swift)17. 电话号码的字母组合

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 关键字:所有组合 模式识别&#xff1a…

递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、二叉树的遍历1.1 链式结构二叉树的创建1.1 二叉树结构图 二、 前序遍历代码演示:2.1 前序遍历递…

李飞飞吴恩达等 2024 年 AI 十大预测!GPU算力短缺,AI 智能体一年内大爆发?

2023 这个大模型爆发的元年即将过去,展望未来,比尔盖茨,李飞飞,吴恩达等人对 2024 年人工智能的发展作出了自己的预测。 2023,可以说是人工智能的春天。 在过去的一年里,ChatGPT 成为家喻户晓的名字&#…

InstructPix2Pix:通过用户指令编辑图像

Brooks T, Holynski A, Efros A A. Instructpix2pix: Learning to follow image editing instructions[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 18392-18402. InstructPix2Pix 所做的任务是根据用户指令编辑图像。Inst…

SSM整合实战(Spring、SpringMVC、MyBatis)

五、SSM整合实战 目录 一、SSM整合理解 1. 什么是SSM整合?2. SSM整合核心理解五连问! 2.1 SSM整合涉及几个IoC容器?2.2 每个IoC容器盛放哪些组件?2.3 IoC容器之间是什么关系?2.4 需要几个配置文件和对应IoC容器关系&…

Ubuntu系统的基础操作和使用

文章目录 系统安装系统界面文件系统包管理命令行常见问题 Ubuntu是一个基于Debian的Linux发行版,以桌面应用为主。它是自由软件,意味着你可以自由地使用、复制、研究、修改和改进这个软件。下面我们将详细介绍Ubuntu系统的基础操作和使用。 系统安装 U…

Android Studio开发之路(六)(合集)界面优化以及启动图标等

一、导航栏背景、字体修改 导航栏、状态栏等背景颜色的修改一般是在themes.xml文件中修改,android一个activity各个部件参考: colorPrimary,colorPrimaryDark等的意义 添加链接描述 但是问题在于:只在这里修改背景颜色的话,可能…

人工智能的发展之路:时间节点、问题与解决办法的全景解析

导言 人工智能的发展历程充满了里程碑式的事件,从早期的概念到今天的广泛应用,每个时间节点都伴随着独特的挑战和创新。本文将详细描述每个关键时间节点的事件,探讨存在的问题、解决办法,以及不同阶段之间的联系。 1. 195…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标:在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表,并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

【大模型实践】Langchain-Chatchat构建对话模型(二)

本文介绍如何使用Langchain-Chatchat构建论文知识库和文件对话。 关于Langchain-Chatchat: 🤖️ 一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 …

基于vue-cli快速发布vue npm 包

一、编写组件 1. 初始化项目并运行 vue create vue-digital-countnpm run serve2. 组件封装 新建package文件夹 ​ 因为我们可能会封装多个组件,所以在src下面新建一个package文件夹用来存放所有需要上传的组件。 ​ 当然,如果只有一个组件&#xff…

云原生系列2-CICD持续集成部署-GitLab和Jenkins

1、CICD持续集成部署 传统软件开发流程: 1、项目经理分配模块开发任务给开发人员(项目经理-开发) 2、每个模块单独开发完毕(开发),单元测试(测试) 3、开发完毕后,集成部…

【人生苦短,我学 Python】(9)分支判断和循环

目录 简述 / 前言1. 顺序结构2. 选择结构2.1 单分支2.2 双分支2.3 多分支 3. 循环结构3.1 for 循环3.1.1 range() 3.2 while 循环3.2.1 break 语句3.2.1 continue 语句 3.3 死循环 4. enumerate 函数5. zip 函数文章传送门 简述 / 前言 前面讲了输入、输出和文件的读写&#x…

【UML】第5篇 UML中的视图和图

目录 一、视图和图 二、图的种类 2.1 结构图 2.2 行为图 图是UML中最重要的概念了,起码我是这么认为。 上篇关于低代码的文章,我也说了,未来也许AI编码,我们更重要的工作,是能够为业务进行建模,拆解&a…

【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一:使用外部中断0控制蜂鸣器,外部中断1控制直流电机二、扩展实验二:修改定时器初值,设定3秒钟的定时时间让LED模块闪烁三、扩展实验三:使用定时器1和数…

KBP310-ASEMI适配高端电源KBP310

编辑:ll KBP310-ASEMI适配高端电源KBP310 型号:KBP310 品牌:ASEMI 封装:KBP-4 最大平均正向电流:3A 最大重复峰值反向电压:1000V 产品引线数量:4 产品内部芯片个数:4 产品内…

哈希算法专栏二《力扣题目练习》

引言 在了解了哈希表的基础理论之后,我们就可以开始进行刷题实战了。下面是我在力扣上找的一些题目,认真刷完并理解下面的题目,相信读者至少可以初步掌握哈希算法的思想了。 LeetCode242有效的字母异位词 242. 有效的字母异位词 已解答 简…