SOA(面向服务的体系架构)基本概念

《SOA:原理方法实践》的第1章从概念上对SOA给出一个全面而精炼的总体描述。首先说明SOA的特点,以及使用SOA对系统进行架构决策和设计的必要性。然后介绍了SOA的参考体系结构、设计原则及相关技术的简介。

引言

《SOA:原理方法实践》是一本全面探讨SOA理念、SOA方法学、设计模式和案例分析的书籍。这本书由IBM新技术研究院Web 2.0首席架构师毛新生领衔执笔,汇集了IBM软件开发中心众多SOA专家们的经验和智慧。

本书首先从作者的实际经验出发,分析SOA产生的根源,然后分析SOA的相关开发技术,最后结合实例讲述完整SOA项目的开发过程。我们将陆续推出此书的第1、4、10章。

1.1 SOA的基本概念

SOA是英文词语"Service Oriented Architecture"的缩写,中文有多种翻译,如"面向服务的体系结构"、"以服务为中心的体系结构"和"面向服务的架构",其中"面向服务的架构"比较常见。SOA有很多定义,但基本上可以分为两类:一类认为SOA主要是一种架构风格;另一类认为SOA是包含运行环境、编程模型、架构风格和相关方法论等在内的一整套新的分布式软件系统构造方法和环境,涵盖服务的整个生命周期:建模-开发-整合-部署-运行-管理。后者概括的范围更大,着眼于未来的发展,我们更倾向于后者,认为SOA是分布式软件系统构造方法和环境的新发展阶段。

在SOA架构风格中,服务是最核心的抽象手段,业务被划分(组件化)为一系列粗粒度的业务服务和业务流程。业务服务相对独立、自包含、可重用,由一个或者多个分布的系统所实现,而业务流程由服务组装而来。一个"服务"定义了一个与业务功能或业务数据相关的接口,以及约束这个接口的契约,如服务质量要求、业务规则、安全性要求、法律法规的遵循、关键业绩指标(Key Performance Indicator,KPI)等。接口和契约采用中立、基于标准的方式进行定义,它独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在不同系统中的服务可以以一种统一的和通用的方式进行交互、相互理解。除了这种不依赖于特定技术的中立特性,通过服务注册库(Service Registry)加上企业服务总线(Enterprise Service Bus)来支持动态查询、定位、路由和中介(Mediation)的能力,使得服务之间的交互是动态的,位置是透明的。技术和位置的透明性,使得服务的请求者和提供者之间高度解耦。这种松耦合系统的好处有两点:一点是它适应变化的灵活性;另一点是当某个服务的内部结构和实现逐渐发生改变时,不影响其他服务。而紧耦合则是指应用程序的不同组件之间的接口与其功能和结构是紧密相连的,因而当发生变化时,某一部分的调整会随着各种紧耦合的关系引起其他部分甚至整个应用程序的更改,这样的系统架构就很脆弱了。

SOA架构带来的另一个重要观点是业务驱动IT,即IT和业务更加紧密地对齐。以粗粒度的业务服务为基础来对业务建模,会产生更加简洁的业务和系统视图;以服务为基础来实现的IT系统更灵活、更易于重用、更好(也更快)地应对变化;以服务为基础,通过显式地定义、描述、实现和管理业务层次的粗粒度服务(包括业务流程),提供了业务模型和相关IT实现之间更好的"可追溯性",减小了它们之间的差距,使得业务的变化更容易传递到IT。

因此,可以将SOA的主要优点概括为:IT能够更好更快地提供业务价值(Business Centric)、快速应变能力(Flexibility)、重用(Reusability)。

从演变的历程来看,SOA在很多年前就被提出来了,现在SOA的再现和流行是若干因素的结合。一方面是多年的软件工程发展和实践所积累的经验、方法和各种设计/架构模式,包括OO/CBD/MDD/MDA、EAI和中间件;另一方面是互联网的多年发展带来前所未有的分布式系统的交互能力和标准化基础。与此同时,企业越来越重视业务模型本身的组件化,以支持高度灵活的业务战略。但是现有的企业软件架构不够灵活,难以适应日益复杂的企业整合,难以满足随需应变商务的需要,因此与业务对齐、以业务的敏捷应变能力为首要目标、松散耦合、支持重用的SOA架构方法得到青睐。更多的细节请参见"以服务为中心的企业整合"。

