相比微服务,模块化单体应用架构可能是更好的选择?

模块化软件架构:使用单体、微服务和模块化单体的优缺点 如您所见,模块化系统可以作为微服务或传统单体架构的良好替代品。每种方法都有其优点和局限性。您应该为您的项目考虑哪一种呢?这完全取决于您将要工作的系统的性质。为了使这个决策更加简单,请查看以下总结主要优点和缺点的表格。 阅读详情
关注公众号!留言:参考模板 ,
送《技术方案设计参考模板》

1 引言

微服务架构风格由来已久,行业内已经进行了大量的工程实践。对于具备一定规模的系统,设计人员基于业务内聚性进行微服务化设计已经是一个普遍使用的方式。但微服务架构风格的“滥用”使得我们需要重新审视微服务架构风格在工程实践中是否是最优选择。

2 微服务架构风格的工程实践困境

典型的微服务架构风格如下:基于独立的业务域划分为不同的微服务单元,每个单元逻辑上或物理上独享数据库。各个微服务单元独立部署、独立伸缩。

图片

基于微服务架构风格的特性,其具有易伸缩、易扩展的特性。通过明确清晰的服务编辑,最大程度降低服务间的耦合。同时,微服务单元的技术栈可以异构,按照各自不同的诉求进行技术选型。

微服务具有明天的架构风格特性和优势,但在大量的工程实践中,其挑战主要来源于不合理的应用导致形成庞大的分布式单体和维护负担。在个人经历的平台系统中例子比比皆是,例如:

1.从 0 到 1 建设的私域电商系统开发初期即基于“微服务”划分了不同子系统,极大增加了系统复杂度和团队研发成本。

2.有些系统的体量不大,但子系统数量多个20~30个,研发成员只有5-6人,平均每人维护4+系统,可想认知成本和研发成本多高。

3.有些系统虽然划分了子系统,但其划分规则多基于“技术”视角,而非业务域视角,每个微服务并不是真正的业务闭环。随着系统迭代存在大量的调用依赖、高度耦合,形成庞大的分布式单体应用

3 温故知新

3.1 单体应用架构

单体应用架构也是使用比较普遍的应用架构,适用于小规模系统,典型的开发模式如下:

图片

传统单体应用架构的优势:

1. 开发简单:单一代码库:所有功能模块都集中在同一个代码库中,开发人员可以快速理解和修改代码。快速迭代:由于没有复杂的模块划分和通信机制,开发团队可以快速实现新功能并发布。

2. 部署简单:单一部署单元:整个应用作为一个整体部署,无需管理多个独立服务或容器。简化运维:部署和回滚过程简单,减少了运维的复杂性。

3. 性能高效:所有模块在同一个进程中运行,通信通过本地调用完成,避免了网络延迟和通信开销。资源利用率高:由于没有服务间的网络通信和额外的资源隔离层,资源利用更高效。

4. 调试和测试简单:集中式日志和监控:所有日志和监控数据集中在一个地方,便于排查问题。端到端测试:测试环境简单,可以轻松进行端到端测试,确保整个应用的功能一致性。

5. 成本低:基础设施成本低:无需为多个服务配置独立的服务器、数据库或容器,节省了硬件和云资源成本。开发成本低:开发团队无需掌握复杂的分布式系统设计和管理技能,降低了人力成本。

传统单体的局限性

1.紧密耦合:模块通常紧密耦合,难以独立开发和测试。

2.难以扩展:在需要扩展时,传统单体应用程序往往需要重构整个系统。

3.技术债务:传统单体应用程序容易积累技术债务,尤其是在模块边界不清晰的情况下。

3.2 模块化单体应用架构

模块化单体架构是一种将软件应用程序组织为一组模块的方式。每个模块高内聚、模块间低耦合,可以独立开发和测试,整个应用程序作为一个整体单元部署。

Examples of the 7 modules in a typical e-commerce application and how they can be independantly deployed when needed

从底层的工程视角看,模块单体应用内部基于“模块化”进行代码组织,例如Java元的Maven Module。每个模块具有清晰明确的边界,多数情况下这些边界基于业务边界进行划分。模块间的交互基于模块间的协议契约(API或消息)。

图片

模块化单体的优点

