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

这篇具有很好参考价值的文章主要介绍了从单体架构向微服务迁移:模块化单体是如何帮助的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你开始构建一个漂亮的单体系统。也许是一个模块化的单体系统。

随着时间的推移,系统不断增长,需求也在不断变化。渐渐地,系统开始出现裂痕。

这可能是出于组织原因,需要在团队之间分配工作。也可能是由于扩展性问题和性能瓶颈。

你开始评估可能的解决方案,以及每种解决方案的优势和权衡。最后,你做出了一个决定。

是时候将系统的部分部分迁移到独立的(微)服务中了。

那么,我们如何从单体架构迁移到微服务呢?

使用有界上下文进行解耦

从单体架构转移到微服务的第一步是识别有界上下文。因为它们代表了可用于提取的领域的内聚部分。

一个解决方案是使用领域驱动设计战略建模来识别有界上下文。

有界上下文定义了模块之间的显式边界,并分离了各自的责任。这是迁移到微服务时面临的最大挑战之一。确定良好的边界确保微服务专注于一个问题领域。

在单体中定义边界也更容易,因为你不是在处理分布式系统。重构不良边界风险较低,你有更多自由度去“搞定”。

从单体架构向微服务迁移:模块化单体是如何帮助的,架构,微服务,数据库,云原生
bounded_contexts.png

接下来你需要解决的问题是耦合。耦合表现为两种方式:

•数据库依赖•模块间的通信

你可以通过构建模块化单体来从一开始解决这些问题。但我也会解释你可以使用的指导原则来解决耦合。

模块化单体如何解决耦合

模块化单体是一个响亮的名字,指的是由几个有界上下文(模块)构建的单体系统,并遵循一系列控制耦合的原则。每个模块包含一组内聚的功能,并且在系统中与其他模块隔离。这种隔离涉及数据库依赖和模块间的通信。

从单体架构向微服务迁移:模块化单体是如何帮助的,架构,微服务,数据库,云原生
modular_monolith.png

你可以把一个模块看作系统中的一个独立应用程序。一个模块拥有自己的领域、实体、用例和数据库表。模块作为一个单一可执行应用程序一起部署。但在其他方面它们是独立的。

你可以对每个模块应用不同的架构方法,比如清晰架构。

我提到你需要减少模块间的耦合。

以下是解决数据库耦合的两个原则:

•模块不能在数据库中共享表•模块不能直接查询其他模块的数据库表

共享数据库表会导致高度耦合,而这恰恰是你要避免的。你可以使用模式在逻辑层面或物理上使用不同的数据库为每个模块隔离数据。

一个模块应该暴露一个其他模块可以调用的公共 API。这个公共 API 是模块的入口点。这是模块间通信的唯一方式。

模块间通信可以是同步的,使用方法调用,或者异步的,使用消息总线。

我更倾向于使用消息传递的异步通信。它耦合度低,使得向微服务的转变更加容易。

为系统添加消息代理

为了在模块间实现异步通信,你可以引入一个消息代理。但你无需从一开始引入一个完整的消息代理。

你可以使用诸如MassTransit这样的抽象来在模块之间实现消息传递,同时将传输机制抽象化。

MassTransit 有一个内存传输机制,可以很好地在单个进程中工作。它非常快速。但它不是持久化的,如果总线停止,你可能会丢失消息。

在引入真正的消息代理时,你只需要配置不同的传输机制。但你不需要改变你的消息传递代码。

从单体架构向微服务迁移:模块化单体是如何帮助的,架构,微服务,数据库,云原生
modular_monolith_queue.png

在模块化单体中引入消息传递的目的是什么?

这样设计系统可以使模块之间松耦合和独立。在项目成熟后,你在开始时增加的复杂性是合理的。

将模块提取到微服务中

我们决定从单体系统迁移到微服务。因为我们以模块化的方式构建了系统,所以迁移的关键在于将一个模块提取到一个新的进程中。

你应该在服务前面引入一个反向代理,来路由进入的流量。这将隐藏微服务系统的实现细节,不让客户端应用程序知道。

新的微服务需要连接到消息总线,但我们不需要在代码中做任何改变。使用消息传递在模块之间进行通信简化了迁移过程。这可能让你想起事件驱动架构。

如果你使用方法调用来实现模块间通信,你必须将这种实现替换为通过网络的 HTTP 调用。因为你现在正在构建一个分布式系统,之前的方法调用实现将无法工作。你还需要考虑认证、容错等问题……

从单体架构向微服务迁移:模块化单体是如何帮助的,架构,微服务,数据库,云原生
extracting_modules.png

从单体系统中提取模块会用新微服务的功能替换旧系统的所有功能。这个迁移到微服务的过程遵循了榕树模式。

总结思考

