-
SOA中的Profile与基于SCA、SDO的实现部署(一)
2006-07-14
务虚的东西谈的太多了难免使人感觉身在浮云,业务和服务模型完整的分析之后带来的就是如何定义与部署服务的问题。这篇Blog要解决的就是这样一个问题。
首先来了解一下什么是Profile,说白了,它就是用来规约服务的,它至少包括了所有服务之间默守的一种契约;又或者比作文档模版,具体的内容(服务本身)规约并不关心,它所关心的是使服务的表现形式是否能体现同一标准性,但Profile本身决不仅仅限于规约每个服务本身,它还有更大的用处,在了解它之前,既然是定义服务的,那么不妨拿它和WSDL作比较,应该会更加清楚它的产生的渊源、作用和意义之区别所在。
先来看WSDL中的元素定义和关系图

- Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
- Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
- Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
- PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
- Binding - 特定端口类型的具体协议和数据格式规范的绑定。
- Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
- Service- 相关服务访问点的集合。
稍微了解WSDL的人都应该知道它是用来定义某一个具体服务的,包括它的位置、提供了哪些服务访问点、每个服务访问点的所绑定的通讯协议和数据格式规范、传递消息的组成形式及使用的数据类型等信息,仔细想来这些内容是定义在每个服务的设计层次上的,它关心的每个服务本身而不是服务之间的相互协作形成的软件系统架构,况且WSDL协议是针对Web Service这种服务实现形式定义的,这在SOA中并不具有通用性。也就是说WSDL所关注的粒度相对于SOA中的Profile是太细节了,WSDL关心的是Web Service的规范定义,Profile则更多的关心多个服务的划分、协作、连接等问题。可以说两者并不矛盾,因为它们各自定义粒度不同,所关心的内容也不同,那么这样一个Profile到底是什么样的呢?来看下图

