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

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

关于模块化单体的讨论很多。我们可以在许多趋势图中看到这一点。许多研发经理都在询问这是否是微服务或其他东西的替代品/替代品。

本文解释什么是模块化单体,为什么有些人认为它是微服务的替代品,以及我对使用不同架构模式的建议。

单体应用的缺点 = 微服务的优点 单体架构模式有很多缺点。这些促使几乎每个人都转向微服务模式。话虽如此,微服务并非都是好的,它们也有挑战和弱点,我将在后面简要描述。单体应用的主要缺点和微服务优点是:

  • 依赖项——内部代码和数据库依赖项

  • 隔离——每个功能都会影响其他功能(性能、安全等)

  • 可重用性——对象的有限重用

  • 代码复杂性 - 大量带有内部引用的代码

  • 性能——不可能仅在需要的功能中调整和解决性能问题,而且成本巨大

  • 可维护性

  • 可扩展性——无法仅扩展特定功能,要么全有,要么全无

  • 弹性——没有选择仅在需要时以具有成本效益的方式实施弹性

  • 测试周期时间——每次更改,即使是很小的更改,都需要完整的系统测试

  • 使用多种技术(适合每个业务需求的技术)

  • 并行工程

  • 敏捷 SDLC

  • CI/CD

微服务

由微服务、容器、CI/CD 和 DevOps 组成的 Cloud Native 改变了游戏规则;它改变了我们构建和部署应用程序的方式。创建微服务作为基础是为了解决这些单体挑战。

简单来说,微服务是一种架构模式,它将应用程序分解成更小的、独立的组件,这些组件不依赖于特定的技术堆栈(编码语言、数据库等)。

这些小组件称为“服务”,通常部署到容器中。 微服务“大小”的最佳实践是业务领域或业务实体中的一项功能,例如支付、检查库存、客户 CRUD、产品目录、产品定价、送货地址、送货管理等。 微服务并不都是好的,它们也有自己的挑战,例如:

  • 工作成本——许多管道、安全规则等。

  • 基础设施成本——许多容器/pod

  • 解决方案复杂性——许多组件

  • 数据共享——应用级别和业务领域级别的表/实体

  • 代码共享(除非使用 MonoRepo)

  • 数据所有权——多个服务拥有的特定表/实体

  • 缓存

  • 业务领域报告和仪表板

  • 跨微服务特性

  • GUI(如果实现了微前端架构)

  • 端到端测试

  • 日志记录和问题根本原因分析

模块化单体

模块化单体应用并不新鲜。在大多数情况下尚未完全实施的理论最佳实践总是将系统分解为模块。以正确的方式将系统拆分为模块是一个模块化的单体。

模块化单体的常见替代名称是“宏服务”。宏服务将系统分解为功能(一个功能由多个业务域组成)。 模块化单体/宏服务的高级技术特征:

  • 在模块化单体中,就像微服务一样,每个模块通过 API 与另一个模块通信,最好是松散耦合的异步通信。

  • 在像单体一样的模块化单体中,系统有一个数据库模式,而不是微服务,每个微服务都应该有自己的模式。

  • 通常,模块化单体中的所有模块都在同一个 VM 上运行。或者每个模块在特定的专用 VM 上运行。模块太大而无法放入容器中。

与事实上的单体应用相比,使用模块具有许多优势:

  • 更简单的管理

  • 更多隔离

  • 更少的依赖

  • 降低企业责任风险

  • 提高可重用性

  • 更好的可维护性

  • 更简单的测试

  • 更好的安全性

现在我们了解了为什么从单体架构切换到模块化单体架构更好,我们将比较模块化单体架构和微服务。模块化优于微服务的优点是:

  • 更简单的操作和支持

  • 更少的 API 带来更好的性能

  • 降低基础设施成本

  • 本机数据共享、报告和仪表板

微服务相对于单体架构的优势与模块化单体架构的优势完全相同,因此直接得出的结论是,在从头开始构建系统时,模块化单体架构无法替代微服务。 从两端握住大棒,一边是单体,另一边是微服务,都是微型服务。

普通保险示例

在过去,普通保险是一个巨大的系统,一个单体,就像养老金、长期储蓄、人寿、健康、航运等等。

有许多选项可以将单体分解为模块单体--纵向或横向的。纵向将基于一般的保险类型,如汽车、住宅、旅游等。横向将基于功能:客户、政策、索赔等。

将单体分解成微型服务将是纵向和横向的结合,将产生汽车保单(汽车保单与家庭、旅行和商业保单几乎没有共同之处)、汽车索赔、旅行保单、旅行索赔等。