从单体架构迁移到微服务的最大障碍是耦合。耦合是变更的阻止者。因此,这是你需要解决的第一件事。

你需要在数据库层面和代码中的组件间解决耦合。以模块化的方式构建系统可以从一开始就避免这些问题。

这就是为什么模块化单体是一个很好的方法。

你可以在系统中识别有界上下文,并将它们用作单体中的边界。在单体中正确划分边界要容易得多。

迁移到微服务就是将模块提取到独立服务的过程。

当然,你仍然需要考虑安全性和容错性,因为现在你有了一个分布式系统。

当谈论抽象的架构时,可能难以理解,但在讨论概念性解决方案时却是很重要的。文章来源地址https://www.toymoban.com/news/detail-794850.html

到了这里,关于从单体架构向微服务迁移:模块化单体是如何帮助的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间。这里重新行动起来,从项目搭建到完成前前后后用了两个月时间,平常时间比较少,基本上都是只能利用零碎的

    2024年02月09日
    浏览(48)
  • IBM引入模块化设计助力波音与摩根大通快速实现量子计算服务

    ​(图片来源:网络) 经典计算机具有局限性,无法完成某些特定任务,例如准确预测金融市场或开发药物来对抗新兴疾病,而量子计算能打破“僵局”。 部署IBM Quantum量子系统的负责人Chris Lirakis 说:“量子计算不仅提高了速度,而且能解决我们以前无法解决的问题。”

    2024年02月05日
    浏览(68)
  • 如何在Vue中进行单元测试?什么是Vue的模块化开发?

    在Vue中进行单元测试可以提高代码的可维护性和可读性,同时也能够帮助开发者更快地找到代码中的问题和潜在的错误。下面是一些在Vue中进行单元测试的步骤: 安装单元测试工具 首先需要安装一个单元测试工具,例如Jest或Mocha。可以使用npm或yarn进行安装。 创建测试文件

    2024年02月12日
    浏览(36)
  • 解读数据可用性赛道:如何讲好模块化区块链的叙事?

    数据可用性(Data Availability)主要存在于轻客户端节点相对全节点的语境下。对于轻客户端节点的数据可用性问题,行业内已经达成共识——采用纠删码(erasure codes)来解决。 不仅轻客户端节点有数据可用性问题,Layer1+Layer2 的叙事也好,Modular Blockchain 的叙事也罢,都会存在

    2024年02月08日
    浏览(34)
  • 【设计模式之美】重构(三)之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

    重构可以分为大规模高层重构(简称“大型重构”)和小规模低层次重构(简称“小型重构”)。 通过解耦对代码重构,就是保证代码不至于复杂到无法控制的有效手段。   代码是否需要“解耦”? 看修改代码会不会牵一发而动全身。 依赖关系是否复杂 把模块与模块之间

    2024年01月16日
    浏览(48)
  • 什么是模块化?为什么要进行模块化开发?

    模块化是一种软件开发的设计模式,它将一个大型的软件系统划分成多个独立的模块,每个模块都有自己的功能和接口,并且能够与其他模块独立地工作。  先来一段八股文 模块化开发可以带来以下好处: 提高代码的复用性:模块化可以将代码划分成可重用的部分,降低代

    2023年04月12日
    浏览(51)
  • 23年,我又学习了一次amd模块化,模块化思想

    src/view1/index.html src/view1/main.js plugins/module.js 源码链接: https://gitee.com/littleboyck/front/tree/master/front-module 联系方式:QQ: 1187253007

    2024年02月07日
    浏览(51)
  • 【前端模块化】JS模块化思想以及相关规范(CommonJS、ES module)

    1.模块化概念 随着前端应用日趋复杂,项目代码也大量膨胀,模块化就是一种最主流的代码组织方式, 一个模块就是一个实现特定功能的文件 ,它通过把我们的复杂代码按照功能的不同,划分为不同的模块单独维护的这种方式,去提高我们的开发效率,降低维护成本。要用

    2024年02月01日
    浏览(50)
  • webpack(一)模块化

    阶段一:基于文件的划分模块方式 概念 :将每个功能和相关数据状态分别放在单独的文件里 约定每一个文件就是一个单独的模块,使用每个模块,直接调用这个模块的成员 缺点 :所有的成员都可以在模块外被访问和修改(所有的模块都是直接在全局工作,没有【私有空间

    2024年02月11日
    浏览(38)
  • JS模块化系统

    随着 JavaScript 开发变得越来越广泛,命名空间和依赖关系变得越来越难以处理。人们已经开发出不同的解决方案以模块系统的形式来解决这个问题。 CommonJS 是一种同步加载模块的规范,主要用于服务器端的 Node.js 环境。 top:CommonJS 加载的是一个对象(即 module.exports 属性),

    2024年02月19日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包