微服务是有价值的,但其溢价使它们不适合不太复杂的软件系统。-MartinFowler微服务很有价值,但也有额外的成本,这使得它们不适合不太复杂的软件系统。——MartinFowlerMartinFowler著名的微服务架构风格是这些年的热门话题。我们听到很多关于微服务的信息。无论您将它们视为一种新的体系结构方法,还是仅仅是SOA的重新打包,这个概念已经席卷了开发人员社区。这篇文章的主要思想是基于MartinFowler关于微服务的文章,告诉人们什么时候应该考虑使用微服务。我们现在看到的是,太多的团队太急于拥抱微服务,而没有意识到微服务给自己带来了复杂性。这不仅增加了项目的成本和风险,而且常常使项目陷入严重的麻烦。虽然围绕微服务的炒作很烦人,但微服务这个术语对于描述一种已经存在了一段时间的架构风格确实很有用。这里重要的不是你对炒作有多反感,而是它提出的架构问题:微服务架构是你正在开发的系统的好选择吗?对一个有趣问题的任何体面的回答都以“这取决于......”-KenctBeck一个有趣的问题,任何体面的答案都以“这取决于......”开头。-KentBeckKentBeck引述我的回答必须从“取决于”开始,但随后我必须将注意力转移到它所依赖的东西上。使用微服务的关键是您正在考虑的系统的复杂性。微服务方法主要设计用于处理复杂的系统,但为了做到这一点,该方法引入了自己的一组复杂性。当您使用微服务时,您必须自动化部署、监控、故障处理、最终一致性以及分布式系统引入的其他问题。有很多众所周知的方法来处理这些问题,但它需要额外的努力,而且我所知道的软件开发人员中似乎没有人有很多空闲时间。微服务和复杂性所以主要的指导原则是:除非你的系统太复杂而不能作为一个整体来管理,否则根本不要考虑微服务。大多数软件系统应该构建为单一的整体应用程序。请注意在这个整体应用程序中保持良好的模块化,但不要尝试将其分离为单独的服务。康威定律:任何设计系统(广义定义)的组织都会产生一种设计,其结构是组织沟通结构的副本。康威定律:任何设计系统(广义定义)的组织都会产生一种设计,其结构是组织沟通结构的副本。该结构是组织沟通结构的复制。康威定律驱使我们使用微服务的复杂性来自很多方面,包括处理:大型团队、多租户、支持多种用户交互模型、允许不同的业务功能独立发展,以及可扩展性。但最大的因素是它的庞大规模——人们发现他们拥有一个无法修改和部署的庞大单体应用程序。此时,有一种挫败感。许多归因于单体的问题对其架构风格并不重要。很多人会说,你需要用微服务,因为单体应用不太可能实现持续交付。然而,有很多组织已经成功地使用了千篇一律的部署方法:Facebook和Etsy是两个著名的例子。我们也经常听到,随着系统规模的增加,你必须使用微服务,才能拥有可以轻松修改和替换的部分。但是,您没有理由不能开发具有明确定义的模块边界的单体应用程序。没有理由,至少在理论上,在实践中模块边界似乎太容易被打破,单体太容易纠缠在一起。我们还应该记住,服务的大小在不同的微服务系统之间也有很大差异:微服务系统从60人团队和20项服务到4人团队和200项服务不等。目前还不清楚服务的规模在多大程度上影响了额外成本。随着规模和其他复杂性因素进入项目,我们看到许多团队发现微服务是更好的选择。但除非您正在处理这种类型的复杂性,否则请记住,微服务方法的代价很高,这会大大减慢您的开发速度。所以,如果你能让你的系统足够简单以避免对微服务的需求,那就去做吧。结论我们仍然相信,微服务可以在增强团队自主权和加快变更频率方面为组织提供巨大而显着的优势。分布式系统带来的额外复杂性需要额外的成熟度和投资。但令人担忧的是,一些团队在不了解做好所需的开发、测试和运营变更的情况下就急于采用微服务。合理的一般性建议仍然很简单:避免嫉妒微服务,在急于开发更多服务之前先从一两个服务开始,给您的团队时间来调整和了解正确的服务粒度级别。微服务已成为现代基于云的系统中的领先架构技术,但我们仍然认为团队在做出此选择时应谨慎行事。微服务嫉妒诱使团队通过拥有大量服务来使他们的架构复杂化,仅仅因为它是一种流行的架构选择。Kubernetes等平台使部署复杂的微服务集变得更加容易,并且各种供应商正在推动他们的解决方案来管理微服务,这可能会带领团队走得更远。但重要的是要记住:微服务以开发复杂性换取操作复杂性,并且需要自动化测试、持续交付和DevOps文化的坚实基础。MartinFowler是软件开发方面的作家和国际知名演讲者,专注于面向对象的分析和设计、统一建模语言、领域建模和敏捷软件开发方法,包括极限编程。肯特·贝克(KentBeck,英语:KentBeck,1961-),美国著名软件工程师、作家,对软件工程做出了巨大贡献。他是Smalltalk软件的开发者,设计模式的先驱,测试驱动开发的倡导者,极限编程的创始人之一。曾在Facebook工作,现在在Gusto。他曾经为Smalltalk写过SUnit单元测试框架,然后把这个框架移植到Java上写了JUnit。2001年参与敏捷宣言(AgileManifesto)的签署,是17位发起人之一。MarvinEdwardConway是一位计算机科学家、程序员和黑客,他制定了著名的康威定律:“设计系统的架构受产生这些设计的组织的通信结构支配。”参考:https://martinfowler.com/bliki/MicroservicePremium.htmlhttps://www.thoughtworks.com/radar/techniques/microservice-envy文章来自:热爱科学的Wesley,作者:王云飞。如需转载本文,请联系热爱科学的卫斯理,今天头条号。