将单体分解为微服务是每个迷你服务中的一个功能或业务实体,将产生:汽车客户、汽车保单、汽车保单保险、汽车保单账单、汽车保单付款、汽车保单文件、汽车供应商、汽车评估师、汽车索赔、汽车索赔法律、汽车索赔保险支付、汽车索赔赔偿等。

我们可以使用迷你服务和微服务的组合进行细分:

  • 付款是一样的,不管是汽车保险、房屋保险等,所以我们有一个付款的微服务。

  • 管理文件和档案是一样的,所以我们有一个文件微服务。

  • 客户大多是一样的,所以我们有一个客户微服务(值得商榷。有些人倾向于拥有汽车客户微服务,因为有一些独特的属性,然后在一个外部系统或一个专门的微服务中管理客户360。我更倾向于拥有一个客户微服务,因为大多数属性是相同的,而且我们想集中查看一个客户的所有信息。在这种情况下,我们可以在汽车保单微服务、旅行保单微服务等中管理客户的独特信息。)

  • 对于每个保险(汽车、旅游等),我将有一个专门的保单微服务(例如汽车保单、旅游保单等),它将包括保单、保险、核保、除外责任等。

总结

在现代化项目中,我们采用现有系统(可能是单体系统)并对其进行重建。重建的需要可能有很多原因:云迁移、技术债务、安全风险、拥有成本、交付业务需求的能力等等。在现代化项目中,必须做出的首要决定之一是我们是要迁移系统还是从头开始构建系统。

在某些情况下,即使从头开始构建系统的成本要高得多——这仍然是值得的,无论是因为技术债务的水平,还是因为新的和未来业务需求的数量。如果我们选择现代化路径,我更喜欢使用模块化单体架构模式,因为它降低了我们的风险和成本,支持增量迁移,并改善了当前的单体状况。

从头开始构建新系统时,我更喜欢结合使用微服务和迷你服务。模块化单体的缺点是如此之大,以至于在我看来,这不是一个可行的选择。有什么不同的见解欢迎提出。

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

相关推荐

Spring Modulith:模块化单体应用的架构设计

Spring Modulith为构建结构良好的模块化单体应用提供了一套完整的工具和方法论。它通过强调模块自治、显式接口和内部封装,帮助开发团队实现代码的高内聚低耦合,同时保持单体应用的部署简单性。这种架构模式特别适合中小型团队和尚未面临极端扩展性挑战的项目,为他们提供了一个理想的起点和未来演进的灵活路径。Spring Modulith的关键优势在于它提供了丰富的测试支持、模块间通信机制和持久层设计指导,使得开发者能够构建易于理解、易于维护且具有良好扩展性的应用程序。

程序媛学姐的博客 2791

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

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

系统工程实验室 1332

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

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

科技D人生 2723

moduliths: 使用Spring Boot构建模块化单体架构的工具

传统上,架构决策和实际情况之间的联系一直是命名约定,这些约定很容易产生分歧,并导致在代码库中实际实现的架构随着时间的推移而缓慢退化。我们希望探索架构和代码之间更强大的连接方式,甚至研究对框架和库的高级支持,例如允许对整个系统中的各个组件进行可测试性。小型系统的趋势受到以下事实的强烈推动:单体应用程序往往会随着时间的推移在架构上退化,即使——在它们生命的开始——定义了一个架构。)并验证代码库是否符合定义的约定。[*]使开发人员能够编写架构上明显的代码,即提供在代码中表达架构概念的方法,以缩小两者之间的差距。

JHIII的博客 5006

模块化架构与单体架构之间的差异及其优势,如何进行模块化架构的设计 Moving from Monolithic to Modular Architectures: Principle

为了提升企业应用系统的可扩展性、易维护性和灵活性,在过去几年里,开发者们开始逐渐转向模块化架构模式。随着微服务架构的兴起,越来越多的公司开始面临着从单体架构向模块化架构转型的挑战。本文将通过系统的学习并结合实际案例,阐述模块化架构与单体架构之间的差异及其优势,如何进行模块化架构的设计,并且提供一些工具和方法来实现架构的迁移、监控、测试等工作。模块化架构模式(Modular Architecture Patterns),是一类用于构建复杂应用程序的结构和行为的设计准则。

AI天才研究院 1464

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

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

2301_80373862的博客 2152

【Unity】入门教程第一期-下载安装Unity编辑器(下)

讲解如何在Unity Hub中下载Unity编辑器以及IED环境

Xiaoxin的博客 2042

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

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

小技术君 1307