1.简化开发和测试:由于模块是独立的,开发和测试过程更加简化。

2.清晰的模块边界:每个模块都有明确的业务能力边界,减少了模块间的耦合。

3.易于部署:整个应用程序作为一个单元部署,减少了部署复杂性。

4.灵活性:可以根据需要提取和扩展特定模块,而无需重构整个应用程序。 模块之间的接口可以作为未来微服务之间的契约,支持独立部署和扩展。

5.易于迁移到微服务:由于模块的独立性,未来可以轻松地将模块转换为微服务。

模块化单体的挑战

1.模块边界管理:需要仔细管理模块之间的边界,以避免紧密耦合。

2.扩展限制:虽然可以提取模块进行扩展,但在大规模扩展时可能会遇到限制。

3.技术债务:如果不加以管理,模块化单体可能会积累技术债务。

3.3 模块化单体 vs 微服务架构 

模块化单体与传统单体的主要区别在于,模块化单体由定义明确、独立且可提取的模块组成,每个模块都拥有特定的业务能力边界。当模块的规模和复杂性增加,需要不同的资源和部署时,更容易迁移到微服务架构,因为:

1.从领域驱动设计的角度来看,它已经指定了微服务的理想边界。

2.每个模块未来都可以成为独立的微服务候选。

3.接口可以演变为独立部署的微服务之间的契约。

图片

4 应用架构选型的建议

原则上,优先考虑模块化单体架构是否可以满足当前诉求,避免一上来就进行复杂的微服务拆分。具体应该基于具体情况具体分析,不能一概而论。

例如,对于成熟的平台型系统,在明确的系统性能、吞吐量预估指标下,直接微服务化可能是最有选择。又例如,基于不同模块的伸缩性不同,拆分为独立的微服务系统也是合理选择。

根本上,应用架构选择是一种架构决策,需要设计人员进行权衡。

4.1 为什么要从模块化单体架构开始?

1. 初始阶段更少的复杂性

在任何项目的初期,团队仍在了解领域和更大的生态系统。如果项目一开始就采用微服务方法,随着团队理解的深入,已经构建的微服务将直接受到影响。

相比之下,模块化单体设计具有较少的复杂性,使得修改更容易和快速。一旦团队对业务领域及其边界上下文有了扎实的理解,他们可以迁移到微服务架构。

2. 更简单的创建、部署和管理

在微服务方法中,每个服务必须独立部署,这增加了技术和操作复杂性。此外,每个服务可能需要单独处理,这增加了DevOps团队的负担。

在模块化单体架构中,模块作为一个单元生产和交付,使得应用程序的设计、部署和管理显著简化。

3. 更好的功能和稳定性

微服务可能会因为服务之间网络流量的增加而遇到性能问题。随着复杂性的增加,微服务也可能更容易出现错误和缺陷。

模块化单体架构中的模块被设计为相互流畅地工作,从而提高了性能和稳定性。

4. 成本效益

微服务需要额外的基础设施,如API网关、负载均衡、服务发现等。这使得它比模块化单体架构更昂贵,尤其是在开发的早期阶段。

在模块化单体中,所有模块可以部署在单个服务器上,所需的基础设施较少,因此更具成本效益。

即使基于模块化单体架构,团队也必须时刻关注单体架构的腐化问题。与微服务类似,模块的职责边界以及依赖关系也要仔细慎重的评审,尽量避免模块间随意的、双向调用。否则,随着系统的迭代,模块间的耦合问题会给后续系统的可维护性带来较大挑战,同时,也不利于后续从模块化单体向微服务的架构迁移。

4.2 何时迁移到微服务?

1. 当可扩展性成为关键因素

如果不同的模块需要不同的扩展方式,微服务可能是更好的选择。通过微服务,可以更轻松地独立扩展单个服务,从而实现对应用程序的更精细控制。

2. 当团队规模扩大

如果开发团队规模较大,导致复杂性增加,是时候迁移到微服务了。通过微服务,每个服务可以独立开发和测试,从而促进团队之间更好的协作。

3. 当需要多样化的技术

如果应用程序的不同部分需要不同的技术/语言,微服务是理想的选择。通过微服务,每个服务可以使用自己的技术栈,从而在开发过程中提供更大的灵活性。

