单体架构是传统的软件模型。微服务代表了后期的软件开发方式,但这并不意味着单体架构已经过时。
假设您刚开始为一家科技初创公司工作,并被指派为新公司实施 IT 计划。您面临一系列决策,但没有哪一项决策像选择单体架构或微服务架构那样基础且影响深远。软件架构的选择不应孤立进行,也不应在不了解组织当前及未来数据处理需求的情况下作出,因为无论选择哪种架构方式,都将深刻影响组织有效实现其业务目标的能力。
因此,这里的利害关系非常重大。而且因为您是新任命的 IT 总监,这对您个人而言也是一个重要的决策,如果您明智地选择,可能会为您带来前所未有的职业发展机会。
那么,您会选择哪一种?首先,让我们来了解您的选项。
如前所述,单体架构是传统的软件开发模型。在这种架构中,一个代码库承担多个功能(即业务功能)。计算机内核控制所有功能。在单体应用中,整个应用所需的所有代码都集中维护在一个中心位置。
单体应用通常包含以下组件:
单片架构的使用也可能带来问题:
另一种软件开发模型微服务,是一种云原生架构风格。在微服务架构中,应用程序基于多个松散耦合的独立组件或服务构建。微服务应用程序拥有自己的技术栈,即一组协同工作的技术集合,用于完成特定任务。
微服务的主要优势在于,系统可以轻松更新,以在应用程序中实现新的业务功能,而不会影响整个系统。这可以为时间和人力带来显著节省。
微服务的优势很多。它们能适应持续的业务增长和新的技术变革:
微服务提供了明确的优势,但其复杂性确实会产生某些问题:
在对单体架构和微服务架构进行正面比较之前,我们应该补充一些历史背景,以提供更广泛的背景信息。
在某种程度上,很难将单体架构的起源追溯到一个具体的日期;技术越复杂,越难精确确定该技术的确切诞生时间。单体架构也是如此,其开发大约始于 20 世纪中叶。
International Business Machines (IBM®) 是这一关键早期开发中的重要参与者。根据 DZone 投稿者 Pier-Jean Malandrino 的说法,“……像 IBM 这样的公司通过在 1960 和 1970 年代开发大型主机计算机,在早期软件架构的定义中起到了关键作用。”1
单体架构并非完美,它们通常使用极其基础的编程语言编写,且设计初衷是供单台计算机读取。由于整个系统只存在于一台计算机中,所有计算机组件都是高度耦合的。扩展几乎不存在或极其有限,通常需要对整个系统进行重建。
另一方面,如果回顾来看单体架构显得原始,这部分原因在于它是最早出现的架构形式,早于其他任何软件架构系统。随着时间推移,它一直被证明是实用的,甚至是具有弹性的。单体架构在引入七十年后仍然被使用,这在一个通常唯一不变的就是不断变化的行业中,本身就说明了很多问题。
单体架构经久不衰,但它不再是唯一的选择,而且这种情况已经持续了一段时间。随着 1980 年代的推进,软件工程开始朝向模块化发展,并采用面向对象的编程语言。到了 1990 年代,分布式系统的舞台已经搭建完成,这些系统能够利用网络计算的最新进展。
这最终促成了微服务的发展,微服务在 2000 年代云计算和容器化技术兴起后得到广泛应用。微服务架构的创建是为了改进单体模型,使其适应快速扩展和去中心化系统。
如今,在 2020 年代,软件开发可基于单体架构或微服务架构进行。根据我们对技术变革的预期,最初的想法可能是认为较新出现的技术更优,在某些情况下,这确实是如此。
然而,做出这种一概而论的判断是危险的,主要原因在于这根本不真实。仍有许多计算场景能够从单体架构模型的简洁性中受益。
两种软件架构各有优缺点,公司在采用其中一种系统之前,需要仔细评估这两种类型,并考虑其预期的应用程序开发需求。
从关键操作阶段的角度来看,单体架构和微服务架构有何不同?
无论是使用单体架构还是微服务架构,都可以实现近乎无限的用例。以下是一些最为常见的用例。
如果在没有充分考虑最重要因素(即您的科技初创公司的特定需求)的情况下独立完成单体架构或微服务架构的全规模实施设计,那么这一实施注定会出现偏差。
作为 IT 总监,这是在规划软件基础设施决策时最关键的工作。了解何时使用某种架构风格至关重要,同样也需要根据实际需求判断最适合的系统。
自我分析练习非常有价值,因为您的工作不仅是为组织选择最优的架构系统,还需要准确预测公司在未来数月甚至数年内可能需要的架构系统。在某种程度上,您实际上是在承担预测未来的任务。
因此,尽管单体架构可能看起来非常适合您的初创公司,但您需要预测未来的增长情况。如果预计会有大规模扩张,提前投资微服务架构可能更为明智。有许多变量需要考虑:
所有链接均为 ibm.com 外部链接
1“软件架构的演变:从单体到微服务及其他”,Pier-Jean Malandrino,DZone,2023 年 11 月 11 日。
2“2014 至 2027 年全球零售电商销售额”,Statista,2024 年 5 月
完全托管的单租户服务,用于开发和交付 Java 应用程序。
使用开发运维软件和工具,在多种设备和环境中构建、部署和管理云原生应用程序。
云应用程序开发意味着一次构建、快速迭代和随处部署。