基于我们同客户打交道的经验,有必要在这里澄清大家经常混淆的几个基本问题。

第一,SOA是架构风格,是方法;而不是具体架构具体实现技术(如Web Service)、具体架构元素(如企业服务总线,Enterprise Service Bus,ESB)。

经常有人认为只要用了Web Service,就是SOA了。这是不对的,Web Service只是实现服务的一种具体技术表现形式。同样,认为搞SOA,就是买点软件,建个ESB,这也是不对的,ESB只是SOA架构风格中的一部分。首先,ESB是一种从实践中总结出来的架构风格元素,即BUS(总线模式);其次,ESB的主要功能是负责连通性和服务中介(Service Mediation),解耦服务的请求者和服务的提供者。

第二,SOA的首要目标是IT与业务对齐,支持业务的快速变化;其次是IT架构的灵活性和IT资产的重用。

业务对敏捷性的需要,是SOA最大的驱动力。一方面是业务在这方面的要求越来越高;另一方面是今天的IT很不灵活,很难适应业务快速变化的需求,不仅仅是因为IT架构不灵活,更重要的是业务模型中的元素和IT系统的元素之间存在很大的差距。这种不对齐,导致业务人员和IT人员之间的沟通不够有效,业务的变化需要花费很大的代价传递到IT系统。很难想像,业务人员对一个Java对象,一个EJB或者一个JSP页面感兴趣,这离业务世界太远了。这种业务和 IT的对齐,需要在IT系统中实现更高阶的抽象元素,就是业务模型中的元素(服务、流程、业绩管理),并且满足业务需要的水平整合(将人、信息、应用和流程端到端地动态整合起来)。这样一个以服务为中心的、端到端整合的环境,首先使得业务变化可以在业务元素这个层面上沟通,更容易、更准确地从业务传递到 IT。其次,这种变化被隔离在需要变化的局部,而不扩散到系统的其他部分。这就需要整个IT架构本身是松散耦合的,一个服务的变化(功能、数据、过程、技术环境等)不影响其他服务。最后,我们希望这些反映业务元素的服务,是相对稳定、可以重用的,这对快速适应变化、减少成本是非常重要的。

第三,在工程上,SOA的重点是服务建模和基于SOA的设计原则进行架构决策和设计。

经常碰到客户提出这样的问题:SOA挺好,为什么好?怎么做才是SOA的方法?跟过去的方法,比如OO/CBD有什么不同?有时候一个J2EE服务器就好了,为什么那么复杂?

从建模和设计的角度来说,SOA更多地侧重在业务层次上,也就是通过服务建模将业务组件化为服务模型,它是业务架构的底层,是技术架构的顶层,承上启下,是灵活的业务模型和IT之间的桥梁,保证二者之间的"可追溯性"。从这里往下,是基于已有的方法,比如OO/CBD来进行的。从架构的层次上,SOA 更多地侧重于如何将企业范围内多个分布的系统(包括已有系统/遗留系统)连接起来(ESB,Adapter/Connector),如何将它们的功能、数据转化为服务,如何通过服务中介机制(ESB,Service Registry)保证服务之间以松散耦合的方式交互,如何组装(集成)服务为流程,如何管理服务和流程等。从这往下,对于实现服务的一个具体应用,它的架构、设计和实现是可以基于已有的实践和方法的,比如J2EE或.NET。

有些时候,由于业务需求比较简单,所有这些东西都在一个J2EE的应用服务器上,有些要素不是那么突出,不过随着系统规模的扩大,要解决的业务问题更复杂、范围更大的时候,SOA的各种架构要素就会变得越来越重要。

在下面的小节里就概括地讨论一下SOA的若干个重要方面,包括:面向服务的计算环境,编程模型,架构风格,工程方法,以及相关的技术。

1.2 计算环境的演变和面向服务的计算环境

1.2.1 计算环境

计算环境由一组计算机、软件平台和相互联通的网络组成,这个环境能够处理和交换数字信息,允许外界访问其内信息资源(1)。不同的计算环境有不同的计算风格和编程模型,由一些特定于该计算环境的技术来支撑。如何在一个计算环境中分割和部署计算能力、数据资源,如何让各个部分相互通信和协作,如何在概念上对问题域进行建模,然后映射到该计算环境,都会受到计算环境的影响和制约。因此,了解一下计算环境的历史,会帮助我们理解面向服务的计算环境是如何演变而来的。

