SOA 与 DDD
SOA是技术架构方面,Evans DDD则是哲学方法论方面,所属方向不一样,或者说两者非常的无关。甚至是两个不同方向。使用DDD可以将系统从无到有到大建立起来,而大到一定程度,就需要SOA,整合异构。如果说DDD和SOA有什么联系的话,那么组件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的更多相关文章
- 敏捷开发相关编辑思想(SOA、DDD、REST、CQRS)
这是第一次写有关编程思想的东西. 1.理解Martin Fowler提出的SOA(面向服务歧义) 2.理解DDD(Domain-Driven Design领域驱动设计): http://blog.cs ...
- RESTful SOA与DDD(领域驱动设计)
视频地址:http://www.infoq.com/presentations/RESTful-SOA-DDD 作者的一个DDD采访:http://www.informit.com/articles/ ...
- 领域驱动设计(DDD:Domain-Driven Design)
领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...
- 结合领域驱动设计的SOA分布式软件架构
引言 本文主要是参考Martion Fowler所著的<企业应用架构模式>与Eric Evans所著的<领域驱动设计>这两本泰山之作,加上本人在近年实际的工作过程中开发SOA系 ...
- NServiceBus 概况
NServiceBus 概况 NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信 ...
- NServiceBus官方文档翻译(一)NServiceBus 概况
NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信模块,像其他成熟的SOA和DD ...
- linux-dns-11
1网卡设置配置文件里面DNS服务器地址设置,2.系统默认DNS服务器地址设置.3,hosts文件指定 生效顺序是: 1 hosts文件 ---- 2 网卡配置文件DNS服务地址 ---3 /etc/r ...
- 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd
下面是按着我所接触的架构模式,开始一个一个的说一下 第一 标准架构 三层结构
- 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域
一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...
随机推荐
- PHP pdao用法总结
$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = ...
- 11g RAC日志体系(cluster,database,asm,scan日志,ADRCI工具的使用)
- C# Timer用法及实例详解
C# Timer用法有哪些呢?我们在使用C# Timer时都会有自己的一些总结,那么这里向你介绍3种方法,希望对你了解和学习C# Timer使用的方法有所帮助. 关于C# Timer类 在C#里关于 ...
- prtg
prtg http://www.paessler.com/prtg/features prtg的sensor技术 数据库监视 Flexible Alerting 9 notification tech ...
- PHP stdClass Object转array
用json传过来的数组并不是标准的array,所以需要用这个函数进行转换. function object_array($array){ if(is_object($array)) { ...
- 【转】php利用mkdir创建多级目录
先介绍一下 mkdir() 这个函数: mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径: 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访 ...
- windows下android开发环境搭建
JDK的安装和Java环境变量的设置 1 JDK下载地址 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.h ...
- Android监听点击事件实现的三种方法
监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...
- java8新语法
Lambda表达式和函数接口(Functional Interface) // lambda expressions public static void DemoLambda() { // 不使用l ...
- IIS不定期Crash和Oracle“未处理的内部错误(-2)”的问题分析
问题描述:系统不定期报出Oracle“未处理的内部错误(-2)”,严重时IIS会Crash 典型异常日志如下: Exception type: System.AccessViolationExce ...