这里先把关注点放在图的左下方的Specification部分,它应该就是我们所熟知的WSDL协议所规定内容(但不限于它,因为WSDL是针对Web Service而SOA并不规定具体的服务形式),注意这里Specification具有一个属性是published,这相似于制定说这个服务是否被发布到一个制定的服务库中,如果针对Web Service就是指是否发布到UDDI中了。Specification指明了包含哪些Operation,这与WSDL中每个PortType下可以包含多个Operation相类似,但应该注意在Profile并没有如WSDL中Binding的内容,因为它已经属于每个Service的设计细节与SOA架构无关。同时也应该注意的是在Profile中虽然也指定了Message,但并没有如WSDL中详细规定每个Message中包含哪些数据以及数据的格式,这个原因同样也是因为SOA并不关心这样的Service设计细节,Message与Attachment都只具有一个属性就是编码方式,一般来讲Attachment很少用到,只有在需要至少两种编码方式的时候才会被使用。在Profile中左下这些内容就已经涵盖了WSDL的定义范围,当然并没有WSDL规定的那么细节,那么右上方的内容是什么呢?
右上方的Profile内容才是真正体现SOA的地方,它关心的是系统架构而不是每个服务的接口设计细节。对他们的理解要借助于SCA才能更好的将如此抽象的内容理解清楚,这里先简要介绍一下:Service以端口的形式制定了服务本身,至于如何调用Service是Specification指定的;Provider是服务提供者,它作为类实体提供一个或多个服务,它具有属性指定允许的平台绑定机制和服务提供者自身位置,我们可以把它想象成为提供某种服务的集合(例如在服务模型中定义的信息服务、事件服务、传输服务、外部服务、系统管理服务等);Partition是服务划分,它用来代表系统的逻辑/物理边界,一个Partition中可以包含多个Provider,当然站在更高的层次上来看这个问题,其实每个Partition都可以成为更高层的独立服务;Gateway是服务网关,它用来表示每个Partition中哪些服务是可以对外的,还是站在更高的层次上讲服务网关不仅屏蔽了底层不需要了解的细节,同时如果Partition被提升为独立服务,那么一个Gateway看起来就像一个Service了,而恰巧Service和Gateway的元类型都是Port,且Sepcification这个接口是可以通用与Service和Gateway的;Consumer是服务消费者,它可以是一个服务也可是其他的,一般来讲Consumer是高层次的概念,很少在这个层面给出很好的比喻;Connector是连接器,它用来指定服务之间的通讯绑定或服务与客户之间的服务绑定,属性binding指定服务产生时的平台绑定机制;Collaboration是协作,它指定一个服务的实现作为另一个服务的协作方式,换句话说就是使用了一种服务协作作为服务的行为,注意Collaboration仅仅限于Providers之间。
解释了这么多,相信大家已经有些概念了,不过这组概念还是相当难以理解,它们都属于原类型(stereotype),通用地合理解决关注点是是它们的意义,如果更加细节的了解,马上要介绍SCA和SDO。现在的理解程度应该是这样的:
1、Profile关心的是服务之间的关系,即系统架构,而不是每个服务的设计和实现机制;
2、Profile涵盖了以前WSDL中的内容,但由于其所关心的粒度不同,所以两者并不存在冲突反而是相辅相成的;
3、把Profile简单的看成服务规约是错误的,它所处的角度是系统架构师而不是设计实现人员;
未完待续……
-
SOA中的Profile与基于SCA、SDO的实现部署(二)
2006-07-14
前面谈到了SOA中Profile的问题,我们了解到这个Profile是用来作为服务系统架构而设计的,它所关心的粒度是服务系统架构一级的,而对每个服务的具体技术组成、接口形式、绑定协议、数据类型都没有明确的定义,从实现部署的角度来说这些具体实现形式也是必要的,下面先来看看什么是SCA(Service Component Architecture)服务组件架构。
SCA是一种新的与语言无关的服务组件编程模型,为所有服务组件提供统一的调用方式,使得客户可以把不同的组件类型采用同一标准进行封装。SCA的前身是WSIF(Web Service Invocation Framework),当然WSIF是Web Service领域的一个规范仅提供基于Java API调用各种服务的能力,没有形成架构模型,而SCA是在它的基础之上放宽了对实现细节的定义同时将关注点提升到系统架构层次。下图展示了SCA服务组件的基本结构,它是SCA的基本组成元素和基本构建单位,如图所示SCA服务组件的主要接口规范是基于WSDL的单同时部分服务组件也提供了Java接口,这样便于服务组件的客户端选择,服务组件提供的调用入口成为Interface,需要调用的出口叫做Reference。

SCA服务组件与传统组件的主要区别在于:
1. 服务组件往往是粗粒度的,而传统组件以细粒度居多。
2. 服务组件的接口是标准的,主要是WSDL接口,而传统组件常以具体API且大部分是二进制形式出现。
3. 服务组件的实现与语言是无关的,而传统组件常绑定某种特定的语言。
4. 服务组件可以通过组件容器提供QoS的服务,而传统组件完全由程序代码直接控制。
我们可以看到这个服务组件其实就是我们在Profile中提到的Service和Specification等,当然这里隐含了Message的定义,那就会想到这样一个问题——Provider或者Partition在哪里呢?在SCA中是不是有所体现呢?是的,在SCA中我们确实可以找到Provider和Partition原型所对应的技术模型——服务模块(Module)。