1.2.2 计算环境的演变历程

计算环境的演变经历了若干个阶段,在早期的主机时代,绝大多数的计算功能和系统的组成部分,都包括在一台机器里。在20世纪80年代,随着PC的繁荣,计算环境发生很大的变化。通过局域网相互连接的计算设备构成客户/服务器计算环境,计算资源和数据资源被适当地分割,客户和服务器通过网络协议、远程调用或消息等方式来相互协作,完成计算。

为了满足更高的可伸缩性需求,多层架构出现,计算资源和数据资源的分布多样化,与企业中原来已经存在的计算环境,尤其是主机及其遗留系统之间的集成也变得越来越重要。中间件迅速发展,开始出现分布式对象、组件和接口等概念,用于在计算环境中更好地分割运算逻辑和数据资源。计算环境中不同部分之间的交互,也从原有相对低层的网络协议、远程调用和消息机制的基础上,发展到支持分布式对象、组件和接口之间的交互,这种交互在名字服务(Naming Service)等的支持下,通常是位置透明的。但由于缺乏普遍的标准化支持,很难做到技术透明,系统是紧耦合的。

随着互联网(Internet)的发展,开放和标准的网络协议被普遍支持,所有底层计算平台都开始支持这些标准和协议,这导致一个计算环境内部和各个计算环境之间交互的藩篱被打破。数据和功能的表示与交互在XML、WEB服务(Web Service)技术与标准的基础上,保证了通用性和最大的交互能力,这使得计算环境发展到一个全新的阶段–基于标准、开放的互联网技术的计算环境。在这样的计算环境中,各个部分可以采用异构的底层技术,它们使用XML来描述和表示自己的数据和功能,采用开放的网络协议(如HTTP)来握手,在此之上,基于Web服务来互操作和交换数据。在这里,一个很重要的新概念是"服务"(2),它是一个自包含的功能,使用者通过明确定义的接口(契约)来与一个服务交互,这个接口的描述基于WSDL(Web Service Description Language)这样的开放标准。对象和组件重在表示一个事物本身的组成部分和相互关联(也就是WHAT"THINGS"ARE的问题),而服务则表示一个事物做什么(也就是WHAT"THINGS"DO的问题)。Web服务是实现服务的技术手段,就如同各种编程语言中的对象是实现对象的技术手段,J2EE中的EJB是实现组件的技术手段一样。这种基于标准、开放的互联网技术,以服务为中心的计算环境,我们称之为"面向服务的计算环境"。

1.2.3 面向服务的计算环境

在面向服务的计算环境中,系统可以是高度分布、异构的。它一般包括服务运行时环境(Service Runtime)、服务总线(Service Integration Infrastructure)、服务网关(Service Gateway)、服务注册库(Service Registry)和服务组装引擎(Service Choreography Engine)等,如图1-1所示。

服务运行时环境提供服务(和服务组件)的部署、运行和管理能力,支持服务编程模型,保证系统的安全和性能等质量要素;服务总线提供服务中介的能力,使得服务使用者能够以技术透明和位置透明的方式来访问服务;服务注册库支持存储和访问服务的描述信息,是实现服务中介、管理服务的重要基础;而服务组装引擎,则将服务组装为服务流程,完成一个业务过程;服务网关用于在不同服务计算环境的边界进行服务翻译,比如安全。

面向服务的计算环境是开放的、标准的,由如图1-2所示的技术标准协议栈所定义和支持。例如,Transport层的HTTP协议,Service Description层的WSDL,Business Process层的WS-CDL等,与Policy相关的WS-Policy。本书后面的章节将讨论所有统称为WS-*的标准和协议。


图1-1 SOA计算环境的组成要素


图1-2 SOA计算环境的标准协议栈

面向服务的计算环境,为IBM所定义的随需应变计算环境奠定了现实基础。随需应变计算环境应具备以下特点,如图1-3所示。


图1-3 随需应变的计算环境应该具备的特点 

(1)整合:将人、过程、应用和数据全面整合起来。

