SOA是技术架构方面,Evans DDD则是哲学方法论方面,所属方向不一样,或者说两者非常的无关。甚至是两个不同方向。使用DDD可以将系统从无到有到大建立起来,而大到一定程度,就需要SOA,整合异构。如果说DDDSOA有什么联系的话,那么组件Componen可能是他们中间的纽带。下面对这几个概念分析如下,不当之处请讨论。

SOA概念

SOA是一个很高的架构,使用EJB这样分布式组件以后才会考虑SOA,有过DCE (Distributed Computing Environment), CORBA (Common Object Request Broker Architecture), DCOM ( D istributed Component Object Model) 或者EJB/RMI (Remote Method Invocation)等分布式架构经验的,过渡到SOA是一个很容易的概念,否则,如果没有这样一个可伸缩的架构概念,SOA对于他们则特别难以接受,是一个非常陡峭的学习曲线。

在当前国内很多人以数据库为中心的软件思维,没有认识到数据库的不伸缩性,让他们去接受分布式组件概念都很难,更别说SOA,这也是SOA在国内喊那么多年,一直没有大规模应用的原因,
SOA和EJB一样对于一些人非常高端,接受起来不是一蹴而就,也不是我写两篇文章数据库死了就可以接受的了。这是一个整体素质和水平的问题。

一个SOA架构如图:

SOA是一个业务重用粒度很高的架构,属于一种粗粒度的服务,ESB是提供这些粗粒度服务之间沟通的一种渠道,ESB是让服务彼此交流通迅,是一种实现松耦合的面向服务的架构。

SOA和Component/EJB

使用EJB作为SOA服务实现有很多好处,是一个推荐理想做法,但是,EJB作为一种分布式组件技术,还是和SOA的服务有些区别。

首先,服务应该是无状态的,而组件component可以有状态,虽然EJB作为分布式组件是SOA服务最好实现,但是不是所有的组件component都能作为服务的。

其次, 组件component是一种细粒度,而SOA的服务是一种粗粒度,组件是为重用而设计的对象,而服务是为更好地伸缩性scalability 而设计的,注意,服务是偏重伸缩性的,如果说组件还和DDD有关,实现DDD思想涉及到使用什么样的组件路线,那么SOA就已经纯粹是一个完全伸缩性概念了。

不要以为使用了EJB就具有良好的可伸缩性scalability,分布式计算组件不代表良好的伸缩性scalability,因为他们粒度还是太细,粒度太细导致调用过分频繁,加重分布式网络负载。

一个业务功能会在很多组件之间来回不断调用,,而SOA则是客户端使用一次调用一个服务,解决这一个业务功能,显示简明扼要,一刀封喉,同时也因为性能问题,减少网络来回损耗,SOA提供减轻了的负载,同样的网络环境就能提供更多的功能负载处理,所以SOA伸缩性方面要好于EJB或CORBA这些细粒度组件。

组件的细粒度是因为使用Evans DDD等对象方法分析设计的结果,组件可以看成是一个打包的多个对象,也可以是一个对象,对象方法论Evans DDD建议我们不断分层,可以不止三层,五层甚至更多成,直至最大化松耦合,最后结果必然导致琐碎和粒度非常细腻。而SOA则是一个相反过程,需要让我们不断拔高。

SOA和Evans DDD

上面已经说过,SOA是一个着重功能块的架构,比如天气信息服务、google的查询服务,是粗粒度的,那么是不是使用SOA就无需DDD,打个比喻:DDD就是把东西切得很碎,而SOA则是打包,这两个是否没有关系呢?

我个人认为答案是否定的,如果没有很细腻的松耦合的分离,那么怎么有SOA的整块概念呢?碎块和整块本是一对矛盾体的两个方面,互相依赖相对的,如果失去一方,另外一方也就无法存在。

如果没有DDD这样OO分析设计,如果是围绕数据库分析设计,就很难使用上SOA这样的粗粒度又和具体技术无关的高级架构。

