毛爷爷是什么意思| 吃猪血有什么好处和坏处| 维生素b2有什么作用| 八是什么生肖| 女人适合喝什么茶最好| 羊奶粉和牛奶粉有什么区别| 什么叫双飞| 糖类抗原125偏高是什么原因| 高烧拉肚子是什么原因| 来月经可以吃什么水果| 五花肉和什么菜炒好吃| 发票抬头是什么意思| 藿香正气水治疗什么病| 粉色配什么颜色| 游坦之练的什么武功| 谁也不知道下一秒会发生什么| 软坚散结是什么意思| 排卵期同房要注意什么| 希望孩子成为什么样的人| 什么是跑马| 吃荆芥有什么好处| 理发师代表什么生肖| 地动山摇是什么生肖| kalenji是什么品牌| 苹果代表什么生肖| 三级医院什么意思| 嫡传弟子是什么意思| 上焦有火吃什么中成药| 什么是生僻字| 肝肾功能检查挂什么科| 连襟是什么意思| 什么时间段买机票最便宜| 阴毛长虱子用什么药| 女人吃秋葵有什么好处| 梦见猪肉是什么意思| 素的部首是什么| 心率低是什么原因| 尪痹是什么意思| 治骨质疏松打什么针| 为什么不能随便看手相| 沙悟净是什么生肖| 舌头发麻什么原因| 肛门痒是什么原因男性| 儿童肚子痛挂什么科| 下家是什么意思| 腊肉和什么菜炒好吃| 生理期喝什么| 送爸爸什么礼物最实用| 紫色加绿色是什么颜色| 肺气肿吃什么食物好| 为什么怀不上孩子| 宝宝睡觉出汗是什么原因| 下午两点属于什么时辰| 什么的照射| 走投无路是什么意思| 凉皮加什么才柔软筋道| 羊眼圈是什么| 包皮垢是什么| 拔罐黑紫色说明什么| 什么人不能献血| 体位性低血压是什么| 米线是什么做的| 气血不足吃什么食物| 什么品种的狗最粘人| 发烧不能吃什么| 化疗和放疗什么区别| 洋葱什么时候种植| 女排精神是什么| 氨基比林是什么药| 嗪读什么| 专科学什么专业好就业| 峦是什么意思| 维生素b族什么牌子的好| 评头论足什么意思| 菊花什么时候扦插最好| 因果业力是什么意思| 脚背痛什么原因| 晚上一直做梦是什么原因引起的| 38妇女节送老婆什么礼物| 印度信仰什么教| 梦见摘枣吃枣是什么意思| 一个大一个小念什么| 塑料是什么材料| 助产学出来是干什么的| 什么什么来迟| 请结合临床是什么意思| 月经来了头疼是什么原因导致的| 鹿鞭是什么| 猴跟什么生肖相冲| 孕检无创是检查什么的| 女性肾虚吃什么药| 3680是什么罩杯| 时间是什么意思| 心境什么意思| 慢性肠胃炎吃什么药| 秦昊的父母是干什么的| 夏天补什么| 冰镇情人果是什么水果| 睡前喝蜂蜜水有什么好处| 磕是什么意思| 23333是什么意思| 小儿积食吃什么药最好| 手指腱鞘炎是什么原因造成的| 瘖什么意思| 武则天为什么立无字碑| 鼻息肉是什么样的图片| 鹦鹉鱼能和什么鱼混养| 变色龙指什么样的人| 紫苏有什么作用与功效| 属鸡的幸运色是什么颜色| 打2个喷嚏代表什么| 幽门杆菌是什么意思| 寸关尺代表什么器官| 皮囊炎用什么药膏| 睚眦欲裂什么意思| 风化是什么意思| 红参对子宫有什么作用| 男人为什么会晨勃| 深千尺是什么意思| 吃什么水果对心脏好| 野猪怕什么颜色| 缜密是什么意思| 一个丝一个鸟读什么| 夏天什么花会开| 2022年属虎的是什么命| 碱性磷酸酶偏低是什么意思| 长豆角叫什么| 尽收眼底是什么意思| 畏手畏脚是什么意思| 舌头伸不出来是什么原因| 精液带血是什么原因| 尿酸高可以吃什么水果| 无精打采是什么意思| 热射病是什么病| 梦到头发白了是什么意思| 姨妈期可以做什么运动| 皓什么意思| 拿什么爱你| 白带是什么意思| 闫学晶是什么军衔| 吾儿是什么意思| 腮腺炎不能吃什么东西| 什么叫资本运作| 扑朔迷离什么意思| 腿麻是什么原因引起的| 煲汤放什么药材补气血| 裸官是什么意思| 葡萄糖偏低是什么意思| 每天跳绳有什么好处| 提手旁的字有什么| 舌头白是什么原因| 坐西向东是什么宅| 火牙是什么原因引起的| 颈动脉斑块吃什么药| 葡萄糖阴性什么意思| 佛历是什么意思| 八字是指什么| 刚需房是什么意思| 鼻子两侧挤出来的白色东西是什么| 口干是什么原因| 血小板低会引发什么病| 这是什么石头| 性质是什么| 绿豆和什么不能一起吃| 植物神经紊乱的症状吃什么药| 神经纤维由什么组成| 长绒棉和全棉什么区别| nt和唐筛有什么区别| 干咳嗓子痒吃什么药| 辅警是什么编制| 旧衣服属于什么垃圾| 口差念什么| 比重是什么| 鱼有念什么| 8月30号什么星座| 去极化是什么意思| 局长是什么级别干部| 44什么意思| 手腕三条纹代表什么| seiko手表是什么牌子| doosan挖掘机是什么牌子| 八月三号什么星座| gap是什么档次的牌子| 庞统和诸葛亮什么关系| 基本医疗保险包括什么| 为什么老是流鼻血| 三陪是什么| 胡思乱想是什么意思| 大头瘟现代叫什么病| 菊花茶和枸杞一起泡水有什么好处| 风热感冒 吃什么| 明年生肖是什么| 什么叫口腔溃疡| 结婚纪念日送什么花| 雨污分流什么意思| 口比念什么| 倾字五行属什么| 吃芹菜有什么好处| 肝纤维化是什么意思| 惢是什么意思| 邮箱是什么| 宫颈纳囊什么意思| 过三关 是什么意思| 办香港通行证要准备什么材料| 三伏贴什么时候贴最好| 苹果花是什么颜色| 荨麻疹是什么原因引起| 白菜属于什么科| 嘴唇为什么会肿起来| 小猫吃什么东西| 脑子萎缩是什么原因造成的| 胃酸过多吃什么食物好| 遗精什么意思| 蚊子有什么用| 降血脂吃什么| 清热去湿热颗粒有什么功效| 异丙醇是什么东西| 烫发对身体有什么危害| 牙龈发黑是什么原因| 一直以来是什么意思| 什么叫柏拉图式的爱情| 乙肝有什么明显的症状| 晖字五行属什么| 腋下出汗有异味是什么原因| hpv16阳性有什么症状| 寻常疣是什么原因造成的| pd-l1是什么| 皮损是什么意思| 血压偏高喝什么茶| 脾虚吃什么中成药| 眼白发红是什么原因| 意有所指是什么意思| 维c吃多了有什么副作用| 神机妙算是什么生肖| 嫩绿的什么| 肆无忌惮的意思是什么| 治类风湿用什么方法好| 盗汗吃什么药效果最快| 俊五行属什么| 小孩晚上睡觉出汗是什么原因| 岁月如歌什么意思| 中联办是什么级别| 本科和专科是什么意思| 爱出汗是什么原因| 直白是什么意思| 1202是什么星座| 中国地图像什么| 呕心沥血是什么意思| 纹身有什么讲究和忌讳| 喝什么最容易减肥| 夏天什么颜色最防晒| 11月5号什么星座| 脸上长斑吃什么药调理| 37是什么意思| 1965年什么时候退休| ys是什么意思| 一是什么意思| 医院属于什么行业| 山川载不动太多悲哀是什么歌| ib是什么单位| 高血脂吃什么食物最好| 头晕有点恶心是什么原因| 小河边有什么| 野生葛根粉有什么功效| 百度
大数据 频道