(2)虚拟化:将分布、异构的物理资源(服务器、存储设备等)整合起来,呈现为统一的逻辑对象,以安全和可管理的方式供使用。

(3)自主计算:如同生物体一样,系统具备一些高级生物系统的能力,包括自我诊断和修复问题,自动配置和调整以适应环境的变化,自动优化资源的使用效率、增强工作负荷的处理的能力,自我保护数据和信息的安全。

(4)开放标准:整个环境建立在开放的标准之上,保证系统的交互性。

1.2.4面向服务计算环境的现状

不同的服务计算环境,采用不同的技术和产品,这里主要结合IBM的产品和技术来介绍在J2EE平台上实现的服务计算环境。

主机通过增加对互联网技术和标准的支持,来创建主机上的面向服务计算环境。比如IBM的CICS 3.1,提供了SOAP和Web服务的支持,可以将主机上的应用以Web服务的方式提供出来,供消费者使用。

多年来,IT界的主要技术提供者,一直携手努力定义和推动Web服务的相关标准,并且在主要的几个计算平台上实现了高度兼容,包括.NET,J2EE和开源平台(如LAMPLinux,Apache,mySQL,PHP/Perl/Python)。

IBM以J2EE为基础,提供了全面的、强大的服务计算环境,如图1-4所示。


图1-4 IBM提供的服务计算环境

在这个计算环境中,它是服务的世界。其中,Access Services提供访问已有应用或遗留系统的能力,将已有系统中的功能和信息转化为服务,IBM提供了访问不同系统的适配器和相应的框架来帮助转化。 Business App Services指那些通过新的计算平台J2EE(如IBM的WebSphere Application Server)来实现的新应用,它们所实现的功能和信息也都转化为服务提供出来。Partner Service指那些来自合作伙伴的服务,WebSphere Partner Gateway提供企业边界处不同安全等差异的转换。Information Service是那些跟信息(而不是活动)有关系的服务,比如将多个系统中异构的数据,聚合、转换为业务需要的统一整齐的业务数据对象来访问。 Process Service是指把多个服务聚合成为一个服务流程对应业务过程的服务,这种复合服务通常是长时间运行的过程。Interaction Service是把人的活动,通过人机交互以服务的方式出现在整个业务过程中,作为Process Service中的一部分。

在面向服务计算环境中,企业服务总线处于非常重要的位置,它提供服务的中介,解耦服务请求者和服务提供者,是服务计算环境中的核心。ESB是过去消息中间件的发展,采用了"总线"这样一种模式来管理和简化应用之间的集成拓扑结构,以广为接受的开放标准为基础来支持应用之间在消息、事件和服务级别上的动态互联互通。

ESB的基本特征和能力包括:描述服务的元数据和服务注册管理;在服务请求者和提供者之间传递数据及对这些数据进行转换的能力,并支持由实践中总结出来的一些模式如同步模式,异步模式等;发现、路由、匹配和选择的能力,以支持服务之间的动态交互,解耦服务请求者和服务提供者。高级一些的能力,包括对安全的支持、服务质量保证、可管理性和负载平衡等。

ESB所提供的基于标准的连接服务,将应用中实现的功能或者数据资源,转化为服务请求者能以标准的方式来访问的服务;当请求者来请求一个服务时,ESB 中这种中介转化过程可能简单到什么也没有,也可能要很复杂的中介服务支持,包括动态地查找、选择一个服务,消息的传递、路由和转换、协议的转换。这种中介过程,是ESB借助于服务注册管理及问题域相关的知识(如业务方面的一些规则等)自动进行的,不需要服务请求者和提供者介入,从而实现了解耦服务请求者和提供者的技术基础。这使得服务请求者不需要关心服务提供者的位置和具体实现技术,双方在保持接口不变的情况下,各自可以独立地演变。

所以,ESB采用总线结构模式简化了应用之间的集成拓扑,通过源自实践的模式,提供了基于标准的通用连接服务,使得服务请求者和服务提供者之间可以以松散耦合、动态的方式交互,从而在不同层次上使得SOA解决方案是一个松散耦合、灵活的架构。