如果你没有OO细分概念,而是数据库驱动设计概念,那么你就可能会将数据库的CRUD作为服务提供出来,JDBC或Http都不是服务。不能将简单的增删改查这样细粒度服务作为SOA的服务,基于CURD以上应该是更复杂的可重用的组件,然后,在组件上面才会使用到SOA的服务。SOA是一个很高的概念,需要更高的向上思维。

可以看出:SOA服务是在松耦合组件分离后的再次打包,而Evans DDD则是一把切断组件关系的利刃。从这个方面看,DDD应该是更基础平台,万丈高楼平地起啊,而DDD是对象方法论集大成,集合分析模式和设计模式,当你掌握DDD以后,分布式组件EJB是你攻克的第二关,伸缩性scalability成为你架构习惯思维的一部分以后,才能真正进入SOA高端“仙境”。

参考文章:
http://www.theserverside.com/news/thread.tss?thread_id=44639

http://www.jdon.com/jivejdon/thread/34676.html

SOA 与 DDD的更多相关文章

  1. 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)

    这是第一次写有关编程思想的东西. 1.理解Martin Fowler提出的SOA(面向服务歧义) 2.理解DDD(Domain-Driven Design领域驱动设计): http://blog.cs ...

  2. RESTful SOA与DDD(领域驱动设计)

    视频地址:http://www.infoq.com/presentations/RESTful-SOA-DDD 作者的一个DDD采访:http://www.informit.com/articles/ ...

  3. 领域驱动设计(DDD:Domain-Driven Design)

    领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...

  4. 结合领域驱动设计的SOA分布式软件架构

    引言 本文主要是参考Martion Fowler所著的<企业应用架构模式>与Eric Evans所著的<领域驱动设计>这两本泰山之作,加上本人在近年实际的工作过程中开发SOA系 ...

  5. NServiceBus 概况

    NServiceBus 概况 NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信 ...

  6. NServiceBus官方文档翻译(一)NServiceBus 概况

    NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信模块,像其他成熟的SOA和DD ...

  7. linux-dns-11

    1网卡设置配置文件里面DNS服务器地址设置,2.系统默认DNS服务器地址设置.3,hosts文件指定 生效顺序是: 1 hosts文件 ---- 2 网卡配置文件DNS服务地址 ---3 /etc/r ...

  8. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd

    下面是按着我所接触的架构模式,开始一个一个的说一下 第一 标准架构 三层结构

  9. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

随机推荐

  1. premiere视频输出参数设置

  2. Lucene 对文档打分的规则整理记录

    摘引自:http://www.cnblogs.com/forfuture1978/archive/2010/02/08/1666137.html Lucene的搜索结果默认按相关度排序,这个相关度排序 ...

  3. PowerDesigner的图形工具栏被我关了 怎么才能恢复?就是那个快捷工具栏 图形那个里面有什么放大镜 表 视图什么的

    PowerDesigner的图形工具栏被我关了 怎么才能恢复?就是那个快捷工具栏 图形那个里面有什么放大镜 表 视图什么的   工具-->自定义工具栏-->palette选中

  4. shell流程控制语句

    linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while,until),选择语句(case/select).下面我将通过例子介绍下,各个语句使用方法. 1 ...

  5. wikioi 1076 排序 【这里含冒泡、选择、插入以及快排库函数的调用】

    /*=================================================================== 1076 排序 题目描述 Description 给出n和n ...

  6. Log4j 使用总结

    在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Appender及Layout的分别使用.Log4j支持两种配置文件格式,一种是XML格式的文件,一 ...

  7. 不透明度(兼容IE8,chrome,firefox)

    background-color: rgba(0, 0, 0, 0.2); background-color: black; opacity: 0.2; filter: Alpha(opacity=2 ...

  8. CentOs 设置静态IP 方法 dhcp的配置

    0.自动获取配置 DEVICE=eth0 HWADDR=00:0C:39:AD:11:48 TYPE=Ethernet UUID=c230a1e5-a535-487a-aab5-2fad7cd5583 ...

  9. 打印Java main方法执行的命令参数代码

    RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); List<String> jvmArgs = bean.getInpu ...

  10. fastjson 使用方法

    Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一. 2.功能qiang打,支持JDK的各种类型 ...