当我听到有关使用微服务架构的团队的故事时,我注意到了一种常见的模式。
几乎所有成功的微服务故事都始于一个庞大的整体,并且被分解了
几乎在所有情况下,我都听说过从头开始构建为微服务系统的系统,但最终却陷入了严重的麻烦。
这种模式使我的许多同事争辩说,即使您确定应用程序足够大,也值得这样做,但您不应该使用微服务启动新项目。 。
微服务是一种有用的体系结构,但是甚至他们的拥护者都说使用微服务会产生大量的MicroservicePremium,这意味着它们仅在更复杂的系统中有用。这种溢价,实质上是管理一套服务的成本,将减慢团队的速度,为更简单的应用提供整体支持。这导致了一种以整体优先为先的策略的有力论据,在这种策略中,即使您认为以后可能会从微服务架构中受益,也应该首先将新应用程序构建为整体。
第一个原因是经典的Yagni。当您开始一个新的应用程序时,您如何确定它将对您的用户有用?可能难以扩展设计欠佳但成功的软件系统,但是与逆向运算相比,这仍然是一个更好的选择。正如我们现在所认识到的那样,找出一种软件想法是否有用的最佳方法通常是构建一个简单的版本并查看其效果如何。在第一个阶段中,您需要确定速度的优先级(从而确定反馈的周期时间),因此微服务的优缺点是您不应该遇到的麻烦。
从微服务开始的第二个问题是,只有当您在服务之间找到良好,稳定的边界时,微服务才能很好地工作-本质上这是绘制正确的BoundedContext组的任务。服务之间功能的任何重构都比整体中难得多。但是,即使是在熟悉领域工作的经验丰富的建筑师也很难在一开始就正确确定界限。通过首先构建一个整体,您可以找出正确的边界,然后再将微服务设计刷在它们上面。它还使您有时间开发更细粒度的服务所需的MicroservicePrerequisites。
我听说过执行整体优先策略的不同方法。合理的方法是精心设计一个整体,同时注意软件在API边界和数据存储方式上的模块化。做得好,向微服务转变是一个相对简单的事情。但是,如果我听了很多这样的讲解,就对这种方法感到更加自在。 [1]
一种更常见的方法是从整体开始,然后逐渐剥离边缘的微服务。这样的方法可以在微服务体系结构的核心中保留大量的整体组件,但是随着整体组件相对静止,大多数新的开发都发生在微服务中。
另一种常见的方法是完全替换整体。很少有人将这种方法视为值得骄傲的方法,但是将整体构建为牺牲性体系结构有很多优势。不要害怕构建将被丢弃的整体,尤其是如果整体可以快速将您推向市场。
我遇到的另一条路线是从仅几个粗粒度的服务开始,这些服务比您最终期望的服务要大。使用这些粗粒度的服务来习惯于使用多个服务,同时享受这样的事实:这种粗粒度会减少您必须做的服务间重构量。然后,随着边界的稳定,分解为更细粒度的服务。 [2]
虽然我的大部分联络人都倾向于采用“整体优先”的方法,但这绝不是一致的。相反的说法是,从微服务开始,您可以习惯于在微服务环境中进行开发的节奏。要以足够模块化的方式构建整体,以便将其轻松分解为微服务,需要花费很多甚至太多的纪律。通过开始使用微服务,您可以使每个人从一开始就习惯于在单独的小型团队中进行开发,而使团队按服务边界分开,则可以在需要时更轻松地扩大开发工作量。这对于系统更换特别可行,在系统更换中,您更有可能尽早提出足够稳定的界限。尽管证据很少,但我认为除非您具有在团队中构建微服务系统的合理经验,否则您不应该从微服务入手。
我还没有足够的轶事来确定如何使用整体优先策略。这些是微服务中的早期事物,可以学习的轶事相对较少。因此,关于这些主题的任何建议都必须被视为尝试性的,无论他们有多自信。
Sam Newman描述了一个团队的案例研究,该团队考虑在未开发项目上使用微服务。
1:您不能认为您可以采取任意系统并将其闯入微缩术。大多数系统在其模块之间获取太多依赖性,因此可以' t被明智地分开。我听说过大量的病例,在那里试图分解一只巨石已经迅速结束。我还听说过几个案例,逐渐走到微服务的路线已经成功,但这些情况需要采用相对良好的模块化设计。
2:我认为严格来说,你应该称之为A" Duolith"但我认为这种方法遵循整体第一策略的本质:从粗粒度开始,以获得知识并稍后分开。
我从Congues偷走了大部分思考:James Lewis,Sam Newman,Thiyagu Palanisamy和Evan Bodcher。 Stefan Tilkov'关于早期草案的评论在澄清我的思想中发挥了关键作用。 Chad Currie创造了可爱的格里龙。史蒂文·洛厄斯,帕特里克库亚,让罗伯特D'阿莫尔,切尔西·克莫罗,阿什科拉姆裔,丹萨··塞德,帕斯坦尼亚·塞尔斯,克里斯·莫里斯,克里斯·福特和我们的内部邮寄清单上讨论了草稿。