需要注意的是,ESB是一种架构模式,不能简单地等同于特定的技术或产品,但实现ESB确实需要各种产品在运行时和工具方面的支持。IBM有很好的产品支持,运行时支持包括WebSphere ESB和WebSphere Message Broker;工具支持有WebSphere Integration Developer,支持用户以图形界面的方式来完成相关的开发任务,如发布服务、使用各种模式、转换消息和定义路由等。

1.2.5 面向服务的编程模型:服务组件架构(SCA)和服务数据对象(SDO)

为了促进面向服务应用的开发,IT公司联合起来,在2005年11月发布了服务组件架构(Service Component Architecture)和服务数据对象(Service Data Object)规范,这些公司包括IBM,BEA,Oracle,SAP等。

SCA的目标是大大地简化服务开发,直接采用Web服务和XML开发服务,使得程序员工作在底层技术上,需要应付各种异构环境下的具体实现细节。其中,SCA定义和规范了技术中立和实现透明的服务组件、服务及服务调用和组装;而SDO定义和规范了服务世界里的数据,这些数据对象拥有清晰定义的信息模型,独立于数据源和具体数据访问技术,使得服务访问数据和在服务之间交换数据更方便、有效。

很多公司已经在J2EE平台上支持了SCA/SDO,还提供了C++的版本。IBM WebSphere Process Server 6实现了SCA/SDO规范,提供了最新的SOA编程模型的支持,已经在很多实践中被广泛使用。


图1-3 随需应变的计算环境应该具备的特点 

(1)整合:将人、过程、应用和数据全面整合起来。

(2)虚拟化:将分布、异构的物理资源(服务器、存储设备等)整合起来,呈现为统一的逻辑对象,以安全和可管理的方式供使用。

(3)自主计算:如同生物体一样,系统具备一些高级生物系统的能力,包括自我诊断和修复问题,自动配置和调整以适应环境的变化,自动优化资源的使用效率、增强工作负荷的处理的能力,自我保护数据和信息的安全。

(4)开放标准:整个环境建立在开放的标准之上,保证系统的交互性。

1.2.4面向服务计算环境的现状

不同的服务计算环境,采用不同的技术和产品,这里主要结合IBM的产品和技术来介绍在J2EE平台上实现的服务计算环境。

主机通过增加对互联网技术和标准的支持,来创建主机上的面向服务计算环境。比如IBM的CICS 3.1,提供了SOAP和Web服务的支持,可以将主机上的应用以Web服务的方式提供出来,供消费者使用。

多年来,IT界的主要技术提供者,一直携手努力定义和推动Web服务的相关标准,并且在主要的几个计算平台上实现了高度兼容,包括.NET,J2EE和开源平台(如LAMPLinux,Apache,mySQL,PHP/Perl/Python)。

IBM以J2EE为基础,提供了全面的、强大的服务计算环境,如图1-4所示。


图1-4 IBM提供的服务计算环境

在这个计算环境中,它是服务的世界。其中,Access Services提供访问已有应用或遗留系统的能力,将已有系统中的功能和信息转化为服务,IBM提供了访问不同系统的适配器和相应的框架来帮助转化。 Business App Services指那些通过新的计算平台J2EE(如IBM的WebSphere Application Server)来实现的新应用,它们所实现的功能和信息也都转化为服务提供出来。Partner Service指那些来自合作伙伴的服务,WebSphere Partner Gateway提供企业边界处不同安全等差异的转换。Information Service是那些跟信息(而不是活动)有关系的服务,比如将多个系统中异构的数据,聚合、转换为业务需要的统一整齐的业务数据对象来访问。 Process Service是指把多个服务聚合成为一个服务流程对应业务过程的服务,这种复合服务通常是长时间运行的过程。Interaction Service是把人的活动,通过人机交互以服务的方式出现在整个业务过程中,作为Process Service中的一部分。

在面向服务计算环境中,企业服务总线处于非常重要的位置,它提供服务的中介,解耦服务请求者和服务提供者,是服务计算环境中的核心。ESB是过去消息中间件的发展,采用了"总线"这样一种模式来管理和简化应用之间的集成拓扑结构,以广为接受的开放标准为基础来支持应用之间在消息、事件和服务级别上的动态互联互通。