详解DDD:一文吃透洋葱架构

  领域驱动设计(Domain-driven design,DDD)是一种为复杂需求开发软件的方法,它将软件的实现与不断发展的核心业务概念模型紧密地结合在一起。

  领域是一个知识的范畴。它指的是我们的软件所要模拟的业务知识。领域驱动设计的中心是领域模型,它对一个领域的流程和规则有着深刻的理解。洋葱架构实现了这一概念,并极大地改善了代码的品质,降低了复杂性,并且支持不断发展的企业系统。

  

  01 为什么要用洋葱架构?

  领域实体是核心和中心部分。洋葱架构是建立在一个领域模型上的,其中各层是通过接口连接的。其背后的思想是,在领域实体和业务规则构成架构的核心部分时,尽可能将外部依赖性保持在外。

  它提供了灵活、可持续和可移植的架构。

  各层之间没有紧密的耦合,并且有关注点的分离。

  由于所有的代码都依赖于更深的层或者中心,所以提供了更好的可维护性。

  提高了整体代码的可测试性,因为单元测试可以为单独的层创建,而不会影响到其他的模块。

  框架 / 技术可以很容易地改变而不影响核心领域。例如,RabbitMQ 可以被 ActiveMQ 取代,SQL 可以被 MongoDB 取代。

  02 洋葱架构设计原则

  洋葱架构是由多个同心层构成,它们相互连接,并朝向代表领域的核心。它是基于控制反转(Inversion of Control,IoC)的原则。该架构并不关注底层技术或框架,而是关注实际的领域模型。它是基于以下原则:

  1、依赖性

  圆圈代表不同的责任层。一般来说,我们潜入得越深,就越接近于领域和业务规则。外圈代表机制,内圈代表核心领域逻辑。外层依赖于内层,而内层则对外圈一无所知。通常情况下,属于外圈的类、方法、变量和源代码依赖于内圈,但是反过来也一样。

  数据格式 / 结构可能因层而异。外层的数据格式不应该被内层使用。例如,API 中使用的数据格式可以与 DB 中用于持久化的数据格式不同。数据流可以使用数据传输对象。每当数据跨层 / 跨界时,它应该以方便该层的形式出现。例如,API 可以有 DTO,DB 层可以有 Entity Objects,这取决于存储在数据库中的对象与领域模型的不同。

  2、依赖性

  每个层 / 圈封装或隐藏内部的实现细节,并向外层公开接口。所有的层也需要提供便于内层消费的信息。其目的是最小化层与层之间的耦合,最大化跨层垂直切面内的耦合。我们在较深的层定义抽象接口,并在最外层提供其具体实现。这样可以确保我们专注于领域模型,而不必过多地担心实现细节。我们还可以使用依赖性注入框架,比如 Spring,在运行时将接口与实现连接起来。例如,领域中使用的存储库和应用服务中使用的外部服务在基础设施层实现。

  

