当SOA遇到DDD

本文涉及的产品
视觉智能开放平台,视频资源包5000点
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,分割抠图1万点
简介: 【8月更文挑战第15天】

本文讨论软件设计中的决策,特别是关于将较大的系统拆分为多个可独立部署的服务端点。不会特别讨论【服务端点设计】,但我想探讨一下为创建多个服务应用程序进行构思的阶段。

面对复杂问题,通常试图理解复杂性的各部分。将问题拆解为更易于理解和处理的小模块,可以更有效地应对。

如同在许多产品/项目管理周期中描述的,对现实生活问题,通常直觉驱动。我们并没有使用某种公式理解前往需要签证的国家所需步骤。我们逐步了解到需要签证才能旅行,慢慢掌握需要哪些文件、哪些表格需要填写及咋填表。当我们处理其中的一步,不会在脑海中保留整个过程的所有细节,而是专注当前任务。这与任务完成规模有关。真正标准是时间或进度安排、执行任务的精力、认知能力及它与任务熟悉度的关系,甚至包括执行这些任务的物理地点(如领事馆与照相馆等)。

软件开发亦是如此。虽然多年“瀑布式”开发流已广泛应用,但最终主要还是基于启发式和经验的估算技术(如规划扑克、T恤尺寸估算)及敏捷过程占据主导。正如在现实,我们尝试不过分细化规划整个过程,而是根据最新的进展来把握整体方向。

同样理念也适用于根据问题建模的软件。开始将它们拆分为不同应用程序,目的是更容易管理单个应用程序,更快开发和部署,并减少依赖关系,最后还带来更多技术选择的自由。没有一套完整流程适用于所有情况。我们会查看各部分,并认识到我们在设计模式或技术方面的集体经验,努力选择最佳方案并应用。

一种用于理解和解决软件设计复杂性的技术是领域驱动设计(DDD)。DDD提倡基于业务现实建模,并与我们的用例相关。随其热度下降,很多人可能忘记DDD方法实际上在理解当前问题并设计软件以达成对解决方案的共同理解方面非常有帮助。构建应用程序时,DDD将问题描述为领域和子领域。

它会将独立的步骤或问题领域定义为限界上下文。强调使用通用语言讨论问题,并引入许多技术概念,如[实体、值对象和聚合根规则]来具体实现。有时这些技术规则被视为实现DDD的硬性障碍,但最终,人们往往忘记最重要的是将代码工件与业务问题保持一致,并使用相同的通用语言。

设计为服务应用程序的限界上下文

我想讨论的架构风格与微服务相似。它涉及将单体应用程序拆分为多个独立的服务应用程序,或从一开始就借助限界上下文这一DDD的概念来单独开发它们。

有许多资源突出更细粒度服务的优点,作为微服务叙述的一部分。越来越多博客讨论在向细粒度服务过渡前或过渡期间你应该具备的防护网和可能遇到的陷阱。我将尝试不重复微服务的好处或为迁移到这种架构而需要的支持元素,而是重点讨论如何通过应用领域驱动设计的概念来更好地分离这些服务。

实例

一个借记/信用卡收单领域。这个领域可以(如很多情况下的那样,不幸地)被实现为一组单体应用程序。之所以有多个应用程序,仅因在不同应用程序中存在一些硬性技术限制(如希望执行批处理过程)。

大多数成功的架构都认识到通过DB集成是一种不好做法,因为它模糊了技术应用程序和业务职责之间的边界,使业务逻辑泄露到DB,并通过增加应用程序服务器数量来阻碍水平扩展。因此,向更好架构的演进表现为单体应用程序的服务集成。

现在,应用程序之间的边界变得更清晰了。但正如你所见,仍然存在隐藏的DB交互,这次是在各独立应用程序内部发生。我称它们为隐藏的,因为它们通常一开始很难被注意到。随时间推移,代码缠绕会使原本分离的业务流程在人为上联系,并在业务开发引入更多摩擦,因为这种共存需要共同部署独立的功能,可能减缓开发进度。

若你有一个领域模型指导你,领域建模有助识别和分离纠缠在一起的实现。若你还没现有应用程序的领域模型(这在大多数情况下是真实的),与其通过代码来理解不同职责,不如建立一个领域模型并将其映射到手头的应用程序,可能是更好方法。这不仅节省时间,还可避免陷入细节困境。而且,若业务团队与开发团队存在差距(可能是领域模型一开始就不存在的主要原因),讨论领域模型并将其与现有应用程序的功能对应起来,有助于弥补这一差距。