ESB的基本特征和能力包括:描述服务的元数据和服务注册管理;在服务请求者和提供者之间传递数据及对这些数据进行转换的能力,并支持由实践中总结出来的一些模式如同步模式,异步模式等;发现、路由、匹配和选择的能力,以支持服务之间的动态交互,解耦服务请求者和服务提供者。高级一些的能力,包括对安全的支持、服务质量保证、可管理性和负载平衡等。

ESB所提供的基于标准的连接服务,将应用中实现的功能或者数据资源,转化为服务请求者能以标准的方式来访问的服务;当请求者来请求一个服务时,ESB 中这种中介转化过程可能简单到什么也没有,也可能要很复杂的中介服务支持,包括动态地查找、选择一个服务,消息的传递、路由和转换、协议的转换。这种中介过程,是ESB借助于服务注册管理及问题域相关的知识(如业务方面的一些规则等)自动进行的,不需要服务请求者和提供者介入,从而实现了解耦服务请求者和提供者的技术基础。这使得服务请求者不需要关心服务提供者的位置和具体实现技术,双方在保持接口不变的情况下,各自可以独立地演变。

所以,ESB采用总线结构模式简化了应用之间的集成拓扑,通过源自实践的模式,提供了基于标准的通用连接服务,使得服务请求者和服务提供者之间可以以松散耦合、动态的方式交互,从而在不同层次上使得SOA解决方案是一个松散耦合、灵活的架构。

需要注意的是,ESB是一种架构模式,不能简单地等同于特定的技术或产品,但实现ESB确实需要各种产品在运行时和工具方面的支持。IBM有很好的产品支持,运行时支持包括WebSphere ESB和WebSphere Message Broker;工具支持有WebSphere Integration Developer,支持用户以图形界面的方式来完成相关的开发任务,如发布服务、使用各种模式、转换消息和定义路由等。

1.2.5 面向服务的编程模型:服务组件架构(SCA)和服务数据对象(SDO)

为了促进面向服务应用的开发,IT公司联合起来,在2005年11月发布了服务组件架构(Service Component Architecture)和服务数据对象(Service Data Object)规范,这些公司包括IBM,BEA,Oracle,SAP等。

SCA的目标是大大地简化服务开发,直接采用Web服务和XML开发服务,使得程序员工作在底层技术上,需要应付各种异构环境下的具体实现细节。其中,SCA定义和规范了技术中立和实现透明的服务组件、服务及服务调用和组装;而SDO定义和规范了服务世界里的数据,这些数据对象拥有清晰定义的信息模型,独立于数据源和具体数据访问技术,使得服务访问数据和在服务之间交换数据更方便、有效。

很多公司已经在J2EE平台上支持了SCA/SDO,还提供了C++的版本。IBM WebSphere Process Server 6实现了SCA/SDO规范,提供了最新的SOA编程模型的支持,已经在很多实践中被广泛使用。

1.3 软件体系结构的演变和面向服务的设计原则

软件开发一直是一件很难的事情,因为我们要处理的问题越来越复杂,人们处理这种复杂性最主要的手段就是抽象。回顾历史,我们的抽象层次越来越高,反映在各个方面,从编程语言、平台、开发过程、工具到模式。尤其是模式,大量出现在那些结构上设计得很好的软件系统中,无论是微观层次上(对象、组件)稳定出现的结构范式,还是在宏观层面上出现的架构模式。使用哪些抽象手段来为问题域建模?如何定义组成部分之间的协作和结构关系?如何定义从外界所看到的系统结构和行为?是什么设计原则在指导我们的架构决策?有什么最佳实践和模式可供借鉴?所有这些,形成了不同设计风格和体系结构范式(Architecture Paradigm)。

通常,一种体系结构范式,包括设计原则,来自实践的结构式样、组成要素和关系,以及在整个开发生命周期中它们是如何被识别、描述和控制的。体系结构从过去单个应用包罗一切的客户/服务器的模式,逐渐演变到三层和多层结构的各种分布式计算模式。今天,人们开始谈论和实践面向服务、更加分布化的架构范式。

从抽象手段而言,SOA在原有方法的基础上,增加了服务、流程等元素。这些抽象手段之间的关系如图1-5所示。

如何利用这些抽象手段,将一个业务需求转化为流程、服务,进一步建模为服务组件,然后结合具体实现环境,在重用已有系统的功能和数据资源的基础上来实现?如图1-6所示是IBM总结的SOA架构概念模式。