洋葱架构中的数据封装

  3、关注点的分离

  应用被分为若干层,每一层都有一组职责,并解决不同的关注点。每一层都作为应用中的模块 / 包 / 命名空间。

  4、耦合性

  低耦合性,可以使一个模块与另一个模块交互,而不需要关注另一个模块的内部。所有的内部层都不需要关注外部层的内部实现。

  03 洋葱架构的分层

  让我们通过一个创建订单的用例来了解架构的不同层和它们的职责。当收到一个创建订单的请求时,我们会对这个订单进行验证,将这个订单保存在数据库中,更新所有订单项目的库存,借记订单金额,最后向客户发送订单完成的通知。

  

说明各层之间的依赖关系的包图

  

  04 领域模型 / 实体

  领域实体是领域驱动设计的基本构件,它们被用来在代码中为通用语言的概念建模。实体是在问题域中具有唯一身份的领域概念。领域实体封装了属性和实体行为。它应该是独立于数据库或网络 API 等特定技术的。例如,在订单领域,订单是一个实体,并具有像 OrderId、Address、UserInfo、OrderItems、PricingInfo 这样的属性以及像 AddOrderItems、GetPricingInfo、ValidateOrder 这样的行为。

  

订单实体类

  05 领域服务

  领域服务负责保持领域逻辑和业务规则。所有的业务逻辑应该作为领域服务的一部分来实现。领域服务由应用服务协调,以服务于业务用例。它们不是典型的 CRUD 服务,通常是独立的服务。领域服务负责复杂的业务规则,如在处理订单时计算价格和税收信息,保存和更新订单的订单库接口,更新购买物品信息的库存接口等。

  它包含了对其目标非常关键的算法,并且将用例作为应用的核心来实现。

  06 应用服务

  应用服务也被称为“用例”,是只负责协调请求步骤的服务,不应该有任何业务逻辑。应用服务与其他服务交互,以满足客户的请求。让我们考虑一下用例,用一个物品清单创建一个订单。我们首先需要计算价格,包括税收计算 / 折扣等,保存订单项目并向客户发送订单确认通知。定价计算应该是领域服务的一部分,但涉及定价计算、检查可用性、保存订单和通知用户的协调工作应该是应用服务的一部分。应用服务只能由基础设施服务调用。

  07 基础设施服务

  基础设施服务也被称为基础设施适配器,是洋葱架构的最外层。这些服务负责与外部世界交互,不解决任何领域的问题。这些服务只是与外部资源通信,没有任何逻辑。例如:外部通知服务、GRPC 服务器端点、Kafka 事件流适配器、数据库适配器。

  08 可观察性服务

  可观察性服务负责监控应用。这些服务有助于执行以下任务:

  数据收集(指标、日志、痕迹):主要使用库 / 侧线来收集代码执行期间的各种数据。

  数据存储:使用能够集中存储所收集的数据的工具(分类、索引等)。

  可视化:使用允许你对收集的数据进行可视化的工具。

  一些例子包括 Splunk、ELK、Grafana、Graphite、Datadog。

  09 测试策略

  洋葱架构的不同层有不同的职责,相应地也有不同的测试策略。测试金字塔是一个很好的框架,它规定了不同类型的测试。属于领域模型、领域服务和应用服务的业务规则应通过单元测试进行测试。当我们移动到外层时,在基础设施服务中进行集成测试更有意义。对于我们的应用,端到端测试和 BDD 是最合适的测试策略。

  

