写点什么

SOA 与 DDD 存在共生现象吗?

2008 年 9 月 17 日

随着 SOA 渐受欢迎、在企业架构里扮演重要角色,形势愈加明显,即它得着手利用其他相关学科取得的进步。这一观点在一次关于SOA 与DDD(Domain Driven Design,领域驱动的设计)关系的讨论中得到了印证。

SOA 是:

一种架构风格,它提倡设计与业务齐合的企业服务,并将这些服务作为设计、构建、构思企业业务方案的核心单元

DDD 是:

一种思考方式和一组优先考虑事项,它致力于加快那些涉及复杂领域的软件项目

Trond-Eirik 就二者表面上的共性提出以下问题,从而引发了本次讨论:

你们认为 SOA 和 DDD 这两个概念有何异同?它们是满足彼此需求的完美搭配吗?它们是互斥概念吗?也就是说,用了 DDD,就不能用 SOA 了?它们解决或属于问题域里的不同部分吗?还是,它们解决或属于问题域里的相同部分?

用户名为“moffdub”的网友回答说:SOA 和 DDD 之间有着很强的互补性:

DDD 是一种开发部署单元(单个应用)的方法。SOA 是一种将多个部署单元粘合在一起的方法。

Ashley Fernandes 提出了另一种综合两者的方式,他认为 DDD 是一种定义业务服务的技术:

我认为 DDD 里的服务层(service layer)跟 UDDI 里的 WSDL 服务非常接近。正因如此,DDD 和 SOA 可以很好地共存。

Tomas Karlsson 分享了他综合运用 DDD 和 SOA 的实际经验。他建议以纯 DDD 方法开始,然后创建实现了领域对象的对象(POJOs 或无状态 beans),并将它们暴露为服务。最终,他创建的是

一个(也可以是一组)具有明确职责的服务,即为给定对象上的增、查、改、删(CRUD)操作进行后端处理。尽早拥有这样的服务,将尽早给你的项目增加稳定性。

按照 Colin Jack 的说法,尽管 SOA 与 DDD 之间完全可以有共生关系,但在实现时要相当谨慎。特别地,他指出,提供实体服务(entity service)的想法会跟 DDD 格格不入。

我的问题是,我觉得实体服务(entity services)无法与 DDD 很好配合,尽管你暴露那些服务只是为了聚合,但因为你的领域设计需要改变,而且你已经丧失了“跨聚合事务”这样的基本特 性,所以你还是会遇到问题。没错,你可以在某些方面放松一些,但你要是那样做了,你还能享受 SOA 带来的好处吗?

Casey Charlton 赞同 Ashley Fernandes 的观点,他认为 Tomas 和 Colin 的方法会导致大量细粒度服务的出现:

我想,你最好暴露封装了整个领域模型的大粒度服务,然后在这些服务之间进行消息传递,而不是在较低的层次上对 SOA 进行分解。严格照此行事才算得上是 SOA。进一步细化,会违反“粗粒度服务”的原则。CRUD 操作在 SOA 架构里肯定是无用的。

Casey Charlton 的观点得到了 Andreas Ohlund 的支持,他引述 Bill Poole 的话说:“DDD 是用于在粗粒度的 SOA 服务里构建领域逻辑的”。

没错,SOA 和 DDD 支持同样的目标。良好设计的服务指的是那些“名字为CEO 或业务总管所熟悉的、并且后者关心其具体功能的”服务。而良好设计的领域对象(well designed domain objects)定义的是一组基础对象,它们用于语义数据模型、构建服务、以及在它们之间传递信息

查看英文原文: Is There a Symbiosis Between SOA and DDD?

2008 年 9 月 17 日 22:02929
用户头像

发布了 63 篇内容, 共 22.3 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

性能优化:线程资源回收

AI乔治

Java 架构 JVM 性能调优

LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

连企业业务模式都搞不清楚,何谈研发体系建设?

菜根老谭

研发体系

Java开发利器之重试器

Java老k

Java

架构师训练营第十周作业

我是谁

极客大学架构师训练营

Windows环境下如何进行线程Dump分析

Java老k

Java dump

K8S CSI 容器存储接口 (二):如何编写一个CSI插件

silenceper

Kubernetes Kubernetes源码 CSI

五年Java开发经验,4面阿里成功拿下offer,分享一下个人面经!

Java成神之路

Java 程序员 架构 面试 编程语言

一口气看完45个寄存器,CPU核心技术大揭秘

程序员架构进阶

cpu 操作系统 寄存器 核心

Spring 源码阅读环境的搭建

程序员小航

spring 源码 环境安装 源码阅读 spring 5

微前端架构初探

徐小夕

Java 前端 前端开发 微前端 前端进阶

谁说产品经理和程序员之间不能和平共处?

华为云开发者社区

DevOps 产品经理 用户地图

区块链赋能保险理赔,宁波开启“零感知理赔”试点

CECBC区块链专委会

区块链 保险理赔

区块链溯源有哪些优势?区块链产品溯源系统搭建

13530558032

智慧警务大数据平台搭建_公安大数据应用平台

13530558032

阿里P8大牛熬了半个月肝出来的《Java核心技术总结》+《面试题总结》,PDF离线版免费开放下载!

Java成神之路

Java 程序员 架构 面试 编程语言

区块链版权应用开发,区块链助力版权保护

13530558032

区块链可信数据服务平台搭建解决方案

t13823115967

区块链 可信区块链

看了 5 种分布式事务方案,我司最终选择了 Seata,真香!

程序员内点事

Java 分布式事务 seata

Linux笔记(二): vim 基本操作

Leo

Linux 学习 前端进阶训练营

当艺术品遇上区块链:金丝楠木艺术品溯源

CECBC区块链专委会

区块链 溯源 艺术品

Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合

比伯

Java 架构 面试 编程语言 计算机

淘宝APP高并发架构设计pdf已开源:从架构分层到实战维护,挑战全网

马士兵老师

Java 编程语言 高并发 淘宝 高并发系统设计

极客大学 - 架构师训练营 第十周总结

9527

全球至少有36家央行发布了央行数字货币计划

CECBC区块链专委会

数字货币

用FL Studio基础版制作一首完整的电音

奈奈的杂社

音乐制作 编曲 电音 电音制作 中国电音

原理实践,全面讲解Logstash+Kibana+kafka

996小迁

Java 程序员 架构 面试

【2020GET】即构科技蒋宁波:教育行业客户需求的核心是什么?

ZEGO即构

浅谈原子操作

阿里云基础软件团队

内核

实体经济的数智化要塞,为什么是供应链?

脑极体

一文搞懂所有HashMap面试题

云流

编程 面试 计算机

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

SOA与DDD存在共生现象吗?-InfoQ