SOA架构中,继承了来自对象和组件设计的各种原则,如封装、自我包含等。那些保证服务的灵活性、松散耦合和重用能力的设计原则,对SOA架构来说同样是非常重要的。

结构上,服务总线是SOA的架构模式之一。

关于服务,一些常见和讨论的设计原则如下:

(1)无状态。以避免服务请求者依赖于服务提供者的状态。

(2)单一实例。避免功能冗余。


图1-5 SOA中的重要抽象手段


图1-6 SOA的概念架构模式

(3)明确定义的接口。服务的接口由WSDL定义,用于指明服务的公共接口与其内部专用实现之间的界线。WS-Policy用于描述服务规约,XML模式(Schema)用于定义所交换的消息格式(即服务的公共数据)。使用者依赖服务规约来调用服务,所以服务定义必须长时间稳定,一旦公布,不随意更改;服务的定义应尽可能明确,减少使用者的不适当使用;不要让使用者看到服务内部的私有数据。

(4)自包含和模块化。服务封装了那些在业务上稳定、重复出现的活动和组件,实现服务的功能实体是完全独立自主的,独立进行部署、版本控制、自我管理和恢复。

(5)粗粒度。服务数量不应该太大,依靠消息交互而不是远程过程调用(RPC),通常消息量比较大,但是服务之间的交互频度较低。

(6)服务之间的松耦合性。服务使用者看到的是服务的接口,其位置、实现技术、当前状态等对使用者是不可见的,服务私有数据对服务使用者是不可见的。

(7)重用能力。服务应该是可以重用的。

(8)互操作性、兼容和策略声明。为了确保服务规约的全面和明确,策略成为一个越来越重要的方面。这可以是技术相关的内容,比如一个服务对安全性方面的要求;也可以是跟业务有关的语义方面的内容,比如需要满足的费用或者服务级别方面的要求,这些策略对于服务在交互时是非常重要的。WS- Policy用于定义可配置的互操作语义,来描述特定服务的期望、控制其行为。在设计时,应该利用策略声明确保服务期望和语义兼容性方面的完整和明确。

1.4 软件工程的演变和面向服务体系结构

软件工程方法和过程伴随着软件实践不断发展。软件危机发生之后,从瀑布模型、原型方法等讲究过程、文档密集、控制较多的方法,逐渐发展到轻量级、敏捷和迭代的方法。这些方法更加人性化,避免因为过重的过程而扼杀人的主动性和创造性。这些方法更强调快速地交付对客户有价值的软件、直接的沟通、持续集成和持续质量保证。

SOA和当前软件工程过程的一个共同交叉点就是业务价值驱动(Business Centric),强调速度。SOA从软件的灵活性和重用能力入手,而敏捷过程则从软件交付效率出发。

SOA的架构特性,使得敏捷过程非常适合SOA项目的实施。在SOA架构中,服务的独立性,使得每个服务可以被单独地开发、测试和集成。一个企业中的 IT系统,如果是基于SOA的计算环境,那么这个环境就是一个服务的生态系统,每开发一个服务,马上就可以独立部署,成为这个生态系统中的一部分。这样既很好地支持了持续集成、持续质量保证,又很好地使得这个服务马上产生业务价值,而不是苦等其他服务的到位。服务的特性,使得敏捷过程和SOA架构可以有一个很好的结合,让二者相得益彰。以我们与不同客户合作的实践,我们已经充分体会到这二者在实现过程中的风险控制、业务需求改变的适应能力方面相互配合的好处。比如我们在中远集运,从瀑布过程转向了迭代的开发过程,采用了敏捷方法的原则。