针对不同层的测试策略

  10 微服务

  当孤立地看待每个微服务时,洋葱架构也适用于微服务。每个微服务都有自己的模型、自己的用例,并定义了自己的外部接口,用于检索或修改数据。这些接口可以用一个适配器来实现,该适配器通过公开 HTTP Rest、GRPC、Thrift Endpoints 等连接到另一个微服务。它很适合微服务,在微服务中,数据访问层不仅包括数据库,还包括例如一个 http 客户端,以从另一个微服务,甚至从外部系统获取数据。

  11 应用结构和层数

  

  应用结构和层,包括层如何映射到模块以及它们之间的依赖关系。它还描述了对不同层使用什么样的测试策略。

  12 模块化与打包

  有两种方法来组织应用的源代码:

  要么,我们可以将所有的包放在一个模块 / 项目中,要么将应用分为不同的模块 / 项目,每个模块 / 项目负责洋葱架构中的一个层。

  这在很大程度上取决于应用的复杂性和项目的规模,将源代码分为多个模块。在微服务架构中,模块化可能有意义,也可能没有意义,这取决于复杂性和用例。

  13 框架、客户端和驱动

  基础设施层由网络或服务器的框架、数据库的客户端、队列或外部服务组成。它负责配置和缝合所有的外部服务和框架。洋葱架构提供了解耦功能,因此在任何时候交换技术都会变得更容易。

  14 我们需要每个层吗?

  将我们的应用分层组织有助于实现关注点的分离。但我们需要所有的层吗?也许需要,也许不需要。这取决于用例和应用的复杂性。根据应用的需要,也可以创建更多的抽象层。例如,对于没有很多业务逻辑的小型应用,拥有领域服务可能没有意义。无论哪一层,依赖关系都应该是从外层到内层。

  本文总结

  洋葱架构在开始时可能似乎有些困难,但是在业界已经得到了普遍的认可。这是一种让软件易于演进的强有力架构。通过把应用划分为几层,可以使系统更加易于测试、维护和移植。它有助于在旧框架过时时轻松采用新框架 / 技术。与其他架构风格类似,如六边形、分层、简洁的架构等,它为常见问题提供了一个解决方案。

0
相关文章