服务模块是由一个或多个具有内在联系的服务组件构成的,是SCA中的运行单位。服务模块包含多个服务组件,它体现了一种逻辑/物理上的组件服务分类界定,同时可以通过独立的地址进行访问,服务组件之间的调用关系在WebSphere Integration Developer V6.0中可以通过Interface和Reference的连线来声明不需要写任何代码。
那么多个服务模块之间如何调用呢?这就需要通过导入导出功能——导入的作用是使得模块中的服务组件可以调用模块外部的服务,导出的作用是使得模块外部的应用可以调用模块内部的服务组件,在IBM用于部署支持SOA的WebSphere Process Server V6.0中,为导入导出各自指定了包括目标服务和原服务的位置信息、调用方式等在内绑定信息,涉及JMS绑定、Web Service绑定、SCA绑定、无状态会话BEAN绑定四种绑定方式,对于同为SCA模块之间使用SCA绑定是最方便的,其他情况下可以选择其他绑定方式。
在SCA体系中还包括可以被多个模块共享的共享库(Library),它与服务模块不同的地方在于其不包含任何服务组件,这里不详细介绍了。
我们已经了解到了服务模块之间如何调用,但是必然还会涉及到与原有系统已经存在部分的沟通情况,例如外部Java代码、JSP/Servlet调用怎么样使用某个服务模块呢?模块中的服务组件不能直接被他们使用,只能通过Standalone Reference,它是一个只提供Reference不提功过Interface的端点,然后通过对Reference的使用就能调用它所连接的服务组件了,具体示例代码见IBM Developers网站。
这样就比较详细的了解了SCA,但是还有几个细节问题需要考量:1、服务组件的同/异步调用;2、服务组件客户端调用方式;3、异构数据源的数据获取问题。
对于第一个问题,显然在粗粒度的组件服务之间绝大多数情况都应该使用异步调用方式,因为从调用者角度来讲他可能面对的是一个需要长时间响应的事务,同时只有异步调用才更加良好地模拟真实环境,想想我们现实生活就明白了。SCA中提供了单向调用、延迟响应、请求回调三种异步调用方式。个人认为单向调用方式存在的情况并不多,而延迟响应显然对延迟长短的界定需要很强的领域知识和系统观念比较难以控制,真正符合我们各种情况下需要的就是请求回调这种异步方式了,这与许多编程语言中的回调机制相同,即通过将调用者接口传送给被调用者,期待事务完成之后通过事件触发由被调用者主动向调用者发送请求,这也就是所谓的回调。
对于第二个问题,客户端存在静态/动态两种调用方式,如果采用服务组件的WSDL接口进行调用就必须采用动态方式,而采用Java接口则两种都可以使用,显然采用动态方式更加灵活,但是它的Invoke在编译期是无法被检验的,在动态调用方式下所有参数都是通过DataObject方式进行传输的,这就涉及到了下面要谈的异构数据源的问题。
如何通过统一的方式来访问异构数据源,简化J2EE数据编程模型是一直以来困扰设计人员的问题,太多的底层数据访问细节让编程、调试和配置困难重重。SDO框架支持并集成XML,希望通过这种可自定义的语言标准来拟合各种业务数据并实现他们之间的无缝转化。SDO的前身叫做WDO,它包括三个概念上的部分:SDO客户机、Data中介服务、数据源,其中最重要的就是Data中介服务,简称DMS。以上三个仅仅是概念上的东西,不对应于任何一个具体的Java接口,而数据对象、数据图、变更摘要、属性类型等则分别对应了commonj.sdo.DataGraph、commonj.sdo.ChangeSummary、commonj.sdo.DataObject、commonj.sdo.Property,这些都在SDO1.0中提供了支持。数据对象就是结构话数据的SDO表示,它是通用的,SDO的客户机不需要了解它的细节,数据对象在属性中保存它们的数据,而多个数据对象按照层次就构成了数据图,同样数据图中也包含了变更摘要。数据图其实就是数据对象树的容器,SDO 客户机可以遍历数据图,读取和修改数据图中的数据对象,SDO 客户机与 DMS 和数据源没有连接,所以 SDO 客户机看到的只有数据图。当然数据图是在内存中的存在的,真正保留在磁盘或网络上传输的是序列化之后的XML文件,而数据图模型也就可以看作所谓的XML Schema,具体的程序例子参看IBM Developers网站。
有了以上这些,其实从数据访问层到组件构建层都已经很清楚了,加上良好的业务、服务模型设计和系统架构设计,那么真正实现SOA部署就不是什么难事了。
-
工作计划_SeraphZhang
2006-07-14
虽然顺利地进入了复赛,但更重要的是从评委的点评中发现了我们的不足,今天下午大家在短暂的休息之后又聚到了一起,商讨复赛的事情,虽然还没有正式接到IBM的复赛日程通知,但该准备的还是要下手了,尤其是我们自己薄弱的地方。
感觉大家对SOA中的服务规约理解的都不是太好,这其中涉及到的问题很多,尤其是在服务和组件具体设计和实现的时候,下面这一周的时间我的计划是重点看这部分的内容,然后把心得发布到Blog上来并和大家一起讨论分享,晚上看了IBM的毛新生先生的视频讲座,感觉在具体实施部署的时候SCA(Service Component Architecture)和SDO(Service Data Objects)是至关重要的,因为它们不仅是行业公认的SOA设计标准,而且只要服务符合SCA规范、数据源符合SDO规范就可以直接挂接在ESB总线上。
WebSphere Business Modeler Advanced 6.0
WebSphere Integration Developer 6.0
WebSphere Process Server 6.0
WebSphere Business Monitor 6.0
它们共同构成了IBM WBI(WebSphere Business Intergration)的产品系列,在这里可以找到这个产品系列的全部中文帮助文档。
我目前找到的东西就这么多,相信会对大家有些帮助,下面说说我的工作计划:
2006年7月12日之前给出自己关于服务规约的理解和大家讨论,之后利用一天的时间进行修改扩充,然后开始针对SCA和SDO进行进一步的理解和实验,在7月14日之前给出结论。
-
顺利进入“IBM 杯”高校 SOA 创新应用大赛复赛
2006-07-10
No. Team School Degree Final Grade
1 Black Stone 中山大学 硕士 Outstanding
16 渝越 重庆大学 本科 Outstanding
18 IceAge 哈尔滨工业大学 硕士 Good
19 Lever 西安交通大学 硕士 Good
27 Terminator 华南理工大学 硕士 Outstanding
36 FISC 南京大学 本科 Good
48 ZOO 清华大学 硕士 Outstanding
52 Mozart 北京大学 硕博 Outstanding
87 MVP 西安交通大学 硕博 Outstanding
89 Lab-1109 北京大学 硕士 Outstanding
108 T-Business 北京大学 硕博 Good
110 NLSDESOA 北京航空航天大学硕士 Outstanding
133 51START 南开大学 硕博 Good
151 THU-EIP 清华大学 硕士 Good
166 IceTeam 清华大学 Outstanding以上是IBM公司公布的2006年“IBM 杯”高校 SOA 创新应用大赛的复赛名单,很高兴我们也能成为其中一员,但是发现自己在有些方面还是有很多差距的,应该更加努力的学习,虽然期望并一直朝着最好的结果努力,但过程中的收获才是最重要的。
-
IBM SOA 比赛参赛心得——worldinsand
2006-06-30
早在去年的时候,我就曾经带领张维组织的一个学生团队参加IBM创新大赛,我们最终闯入了全国前20名,只是由于学生们参赛经验不足,在进行Presentation的时候出现失误,所以才与奖项擦肩而过。2006年4月,IBM组织的SOA应用创新大赛开始了,当张维找到我的时候,我们几乎是一拍即合,就这样,我们又一次参加了IBM创新大赛。
作为教师,我一直苦恼于如何提高学生们的应用创新能力,特别是培养驾驭技术、超越技术的能力。IBM的SOA应用创新大赛给我们提供了一个很好的机会,在接近真实应用环境的大赛题目中,我们需要考虑很多超出技术范围的内容,从市场营销的服务过程、到核心业务的管理流程,从一系列新颖的IT技术概念、到我们不曾深究的企业管理理念,参加比赛的过程就是我们不断超越自我的过程。“他山之石、可以攻玉”,在和同学们一次次讨论的过程中,在不断充实丰富我们的团队Blog的过程中,我好像回到了曾经的学生时代,心中充满梦想和激情,在交流和协作中去克服一个又一个困难。两个月的时间的确很短,但是对51Start团队的每一个成员来说,这必将是一段让我们经久难忘的经历!
我们正处在一个不断变革和创新的时代,学习是认知世界的过程,而实践则是改造世界的过程,这个时代要求我们不断的在实践中学习、在学习中实践。IT技术的蓬勃发展和广泛应用给我们提供了一片无比广袤的天空,让我们的智慧和激情自由的飞翔!51Start是我们又一次启程的地方,也许前方充满荆棘和坎坷,但是勇敢的成长,是我们心甘情愿的选择!








