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

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

  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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JVM基础】 JVM 如何加载一个类以及类加载机制

文章目录 1、什么时候一个类会被加载?1、包含 main 方法的主类2、非 包含 main 方法的主类,什么时候去加载? 3、类加载器如何加载一个类?1、验证阶段:2、准备阶段:3、解析阶段:4、初始化&#x…

智能化安防与监控:全球发展、挑战与未来趋势

导言 智能化安防与监控系统在全球范围内得到广泛应用,成为社会安全和公共管理的重要工具。本文将深入研究其发展历程、遇到的问题及解决过程、未来的可用范围,以及在各国的应用和未来的研究趋势,以探讨在哪些方面能取胜,并在哪些方…

uniapp-uni-icons组件@click.stop失败解决~

你们好,我是金金金。 场景 可以看见我右侧有两个icon,点击的时候 会影响到折叠面板的打开,这让我很是苦恼,然后我使用了click.stop修饰符阻止事件冒泡 排查 排查之前我先贴一下代码 报错截图 可以看到找不到属性stopPropagation&…

【逆向分析篇】APK逆向脱壳过程

【逆向分析篇】APK逆向脱壳过程 简单写下Android应用(APK)的逆向脱壳过程—【蘇小沐】 文章目录 【逆向分析篇】APK逆向脱壳过程(一)Apk的文件结构1、META-INF目录1)MANIFEST.MF文件2)CERT.SF文件3&#x…

HackTheBox - Medium - Windows - Aero

Aero 这个机器利用了今年比较新的cve,关于windows11的漏洞,类似于lnk、scf,但这个危害更高,通过易受攻击的windows11 利用theme、msstyles来实现RCE. Aero 是一台中等难度的 Windows 机器,最近有两个 CVE:…

手把手教你创建一个实时互动的AI数字人直播间!

数字人是什么?数字人是利用人工智能技术实现与真人直播形象的1:1克隆,即克隆出一个数字化的你自己,包括你的形象、表情、动作和声音都会被克隆下来,让你能够拥有接近真人的表现力。 1.首先您需要独立部署青否数字人SaaS系统&#…

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界 写在最前面观后感其他有趣的专题课程 写在最前面 嘿,你是不是对科技和创新充满好奇?2023 英特尔 On 技术创新大会线上活动邀请你一起探索最前沿的科技世界! 这不仅是一场普通的聚会&…

关于“Python”的核心知识点整理大全31

目录 12.4.2 在屏幕上绘制飞船 alien_invasion.py ​编辑12.5 重构:模块 game_functions 12.5.1 函数 check_events() game_functions.py alien_invasion.py 12.5.2 函数 update_screen() game_functions.py alien_invasion.py 12.6 驾驶飞船 12.6.1 响应…

CVE-2023-33246 RocketMQ RCE漏洞

一、RocketMQ简介 RocketMQ是一款纯java、分布式、队列模型的开源消息中间件,主要用于在分布式系统中进行异步消息传递,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等功能。 RocketMQ有四个核心组成部分: NameServer&#xff1…

HTML5刷题笔记

在 HTML5 中,onblur 和 onfocus 是:事件属性 onblur 和 onfocus 属于焦点事件: onblur:失去焦点 onfocus:获取焦点 HTML5事件window 事件属性 针对 window 对象触发的事件: onafterprint script 文档…

数据结构课程设计

计算机科学与技术系 《数据结构课程设计》评分表 设计题目 39. 如下图所示,编写可视化算法将从顶点v能到达的最短路径长度为k的所有顶 点标记为红色(最短路径以路径上的边数计算)。 成绩 课 程 设 计 主 要 内 容 内容编写可视化算…

《网络设备配置与管理》综合训练,华为ensp测试,MSTP\VRRP\OSPF\RIP\BGP\路由引入

1.设备基础信息配置 (1)根据表2IPv4地址分配表,修订所有设备名称。 (2)根据公司网络规划,在所有交换机上创建VLAN10、VLAN20。为了保证不同交换机上的同一个VLAN的成员之间能够相互通信,需要配…

同一个数组中对象去重

封装方法 fn1 (tempArr) {this.echartList.map(item > {for (let i 0; i < item.data.length; i) {for (let j i 1; j < item.data.length; j) {if (item.data[i].deviceId item.data[j].deviceId && item.data[i].time item.data[j].time && it…

[网络安全]在win2000虚拟机上创建隐藏账户

手工创建隐藏账户 1.你需要一台win2000 2.winR->cmd->regedt32 增加HEY_LOACL_MACHINE\SAM\的权限,标头有安全&#xff0c;点击&#xff0c;然后勾选 3.新建账号&#xff0c;例如HiddenAccount$($表示在命令行下不现实此用户&#xff09; net user HiddenAccount$ 123456…

Linux:ELF 可执行文件的解析与其加载的原理

文章目录 ELF 可执行文件需要的前置知识ELF 可执行文件的程序头部表 加载可执行目标文件QA加载器如何工作&#xff1f; 参考 ELF 可执行文件 我们已经看到链接器如何将多个目标文件合并成一个可执行目标文件。我们的 C程序&#xff0c;开始时是一组 ASCII 文本文件&#xff0c…

实验4.3 动态路由RIPv2协议的配置

实验4.3 动态路由RIPv2协议的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.配置交换机和路由器的接口的IP地址等参数。2.配置动态路由RIPv2协议&#xff0c;实现全网互通。 六、任务验收七、任务小结八、知识链接1&#xff0e;RIP协议简介2&#xff0e…

Linux开发工具——vim篇

vim开发工具的使用 文章目录 vim开发工具的使用认识vimvim常用三种模式vim正常模式命令集模式切换移动光标删除文字赋值替换撤销上一次操作更改跳到指定的行 vim末行模式命令集列出行号跳到文件中的某一行&#xff1a;保存文件离开vim查找字符&#xff1a; 总结题外话&#xff…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

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

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

万兆网络之疑难杂症(二)

症状&#xff1a;测线仪8芯全亮&#xff0c;网速只有百兆 某台计算机测速发现只有90多M/s速度&#xff0c;关于iperf测速可以参考之前的文章 万兆网络之线路测速 Win11系统查看网络属性为1000Mbps&#xff0c;还是扯皮的装修方&#xff0c;4个工位只布了2条线&#xff0c;还…