4. 当对复杂领域有了扎实的理解

当对领域及其多个子系统有了扎实的理解后,微服务架构可以帮助封装和管理复杂性。通过将系统分解为更小、更专业的服务,应用程序将更容易维护和演进。

将微服务视为最终目标而非起点是有益的。在软件开发的早期阶段,模块化单体架构将为未来定义明确的边界上下文奠定基础,同时有助于控制膨胀的用例服务数量。

因此,在决定跳转到微服务之前,我们建议领导者考虑应用程序的规模和复杂性、预计的用户流量以及可用的技能资源。如果微服务看起来是一个巨大的跨越,模块化单体可能是你需要的跳板。

5 结语

虽然微服务架构风格有其独特优势,但前提是合理架构、划分业务单元。完全无脑的进行微服务化、拆分成庞大的子系统有时并不是一个好的选择,特别是针对初期项目,基于模块化单体应用架构可能是更好的选择。通过系统的不断迭代,随着上下文变化逐渐演进,是一个建议的方式。

模块化单体架构 对数据库中的相关表进行分组是引入逻辑隔离的一种方式。每个模块都有一个唯一的架构,其中包含模块的表。首先,将要提取的模块的表移动到单独的数据库中。如果您需要在模块之间设置严格的数据隔离规则,则可以采用这种方法。模块化单体内部的模块应该是独立的。下一个数据隔离级别是将每个模块的数据移动到单独的数据库中。与使用架构的数据隔离相比,此方法具有更多的约束。对于您的用例来说,这可能是一个值得的权衡。这里的想法是相似的:您正在使用单独的数据库进行数据隔离。我经常看到的单片架构的一个问题是组件之间的紧密耦合。 阅读详情

相关推荐

为什么微服务比单体架构更重要

在当今快节奏的技术环境中,企业需要可扩展且灵活的解决方案,以快速适应不断变化的需求。这就是为什么微服务架构相比传统的单体架构更具优势的原因。

hongfu951的专栏 562

浅析模块化单体会不会取代微服务架构

关于模块化单体的讨论很多。我们可以在许多趋势图中看到这一点。许多研发经理都在询问这是否是微服务或其他东西的替代品/替代品。 本文解释什么是模块化单体,为什么有些人认为它是微服务的替代品,以及我对使用不同架构模式的建议。

Java_LingFeng的博客 1649

深入了解微服务架构:原理、优势与实践指南

随着互联网和软件开发领域的不断发展,传统的单体架构在应对日益复杂的业务需求和快速变化的市场环境时逐渐显露出局限性。在这样的背景下,微服务架构应运而生,成为了一种创新的软件架构范式。微服务架构通过将应用程序拆分为一系列小型、自治的服务单元,每个服务单元都有自己独立的数据存储和业务逻辑,从而使得系统更易于开发、部署和维护。

fudaihb的博客 1790

多模块单体架构(按功能分模块)

多模块单体架构是一种将应用按功能拆分为独立模块的开发模式。该架构包含父模块(统一管理依赖和版本)、依赖管理模块(集中控制第三方库版本)、功能模块(实现特定业务)和启动模块(整合所有模块)。关键优势包括:模块化开发提升可维护性、统一依赖管理避免版本冲突、支持并行编译。实现时需配置必要的Maven插件,如单元测试插件(支持JUnit5)、版本管理插件(处理变量替换)和编译插件(解决SpringBoot3参数反射问题),通过合理的模块划分和依赖管理实现高效开发。

2301_80373862的博客 2152

Spring 学习总结(37)—— 了解什么是单体的模块化,Spring Modulith 入门实践

对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。此外,它还支持开发人员构建结构良好且业务领域对齐的Spring Boot应用程序。

科技D人生 2723

微服务架构与传统单体结构项目的比较和应用

然而,微服务架构也带来了一些挑战,如服务间通信的复杂性、部署和监控的复杂性等。因此,在选择适合的架构模式时,需要综合考虑项目的规模、复杂度和团队的技术能力。微服务架构则是将一个应用拆分为多个独立的服务,每个服务都有自己的代码库、数据库和业务逻辑。而在微服务架构中,通过使用负载均衡和故障转移技术,可以在一个服务模块出现故障时,自动将流量切换到其他可用的服务模块。与传统的单体结构项目相比,微服务架构提供了更高的灵活性、可扩展性和可维护性。微服务架构通过将应用拆分为多个服务模块,提高了系统的可用性和容错性。

