Author: Yuanxin Li
projectair@163.com Yuan-Xin.Li@sun.com
以前接触过一些SOA(Service Oriented Architecture)的概念,也过做一些这方面的
应用,但还是觉得不好理解,最近阅读了一些资料,有了更深一层的理解,故得此文,希望能对大家理解SOA有一些帮助。
其实SOA并不是一种
技术,他是一种
软件设计的架构和思想,他的根本目的在于把零散的“孤岛
系统”整合起来,最大化地做到
软件的重用性。我们首先来看一下使用SOA前
软件的架构:
上面这幅图讲述的是一个银行的客户,他要办理信用业务和贷款业务,那么,他为了完成这两个业务,他必须访问两个系统,一个是信用系统,一个是贷款系统。其中两套系统都要做余额检查和信用额度检查,另外,信用和贷款业务也有各自不同的业务流程,然而我们在业务层看到,这些业务都需要访问客户
数据库、后台
管理系统、一些合作者的信用
数据等等,而且这两套系统的
数据有些是共享的,有些则是各自独有的。我们可以看出,信用和贷款的两个系统是相互孤立的,
数据虽然是共享的,但都是在各自的系统里独立地去取。在这种架构里面,存在很大的冗余性,直觉告诉我们,我们应该把一些对共享
数据的操作抽取出来,减少系统的冗余性。我们把这些零乱的、无组织的、许多不协调的实体、单任务的焦点(或系统)成为复合的应用
程序,而在这些应用
程序中,都需要访问一些共享的
服务。所谓共享的
服务,是指单独或或者少量协调的实体、被许多未知客户共享的、可靠可用性能好的
服务。这复合应用和共享应用,这两者组成了SOA最核心的对象。
使用SOA的架构后,这两个系统的架构就变成以下这样了:
在这幅图里,我们把访问共享数据的操作封装为可重用的共享的服务,而上层的业务逻辑也把一些重复的业务封装为可重用的商业组件,因此,在编写上层服务的时候,成本就大大地降低了。这就是SOA的好处。
可以用一个现实的场景来理解SOA。我们可以把各种各样的电器,比如录音机,电视机,电吹风,烤面包机等等,看作是复合的应用程序。因为它们是不协调的、无组织的、混乱的、单任务的,临时的焦点。这些电器有一个特点,都需要用电,而且所用到的电都必须是符合国家标准的。那么这些电是由哪里来的呢?是由一个供电站来的,各种电器只要使用符合标准的插头,往插座上一插,就可以使用供电站提供的电力了。因此,我们又可以把供电站看作共享的服务,通过统一的接口(插座)来向各种电器(复合的应用)供电。试想一下,如果没有这种SOA的思想,每个电器都要做一个发电器来供电,那会是怎样?
看到这里,你也许会觉得SOA的很多特点都与面向对象的思想很相似,这是正确的,因为SOA的规则与面向对象的规则很相似:抽象、松耦合、自治、服务契约、重用性、可发现性、可组合性、无状态。因此我们可以把SOA看作是更高层次的面向对象。作为一个开发者,他可能会用面向对象的思想去设计他的程序,而作为一个架构师,那么他应该站的更高,用SOA的思想去看问题,尽量减少系统开发和维护的代价。
下面来看一下所谓面向服务的架构,他必须包括哪些服务:
表示层服务:以
用户体验为中心的表现层服务以及一些Portlet
业务流程服务:这部分服务主要是通过消息的传递和流动判断将要使用哪些服务
业务活动服务:这部分主要是对上一层确定要使用的服务进行调用
数据服务:提供业务活动所需的数据
连接性服务:数据服务的源可能并不是基于SOAP协议的服务,例如可能是一个EJB,或者
IBM主机CICS系统提供的一些数据,通过JDBC产生的一些数据等等,连接性服务就是要把这些服务提供者提供的数据转换为基于SOAP协议的服务,例如WebService。
以上的这个架构是一个层次非常分明的架构,按道理来说,已经可以解决我们文章开头说到的那些问题了,于是,我们又可以将架构表示为下图:
很不幸的是,这个架构存在3个致命的问题,这可能会造成SOA的架构设计前功尽弃:
1、复合应用程序和服务之间是点到点的访问方式,因此,每个客户端都必须知道服务的地址以及接口;
2、复合应用程序和服务之间紧密地耦合在一起,当服务变更的时候,客户端的访问变得难以维护;
3、由于是点到点的访问,客户端非常多时,造成性能下降。
因此,在复合应用和服务之间,必须有一个服务中介来解决点到点访问的复杂性!这就是我们所需要的“企业服务总线”(ESB)。加入ESB后,我们的架构变为下图:
ESB解决了点到点的服务访问形式的弊端,他把服务的细节屏蔽掉,将所有的服务注册为统一的调用接口,因此,当服务发生变更时,只需变更ESB的配置就可以了。而在ESB里,通过消息流的方式判断出要使用的服务,再调用具体的服务。
最后,我们来看一下整个SOA架构的概念性框架,只有实现了这个框架,才是一套完整的SOA解决
方案:
[
本帖最后由 云杉上的蝴蝶 于 2008-5-22 20:22 编辑 ]