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. PHP pdao用法总结

    $sql = 'SELECT name, colour, calories     FROM fruit     WHERE calories < :calories AND colour =  ...

  2. 11g RAC日志体系(cluster,database,asm,scan日志,ADRCI工具的使用)

  3. C# Timer用法及实例详解

    C# Timer用法有哪些呢?我们在使用C# Timer时都会有自己的一些总结,那么这里向你介绍3种方法,希望对你了解和学习C# Timer使用的方法有所帮助. 关于C# Timer类  在C#里关于 ...

  4. prtg

    prtg http://www.paessler.com/prtg/features prtg的sensor技术 数据库监视 Flexible Alerting 9 notification tech ...

  5. PHP stdClass Object转array

    用json传过来的数组并不是标准的array,所以需要用这个函数进行转换. function object_array($array){   if(is_object($array))   {    ...

  6. 【转】php利用mkdir创建多级目录

    先介绍一下 mkdir() 这个函数: mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径: 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访 ...

  7. windows下android开发环境搭建

    JDK的安装和Java环境变量的设置 1 JDK下载地址 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.h ...

  8. Android监听点击事件实现的三种方法

    监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...

  9. java8新语法

    Lambda表达式和函数接口(Functional Interface) // lambda expressions public static void DemoLambda() { // 不使用l ...

  10. IIS不定期Crash和Oracle“未处理的内部错误(-2)”的问题分析

    问题描述:系统不定期报出Oracle“未处理的内部错误(-2)”,严重时IIS会Crash 典型异常日志如下: Exception type:   System.AccessViolationExce ...