在韩国的项目里,我们的团队来自IBM中国,IBM韩国及韩国客户自己的工程师,分处汉城和北京两个地方,这些工程师怎样协作才能很快地交付高质量的系统而不相互牵扯?对于北京的工程师,北京的团队无法复制客户在汉城的已有系统,如何测试自己开发的服务?通过服务建模,系统被分解为若干相互独立的服务,我们将那些要重用已有系统来实现的服务交给汉城的队员,其他的交给北京的队员,并且要求每个服务开发人员提供一个简单的"伪"实现(Mock Service)。一开始,这些简单实现被部署在北京和汉城的测试环境中,然后各个服务开发小组开始各自独立地开发自己所负责的服务,而流程开发人员也在同一时间开始开发他的流程,不过所基于的服务是在那些简单实现之上,但是这些简单实现足以支持有意义的单元和集成测试。随后,一旦某个服务被实现,它就被部署到实际的环境中,通过调整ESB的服务中介配置,对此服务的请求被路由到真实实现。一旦真实实现有问题,还可以换回简单实现,以避免影响其他服务、流程的单元和集成测试。这种灵活性带来的随时开发、随时部署、随时集成和测试对于采用敏捷过程是非常有利的。

1.5 SOA技术概览

本节将讨论目前SOA体系架构中用到的主要技术和标准。

1.5.1 SOA的主要组件

在前面关于计算环境的讨论里,我们已经提到SOA计算环境的主要组件包括:服务运行时环境、服务总线、服务注册库、服务网关和流程引擎。通常,还会包括服务管理、业务活动监控(Business Activity Monitoring)和业务绩效管理(Business Performance Management,BPM)。另外,在服务建模、开发和编排服务等方面,我们需要相应的工具来支持。在分析、设计方面,我们需要基于服务的分析、设计方法,就是我们通常说的服务建模,包括服务的识别、定义和实现策略,其输出是一个服务模型(Service Model)。

1.5.2 SOA主要技术和标准

Web服务作为实现SOA中服务的最主要手段。我们首先来了解跟Web Service相关的标准,它们大多以"WS-"作为名字的前缀,所以统称WS-*。 Web服务最基本的协议包括UDDI,WSDL和SOAP,通过它们,我们可以提供直接而又简单的Web Service支持,如图1-7所示。

但是基本协议无法保证企业计算需要的安全性和可靠性,所以我们需要增加这方面的协议,比如WS-Security,WS-Reliability和 WS-ReliableMessaging;对于复杂的业务场景,我们需要WS-BPEL和WS-CDL这样的语言来将多个服务编排成为业务流程;管理服务的协议如WS-Manageability,WSDM等。跟Web服务相关的标准,还在快速发展当中。目前在SOA产品和实践中,除了基本协议外,比较重要的还包括BPEL,WS-Security,WS-Policy和SCA/SDO。如表1-1所示给出了一个基本的总结,后面的章节会介绍重要的技术和标准。


图1-7 基本Web服务协议


表1-1 当前Web服务协议栈

1.5.3 SOA技术在工业界的支持现状

目前,Web的标准和技术在演变当中,不同的技术环境的支持力度也不同,但是前面提到的基本核心协议,都有很好的支持。关于Web服务协议的接受和支持程度,如图1-8所示。


图1-8 当前Web服务的接受情况

1.6 本章小结

本章介绍了SOA基本概念,并澄清了容易混淆的一些问题,然后概要地讨论了SOA的若干重要方面,包括面向服务的计算环境、编程模型、架构风格、工程方法等。还非常简要地介绍了SOA在工业界的支持概览,更多的细节请参看各个部分所附的参考链接,它们会给读者提供非常充分的信息和文档,供读者了解SOA 相关技术和标准的发展细节。通过表1-2,读者也可以了解到工业界,包括厂家和标准化组织的参与情况。

关于作者

毛新生先生现任IBM中国开发中心Web 2.0首席架构师。此前他曾任IBM软件集团企业解决方案部大中华区和北亚地区首席架构师与IBM SOA中国设计中心技术主管,在企业级软件方面拥有广泛、扎实、深厚的理论功底和丰富的设计与项目实施经验。2006年,毛新生先生被授予“IBM资深技术主管”称号(STSM ,Senior Technical Staff Member),成为中国内地第一位获此殊荣的IBM技术人员,在全球也仅有1000多位IBM员工享有这样的荣誉。毛新生先生于2000年加入IBM,曾先后在北京大学和IBM中国研究院从事研发工作,以研究人员,开发经理和架构师的身份从事过信息检索,语音技术及其中间件,门户,普及计算,Linux,网格计算,Web Service和SOA等领域的很多工作。毛新生先生毕业于北京大学,拥有计算机专业硕士学位。如果您想找到更多关于毛新生先生的文章,您可以搜索毛新生的BLOG。