首页 > 其他分享 >当SOA遇到DDD

当SOA遇到DDD

时间:2024-08-20 23:37:30浏览次数:10  
标签:SOA 服务 细粒度 遇到 应用程序 领域 架构 DDD

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

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

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

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

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

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

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

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

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

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

实例

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

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

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

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

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

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

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

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

关注我,紧跟本系列专栏文章,咱们下篇再续!

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

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

负责:

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

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

参考:

本文由博客一文多发平台 OpenWrite 发布!

标签:SOA,服务,细粒度,遇到,应用程序,领域,架构,DDD
From: https://www.cnblogs.com/JavaEdge/p/18370580

相关文章

  • 使用python-slim镜像遇到无法使用PostgreSQL的问题
    前言之前不是把DjangoStarter的docker方案重新搞好了吗一开始demo部署是使用SQLite数据库的,用着没问题,但很快切换到PostgreSQL的时候就遇到问题了…报错docker启动之后,app容器报错django.core.exceptions.ImproperlyConfigured:Errorloadingpsycopg2orpsycopg......
  • 遇到403 Forbidden ,服务器端查询后结果是http get查询字符串中包含非法字符
    原文链接:https://blog.csdn.net/mm_hello11/article/details/84261672 报错解释:HTTPGET请求通过查询字符串(即URL中"?"后面的部分)传递参数。如果查询字符串包含非法字符,服务器可能会拒绝请求并返回错误,因为这些非法字符可能会破坏URL的格式或者服务器的安全性。非法字符通常......
  • DDD领域驱动设计的原理与实践
    目录什么是DDD领域驱动设计?定义与概念:核心思想:核心概念:核心原则:优势与应用:与微服务架构和传统三层架构的关系:理解领域模型举例统一语言(UbiquitousLanguage)实体(Entity)值对象(ValueObject)聚合(Aggregate)仓储(Repository)领域服务(DomainService)限界上下文(Bounded......
  • rocketmq在linux搭建双master遇到的坑【转】
    我的环境两台阿里云centos7服务器回到顶部首先,去官网下载解压包,解压。然后进入bin目录,需要修改runserver.sh文件和runbroker.sh文件。因为rocketmq默认配置文件需要的内存是非常高的。需要改小点。就是把那两个文件的这个参数改得小点。改成512m就可以了回到顶部然后启动N......
  • Soap协议
    简单对象访问协议(Soap)1、它使用XML格式来传输消息。2、SOAP与HTTP的区别SOAP可以传递结构化的请求数据,而HTTP只能传递纯文本的请求数据SOAP是简单对象的访问协议,HTTP是标准超文本传输协议SOAP需要对XML数据进行解析,而HTTP大多以JSON为主SOAP协议的优势1、......
  • 关于SOA和微服务
    面向服务的架构(SOA)想象一下,你正在经营一家大型超市,超市里有各种各样的商品和服务。SOA就像是超市的各个部门,比如生鲜区、家电区、收银台等等,每个部门提供特定的服务。这些服务(部门)通过一定的规则(如通信协议)相互协作,共同为顾客(即应用程序或用户)提供服务。在SOA中,服务的粒度......
  • 一种很变态但有效的DDD建模沟通方式
    本文书接上回《这就是为什么你学不会DDD》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术实现交流;视频和直播在B站。 https://mp.weixin.qq.com/s/TJEtclwcJydiE58pjWpXXw 背景前文说到,我们在建模的时候要放下......
  • 网安门槛太低了,收个简历总是能遇到各种奇人异事
    前言啊,什么神仙?集帅们,who懂呀?ta是咋想的,自己面不过找我要钱,那岂不是每年秋招春招投个几万份简历直接躺平?我日了,半年不开张,开张吃半年?是不是我和他聊两句都要找我要钱?旁边过条狗都得掰两颗牙下来?真让人丁寒,那我扩展一下思路,签了合同以后面不过赔我钱,不用多,200我都赚疯了,还......
  • laravel 批量插入并在遇到重复键时更新
    /***批量插入并在遇到重复键时更新*@paramarray$values*@returnbool*/publicstaticfunctioninsertOnDuplicate(array$values){if(empty($values)){returntrue;}if(!is_array(reset($values))){$values=[$values];......
  • 在 Ubuntu 上使用 bash 访问 Windows 的 Program Files (x86) 目录时,遇到 “未预期的
    ubuntu进入windowsProgramFiles(x86)目录时提示bash:未预期的符号“(”附近有语法错误 是因为目录名中包含了空格和特殊字符(如括号)。在 bash 中,处理这些字符时需要特别注意。以下是解决方法:使用引号:用引号将路径括起来,以处理目录中的空格和特殊......