设计演进的下一步是将领域边界分离反映到我们的架构及限界上下文中。一个领域有多个限界上下文,意味着同一领域内可能有多个服务应用程序。

通过合适的领域模型,潜在的拆分点更加清晰,使我们能从更细粒度的应用程序中受益,如独立发布和版本控制、纯粹的基于能力的服务端点等,大多数这些优点已经在微服务文章中讨论过了。虽然许多关于微服务的讨论集中在技术中立性和开发纪律(避免/打破单体)上,但对于我们大多数人所处理的应用程序而言,领域和设计层面的考虑同样具有很高的价值。在转向微服务架构(借助领域模型)之后,DDD和更细粒度的服务可以相互协作,共同支撑。

这也将为团队提供一定程度的独立性,更精细的服务能力和更解耦的交互,如许多微服务文章中所解释的那样。

此外,正如案例信用卡支付收单领域中所见,这不是我们服务可达到的最细粒度分离。相反,这是通过我们的领域知识指导下的最有意义的分离。关键不在于服务的规模,而在于业务能力的划分。我认为这就是许多人所说的“正确的SOA”。
关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

    目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

目录
相关文章
|
前端开发 Java 数据库连接
领域驱动设计(DDD):分层架构
在应用系统开发中,采用严格的、单一的、真正的的分层架构是可以的,但实际上我们已经采用了多种架构模式设计系统。当多种不同范式的架构混合在一起,你会不会出现“指鹿为马”的现象呢?
领域驱动设计(DDD):分层架构
|
7月前
|
数据库
DDD架构浅谈
DDD架构浅谈
154 4
|
消息中间件 开发者
DDD领域驱动设计实战(六)-领域服务(上)
DDD领域驱动设计实战(六)-领域服务
463 0
DDD领域驱动设计实战(六)-领域服务(上)
|
设计模式 运维 前端开发
DDD(领域驱动设计)分层架构
DDD(领域驱动设计)分层架构
1937 0
DDD(领域驱动设计)分层架构
|
Java API 领域建模
领域驱动设计(DDD)-简单落地
一、序言     领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法。在本文中的实战示例可能会与常见的DDD规则方法不太一样,是简单、入门级别,新手可以快速实践版的DDD。如果不熟悉DDD设计思想可看下基础思想篇 二、设计阶段     领域建模设计阶段常见的方法有 四色建模法、EventSourcing等 推荐一篇博文正确理解领域建
12171 1
|
消息中间件 JavaScript 小程序
领域驱动设计(DDD)的几种典型架构介绍
领域驱动设计(DDD)的几种典型架构介绍
|
存储 设计模式 前端开发
浅析 DDD 领域驱动设计(1)
浅析 DDD 领域驱动设计
356 0
浅析 DDD 领域驱动设计(1)
|
设计模式 缓存 Java
DDD分层
为什么分层 引用《领域驱动设计模式、原理与实践》 为了避免将代码库变成大泥球(BBoM)并因此减弱领域模型的完整性且最终减弱可用性,系统架构要支持技术复杂性与领域复杂性的分离。引起技术实现发生变化的原因与引起领域逻辑发生变化的原因显然不同,这就导致基础设施和领域逻辑问题会以不同速率发生变化 每一层都有各自的职责,显然这也是符合SRP的
569 0
DDD分层
|
设计模式 领域建模 数据库
DDD领域驱动设计落地实践系列:初识DDD
笔者在经历的很多项目中都使用了DDD领域驱动设计进行架构设计,尤其是在业务梳理、中台规划以及微服务划分等方面,DDD是重要的架构设计方法论,对平时的架构设计有非常好的指导作用。从本文开始笔者将通过一系列的文章阐述自己对于DDD的理解以及如何在项目实战中落地实践DDD。本文作为系列文章的开端,主要和大家聊聊DDD的一些基本概念以及常用方法。
DDD领域驱动设计落地实践系列:初识DDD
|
缓存 数据可视化 Java
浅析 DDD 领域驱动设计(2)
浅析 DDD 领域驱动设计
310 0
浅析 DDD 领域驱动设计(2)