LaotLisp的博客 289

模块化单体应用的数据隔离

模块化单体应用是一种日益流行的架构方法,它结合了模块化和单体设计的优点。模块化单体试图解决单体和微服务架构的不足之处。我经常看到的单体架构问题之一是组件之间的紧耦合。这导致系统不同部分之间存在依赖关系。模块化单体通过定义良好的模块边界和通信模式来强制执行更好的架构实践。但一个你不能忽视的方面是模块之间的数据隔离。数据隔离确保模块相互独立且耦合度低。今天,我将向你展示模块化单体的四种数据隔离方法:•...

小技术君 1307

Microservices Architecture vs Monolithic Architecture

2017年,随着云计算的兴起、容器技术的崛起以及微服务架构模式的兴起,越来越多的人选择采用微服务架构模式进行应用开发。在很多公司中,都已经或正逐步尝试采用这种架构方式。但是,很多技术人员并不了解微服务架构与传统单体架构之间的区别和联系,也没有想到如何从微服务架构向传统单体架构过渡,或者说,如何在一定程度上采用优秀的微服务架构而又保证其稳定性和可维护性。本文将通过介绍微服务架构与传统单体架构之间的主要区别及联系,进而阐述微服务架构与传统单体架构相比,优点及适用场景,以及如何选择适合自己业务的架构模式。

AI天才研究院 1153

基于 DDD 设计并实现模块化单体应用

译者丨盖磊 一个最近由 Kamil Grzybek 在 Github 发布的项目,给出了使用领域驱动设计(DDD,Domain-Driven Design)方法设计并实现一个单体(monolith)应用的详细介绍。该项目的目标,就是展示如何以模块化方式设计并实现一个单体应用。此外,Grzybek 还基于他在应用开发实践的收获,给出了一些有用的架构建议和设计模式。 Grzybek 是华沙 ITS...

ctrigger的专栏 1186

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2983

Altium AD20差分对走线设置方法

AD20的PCB差分对走线设置 1、原理图添加差分对 先在原理图中,讲要设置差分对的网络对添加网络标签。 名称前面的内容要相同,后缀用 _P 和 _N 加以区分。 最后使用 放置差分对,将两个网络标记。 2、编译,更改到PCB 编译,更新到PCB,确认差分对网络的出现。 验证更改,执行更改。将改动更新到PCB中。 PCB中,可通过 右下角 Panels - 调出 PCB 显示。来对已添加的差分对进行查看。 这时原本的走线有一点点小问题,需要删掉原来走线,设置差分对规则,并重新布线。

Mark_md的博客 3万+

单体、分布式、微服务、Serverless及新兴部署模式分析

软件架构的选择应基于业务需求、技术能力、团队经验等多方面因素。从单体到微服务,再到Serverless和新兴的服务网格与MaaS模式。每种部署模式都对应着不同的技术需求和业务场景,选择合适的架构模式对于提高开发效率、系统可维护性和业务扩展性至关重要。本文为大家提供了对不同软件架构模式的深入解析,希望能够帮助大家更好地理解每种架构的特点,以及它们在现代软件开发中的应用。

AI从业者的专栏 1394

NVMe-MI --- Message Servicing Model(消息服务模型)

本文主要介绍NVMe-MI消息服务模型,两个主要类别是请求消息和响应消息。并介绍带外机制消息服务状态机。

智小星的博客 2014

单体 soa 微服务 区别_什么是微服务架构,微服务相比较单体架构优势在哪?

一、什么是微服务微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,最早提出微服务架构概念的,是Fred George。他一位非常传奇的人物,从业40多年,接触过70+编程语言,就职过IBM、TW等多家公司,并在社区和大会上做过很多分享。二、为什么需要微服务架构?相比单一架构它有哪些优势单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好...

weixin_39612057的博客 215

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1482

通俗地解释一下 EMD(经验模态分解,Empirical Mode Decomposition)

EMD 就像把一碗“混在一起的面条”分成不同粗细的面条,方便你逐层分析每种波动。

qlkaicx的博客 1249

微服务架构