SDK报错(1)undefined reference to `f_mount‘

按文中说法是ff.c文件中用了一个if语句来判断是否启用ff.h头文件,但是却没有地方进行宏定义来满足这个if条件。利用SDK读取sd卡时,添加了xilffs库,而且包含了ff.h头文件,还是对fat库的函数报错。网上有的说在ARM v7 gcc linker中添加xilffs的方法可以解决,但我试了没有用。如下图,我们可以在ff.c中自己添加一个宏定义来实现这个条件。最后在赛灵思论坛找到了一个解决方法,原文连接如下。这时候保存编译之后,报错就消失了。ff.c 文件在bsp工程下。

EfunStudy的博客 1481

[ADS]单端电感和差分电感的感值和Q值计算公式

单端电感和差分电感的感值和Q值计算公式

乾巽的博客 1万+

架构新选择:Spring Modulith模块化单体

模块化单体试图在传统单体和微服务之间找到一个平衡。它仍然是一个单一的部署单元,但内部代码被组织成高内聚、低耦合的逻辑模块。

牛觅成长 769

手把手学计科--web网页设计

网页的组成:文字、图像和超链接等元素。还可以包括哦音频、视频和动画。分类:静态(固定信息)和动态(与服务器数据库进行实时的数据交换。HTML和CSS 是一种静态网页搭建技术。

Yhvaely的博客 1751

Spring Modulith:企业级模块化单体架构的权威深度研究报告

在过去十年中,企业软件架构领域经历了一场深刻的变革。微服务架构曾被视为解决所有扩展性和敏捷性问题的灵丹妙药,导致无数组织在未能充分评估其运维复杂性的情况下盲目拆分单体应用。这种趋势往往导致了“分布式单体(Distributed Monolith)”反模式的出现,即系统虽然在物理上是分布式的,但在逻辑上依然紧密耦合,同时引入了网络延迟、分布式事务难题以及高昂的运维成本。Spring Modulith 应运而生,它不仅仅是一个技术框架,更代表了架构设计哲学的一种理性回归。

Anakki的博客 1576

5、数据计算与处理技巧全解析

本文深入解析了Tableau中的多种数据计算与处理技巧,涵盖LOD计算、日期与字符串处理、计数优化、数据混合限制及自定义总计等核心内容。通过实际案例和流程图,系统讲解了各技巧的应用场景、实现步骤与注意事项,并提供性能优化建议和常见问题解答,帮助用户提升数据分析效率与可视化精度。同时展望了未来数据计算技术的发展趋势,是Tableau用户进阶必备的全面指南。

peach的博客 82

使用 MATLAB/Simulink 构建一个多时间尺度下的微电网经济运行优化策略模型

本文介绍了基于Simulink的多能互补微电网系统建模方法,重点关注多时间尺度下的经济运行优化策略。内容包括:系统背景与目标、微电网结构设计(光伏、风电、储能、柴油发电机等模块)、多时间尺度能量管理架构(日前优化、日内滚动优化、实时控制)的实现步骤,以及仿真运行与结果分析。教程详细说明了如何在Simulink中调用优化算法,设置仿真参数,并提供了进阶研究方向和资源推荐。该模型为研究微电网的经济运行和智能调度提供了完整的仿真平台解决方案。

amy_mhd的博客 174

从单体架构向微服务迁移:模块化单体是如何帮助的

你开始构建一个漂亮的单体系统。也许是一个模块化的单体系统。随着时间的推移,系统不断增长,需求也在不断变化。渐渐地,系统开始出现裂痕。这可能是出于组织原因,需要在团队之间分配工作。也可能是由于扩展性问题和性能瓶颈。你开始评估可能的解决方案,以及每种解决方案的优势和权衡。最后,你做出了一个决定。是时候将系统的部分部分迁移到独立的(微)服务中了。那么,我们如何从单体架构迁移到微服务呢?使用有界上下文进行...

小技术君 1563

[QMT量化交易小白入门]-三十四、让deepseek分析北京炒家的首板策略后,在打板前增加了选股范围(量化python代码解析)

print(f'开始盘前选股')这行代码定义了一个名为的函数,当调用这个函数时,会首先打印出“开始盘前选股”的信息,表明选股流程正式启动。1、可根据情况增删部分条件,目前盘前选股目前可以选出140多支,比之前全市场监听带宽压力小了很多。2、还可以自行添加其他选股条件,比如换手率计算,炸板可能性检测。3、xtdata的数据是有可能缺失的,自己写策略时,有可能需要剔除,或者从第三方库校正,比如部分股票的流通股数。

木头大左的博客 2700

单体架构到分布式架构浅析

在弄清楚目标之前,我们先了解下分布式架构的缺点,通过了解这些缺点来衡量满足我们目标的前提下,需要进行哪些方面的取舍,就如 CAP 原则一样,只能满足其中的两个,AP 或者 CP。《分布式架构体系》中提到,分布式架构的核心理念是按照功能、业务、领域等对系统进行拆分,通过合理的拆分结构,实现各业务模块的解耦,同时通过系统级容错设计,在廉价硬件基础设施上构建起高可用、可扩展的开放技术体系。在业务初期,单体架构的优点,无论从那个方面来说,都优于其他架构风格,但是随着业务的增加、复杂,单体架构的缺点也逐渐暴露出来。

ldcaws的专栏 2017

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Rust 模块化单体架构:告别全局 Migrations,实现真正的模块自治

首先,定义一个标准的结构体用于模块上报信息,并声明inventory// 1. 模块迁移执行器 trait,抹平不同 Migrator 的类型差异// 2. 模块注册项结构体pub get_migration_table_name: fn() -> String, // 关键:获取该模块独立的表名// 3. 告诉 inventory 开始收集这种对象现在,在各个模块内部,开发者只需编写几行声明式代码即可完成迁移配置。命名规范建议模块前缀:与 crate 名称或业务缩写对应(如->ua->

qq_25624705的博客 1218

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

架构向-搭建一个多模块单体架构

如果需要进行单体架构的练习,或者有搭建单体多模块的需求,本文可以起到一定的参考1、项目最外层搭建2、模块搭建公共依赖模块2.2 公共模块pom修改3、模块之间的调用 1、项目最外层搭建 点击新建项目,选择到maven 点击下一步 输入我们的groupId和artifactid,点击next 选择我们自己的maven仓库及配置 删除我们的src文件夹,只留下一个pom文件,pom文件我们需要修改一下,里面只要留下 <?xml version="1.0" encoding="UTF-8"?>

xiaowei2019w的博客 1571

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

单体架构的技术框架演变

单体架构(Monolithic Architecture)是一种传统的软件架构风格,在这种架构中,所有的功能单元都集成在一个独立的软件单元中,比如一个单一的代码库或者一个应用程序。在单体架构中,所有的功能,如业务逻辑、数据库操作、用户界面等,通常都是紧密耦合在一起的。随着业务需求的增长和技术的发展,单体架构可能会遇到一些挑战,如代码难以维护、扩展性差、部署效率低等。因此,单体架构的技术框架也在不断演变,以应对这些挑战。

猿脑2.0的博客 742

为何说,做到单体模块化才是王道

模块化单体架构可以帮助我们更好地组织应用程序的代码,并提高应用程序的可维护性和可扩展性。在过去的几年中,微服务架构已经成为了企业的首选架构,但是对于许多中小型企业而言,微服务架构可能过于复杂,难以实现。模块化单体架构的核心思想是将应用程序拆分为多个模块,每个模块都有自己的职责和功能。这可以帮助我们更好地组织应用程序的代码,并提高应用程序的可维护性和可扩展性。如果我们将领域驱动设计 (DDD) 应用于我们现有的单体应用程序,我们可以将其重构为模块化单体架构。在模块化单体架构中,每个模块都有自己的职责和功能。

Fsafn的博客 301

第二十一课:系统是怎么一步步拆坏的?——单体到模块化实践(完整工程版)

摘要:本文探讨了系统架构演进的正确路径,指出微服务不是万能的,盲目拆分往往导致系统崩溃。文章强调单体架构在中小规模业务中的优势,提出"模块化单体"作为过渡方案,即在单一工程中预先划分服务边界。重点分析了系统被拆坏的四种典型情况,并给出模块化设计的核心原则:高内聚低耦合、依赖方向控制和领域分层。最后指出拆服务的正确时机应基于业务需求而非技术炫技,强调架构的核心价值在于"可理解、可维护、可扩展、可演进"。(149字)

Mark Wu 的博客 981

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

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

ctrigger的专栏 1186

颠覆微服务架构?谷歌最新开源service weaver初体验

合久必分,分久必合,技术圈也是如此。在大家纷纷从单体应用过渡到微服务的时候,谷歌携带着新时代的“单体”应用框架Service Weaver来了!代码仓库位于:https://github.com/ServiceWeaver/weaver 才发布没几天已经超过了2.5k star,不得不感慨谷歌的号召力。谷歌称此框架为模块化单体(modular monolith),谷歌为什么会在这个时候提出如此标新...

kevin_tech的博客,微信搜「网管叨bi叨」 812
上一篇: 如何在SpringBoot 优雅地实现文件的上传和下载
下一篇: 3000字教你如何加快Spring Boot启动
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值