1、简述单体应用架构的问题 传统单体应用架构都是模块化的设计逻辑,程序在编写完成后会被打包并部署为一个具体的应用,而应用的格式则依赖于相应的应用语言和框架。 传统单体应用架构主要优点: 1、易于开发:当前开发工具的功能目标是支持单片应用程序的开发,这对于一个传统的单体应用来说非常容易实现。. 2、部署简单:只需将应用部署为简单的WAR文件即可部署,并且只需要部署一个单体应用即可。 3、易于伸缩:可...

weixin_43250197的博客 231

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1203

业务真的需要微服务吗

业务真的需要微服务吗?

SRE实战派 2374

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

上一篇文章详细讲解如何利用数据增强方法实现图像数据集的扩充,并以濒危水书作为案例讲解。这篇文章将详细讲解基于机器学习的水书图像识别方法,以图像像素统计为特征开展图像分类讲解,这是最基础的方法,也为后续深度学习图像分类描述提供支撑。基础性文章,希望对您有所帮助!让我们开始吧,且看且珍惜。

杨秀璋的专栏 990

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

ASP.NET Core 应用架构(七)

模块化单体是一种旨在结合传统单体架构和微服务的最佳特性的架构风格。它将软件应用程序组织成定义良好、松散耦合的模块。每个模块负责特定的业务能力。然而,与微服务不同,所有这些模块都作为一个单一单元部署,就像单体一样。模块化单体的核心原则是:将每个模块视为一个微服务。将应用程序作为单一单元部署。下面是成功微服务的基本原则,这些原则在第十九章微服务架构简介中进行了研究:每个微服务应该是一个业务上的统一单元。每个微服务应该拥有自己的数据。每个微服务应该独立于其他微服务。

龙哥盟 502

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

nacos基础(9):nacos配置管理之从单体架构到微服务

文章目录前言从单体架构到微服务1. 单体架构2. 微服务 前言 nacos配置管理应用与分布式系统 从单体架构到微服务 1. 单体架构 Web应用程序早期,大部分的web工程师将所有的功能模块打包到一一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API和UI访问的web模块等。 尽管也是模块化逻辑,但是最总它还是会打包成一个单体应用,这种将所有功能部署在一个web容器中运行的系统就叫做单体架构。 优点: 开发效率高:模块之间交互采用本地调用,并节省微服务之间的交互讨论时间和

不积跬步,无以至千里 766

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

2. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务概述与演变

微服务(Microservices)是一种将单一应用程序划分为一组小型、自治服务的架构风格。每个服务都围绕具体业务功能构建,可以独立部署、独立扩展,并通过轻量级的通信协议(例如HTTP REST API、gRPC、消息队列等)与其他服务进行协作。与传统的单体应用相比,微服务更加强调“分而治之”,使得每个模块都具备较高的独立性和灵活性。在微服务架构中,每个服务通常会有独立的数据存储和业务逻辑,能够由独立的开发团队负责管理和维护。

喵叔 1071

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【概念】微服务架构

微服务(Microservices)是一种,它将一个大型的、复杂的应用程序分解为一组小型的、互相独立的服务。每个微服务都专注于实现某一特定业务功能,并且可以单独部署、扩展和维护,具备自己的数据库或数据存储能力。这些服务通过轻量级通信机制(如RESTful API、消息队列等)进行交互和协作,以完成整个系统的业务逻辑。

软件工程探索之旅 551

架构演变之路:为何要搞微服务架构?

有不少朋友或同事都问过我这个问题:为什么我们要搞微服务架构,一个项目把代码从头撸到尾不是很方便吗,开发更快速,部署也容易。而且一提起微服务,涉及的技术就一大堆,好像几辈子也学不完。 怎么解答这个问题呢?我想还是通过架构的发展变迁史来说起,为什么会出现现在的各种架构。只有从整体上了解了架构的脉络,我们才好更加全方位的评估一个架构。为此,我们有理由来梳理一下架构发展的来龙去脉,究竟为何会出现微服务,...

peng_zhanxuan的技术博客 2363
上一篇: 浅谈业务系统代码与应用架构-回归代码本身
下一篇: 探寻软件架构的本质,到底什么是架构?
系统工程实验室
博客等级 码龄10年 258粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值