首页  ·  知识 ·  
面向服务体系架构(SOA)和业务组件(BC)的思考
肖建国      编辑:dezai   图片来源:网络
组件化、模块化是软件开发中一个很重要的概念,基于面向服务体系架构(Service Oriented Architecture,SOA)下,如何实现组件化,有各种

组件化、模块化是软件开发中一个很重要的概念,基于面向服务体系架构(Service Oriented Architecture,SOA)下,如何实现组件化,有各种实现方式,下面通过对各种组件概念的对比,从技术角度提出业务组件(Business Component,BC)定义,并结合对总线模式的分析,给出企业服务总线和类总线的实现方案。

企业架构(EA)

关于企业架构(Enterprise Architecture,EA)和面向服务体系架构(SOA)在《面向服务体系架构(SOA)和数据仓库(DW)的思考》(以下简称《SOA和DW》)一文中做了介绍,企业架构包含企业战略、业务架构、IT战略、IT架构四个部分,IT架构如下图IT架构模型所示,包含数据架构、应用架构、技术架构和治理架构等四个方面,其中技术架构包含集成平台、公共服务平台、基础平台(软件和硬件、网络)和安全平台等,《SOA和DW》着重对如何构建数据架构特别是数据存储做了详细的阐述,本文基于《SOA和DW》进一步对如何搭建SOA体系进行研究,将着重描述如何基于可扩展的、灵活的企业级的集成平台、公共服务平台进行组件化开发。

 

业务组件(BC)

当前,提到组件(Component)的有很多概念,比如分布式组件DCOM、J2EE、CORBA等,IBM的业务组件模型(Component Business Model,CBM),SOA中的服务组件架构(Service Component Architecture,SCA)等。本文提到的业务组件(Business Component,BC)定义为一个可以独立运行的系统或者模块(我标准业务组件的概念有明细区别),业务组件的目的是以方便业务组件独立升级和减少不必要的组件之间的交互为基本原则,通过一定程度的分离,实现《SOA和DW》中提到的重用(SoftWARe Reuse)。

如果业务组件是共用的,是其它业务组件需要重用的,称之为公共业务组件(简称公共组件),所有的公共组件组成企业架构中技术架构的公共服务平台,比如主数据管理、系统管理、统一认证管理、通用报表等,这些都是公共组件。

组件业务模型(CBM)

组件业务建模(Component Business Modeling,CBM)是IBM SOA构建的一个方法论,通过将组织活动重新分组到数量可管理的离散、模块化和可重用的业务组件中,从而确定改进和创新机会,把业务从领导,控制和执行三个方面进行模块化分析,从而有效的实现业务的有组织的提供服务的能力。CBM 的价值是提供一个可以推广的框架,用来创造顺应组织战略的可以运营的指导方向,同时 CBM 也用来按照业务和资源的优先级别和相互关联的程度来构建和顺应战略的发展方向,其中包括建立一个沟通的机制来理解整个业务发展的方向。通过CBM建立了 SOA 的规划的方向,为实施 SOA 奠定基础。

本文所提到的业务组件在粒度上基本对应着组件业务模型(CBM)的粒度,但是本文中的业务组件(BC)更多从技术实现角度考虑,或大于,或小于业务组件模型(CBM)提到的业务组件概念。

服务组件框架(SCA)

服务组件框架(Service Component Architecture,SCA)由BEA、IBM、Oracle等中间件厂商联合制定的一套符合SOA思想的规范。服务组件框架(SCA)提供了一套可构建基于面向服务的应用系统的编程模型,它的核心概念是服务及其相关实现。SCA组件组成程序集,程序集是服务级的应用程序,它是服务的集合,这些服务被连接在一起,并进行了正确的配置。在SCA标准下,SCA由域(Domain)、组合构件(Composite)、构件(Component)三个级别组成,构件对应着细粒度的Web服务,域对应着粗粒度的Web服务。SCA程序集运行在两个级别:第一种情况,程序集是“大规模编程” (Programming in the Large或Megaprogramming)的一组松散连接的服务组件;另一种情况,程序集是“小规模编程”(Programming in the Small)内的一组松散连接的组件。二者的区别在于, “大规模编程”对应着应用,“小规模编程”对应着模块,一般来说,服务组件对应着“小规模编程”,即模块的概念。

本文所提到的业务组件(BC),是比SCA组件更大范围的概念,这几个概念的颗粒度从大到小的排列顺序如下:系统(每个企业只有一个系统)、应用、业务组件(BC)、模块、SCA组件(粗粒度服务)。

总线模式(Bus)和SOA、OSGi

总线(Bus):一般指通过分时复用的方式,将信息以一个或多个源部件传送到一个或多个目的部件的一组传输线。基于总线模式的有很多应用,在微机的技术中,有三种总线,地址总线Address Bus,数据总线Data Bus,控制总线Control Bus。在通信架构下,交换机也是一种总线,在SOA中,总线一般指企业服务总线(Enterprise Service Bus,ESB),企业服务总线可以连接所有协议的各种接口,但是最理想的是基于XML的Web服务标准。

OSGi——Open Service Gateway Initiative,1999年OSGi 联盟成立,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准,是开放业务网关的发起者。OSGi是一个Java框架,该框架能装载以 Bundle为单位的资源。Bundle能提供服务或响应处理请求,而他们之间的依赖都是被管理起来的,正如一个Bundle能从容器中获得它所需要的管理。每个Bundle都可以有它自己的内部类路径,所以它可以作为独立的服务单元。所有的这些符合OSGi规范的Bundle理论上都可以安装在任何符合 OSGi规范的容器中。OSGi具有可动态改变系统行为,热插拔的插件体系结构,高可复用性,高效性等等。在J2EE环境下,基于总线(Bus)模式的思考,可以进一步推广到Java Class,基于OSGi的微内核,建立一个类总线(Java Class Bus,JCB)。

通过以上概念的分析,我们可以看到,本文提到的业务组件(BC),是指具体的一个软件实现,业务组件(BC)跟IBM的业务组件模型(CBM)中提到的业务组件有一定的对应关系,但是一般来说,业务组件(BC)可能包含CBM中的多个业务组件或者一个CBM的业务组件封装成多个业务组件(BC)。另外CBM更多的是从业务角度来考虑,是业务上的概念,业务组件(BC)则是从技术实现角度考虑。服务组件框架(SCA)定义的粒度和业务组件(BC)相比来说,SCA划分的还是很细,业务组件(BC)是更粗粒度的一个软件实现概念。

业务组件(BC)模型

根据业务组件的作用不同,可以将业务组件分成公共业务组件和普通业务组件,公共业务组件包含统一用户组件、统一认证组件、门户组件、流程组件、报表组件、BI组件、GIS组件等,这些组件的共同特点是多个业务组件或者系统会用到这个业务组件。(此处对业务组件的理解完全是技术层面的理解,和常规业务组件理解有明显差别,已经偏技术组件)

组件的粒度和对外接口设计决定了组件的可复用和松耦合(Loose Coupling)特性。粒度过大,灵活性小,难以实现复用,粒度过小,管理成本提升,使得复用性也很难改善;接口和实现的分离,保证各项业务组件在提供标准化的服务接口的前提下可以替换各种可选的实现,而不会影响系统其它部分的实现,接口设计不当,对于组件的耦合会有很大的影响。

业务组件的粒度

业务组件的粒度根据需要可以不同,既可能是独立运行的子系统,也可能是程序模块。业务组件是提高应用系统灵活性和复用的重要基础。业务组件粒度太小,造成组件数量多,组件之间交互多,管理困难,性能低下;业务组件粒度粗,功能复杂,功能之间关系紧密,升级困难(可以独立升级往往会作为确定一个业务组件范围的重要因素),很难实现重用。因此找到一个合适的业务组件粒度是很重要的事情。

根据前文所定义的业务组件定义,我们把整个企业的所有软件称之为系统,即一个企业只有一个系统;系统下面划分成若干应用,每个应用完成一个相对独立的业务功能,比如财务管理、人力资源管理等,一般来说是一个厂商独立完成(后文还会提到,如果是基于一个业务基础平台,多个厂商可以在一个应用中);应用下面划分成若干业务组件,业务组件是相对独立的功能,其可以进一步划分成若干模块,从而形成了系统-应用-业务组件-模块这样四个层次的模型。根据SCA 的定义,模块下面可以进一步划分成程序集为更小的粒度。从软件复用角度来看,业务组件是独立部署的最小颗粒,模块是复用的最小颗粒。

除了业务组件需要粒度控制外,Web服务的粒度控制也是一项十分重要的设计任务。通常来说,对于将暴露在整个系统外部的服务推荐使用粗粒度的接口, 而相对较细粒度的服务接口通常用于企业和机构系统架构的内部。从技术上讲,粗粒度的服务接口可能是一个特定服务的完整执行,而细粒度的服务接口可能是实现这个粗粒度服务接口的具体的内部操作。虽然细粒度的接口能为服务请求者提供了更加细化和更多的灵活性,但同时也意味着引入较难控制的交互模式易变性,也就是说服务的交互模式可能随着不同的服务请求者而不同。如果暴露这些易于变化的服务接口给系统的外部用户,就可能造成外部服务请求者难于支持不断变化的服务提供者所暴露的细粒度服务接口。而粗粒度服务接口保证了服务请求者将以一致的方式使用系统中所暴露出的服务。

业务组件的松耦合设计

耦合性(Coupling)是程序结构中各个模块之间相互关联的度量,它取决于各个模块之间接口的复杂程度、调用模块的方式以及哪些信息通过接口。耦合性由松到紧可以分成七种:非直接耦合(Nondirect Coupling)、数据耦合(Date Coupling)、标记耦合(Stamp Coupling)、控制耦合(Control Coupling)、外部耦合(External Coupling)、公共耦合(Common Coupling)、内容耦合(CONTENT COUPLING)。非直接耦合是指两个模块之间没有直接关系,这种耦合的模块独立性最强。数据耦合,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,模块之间的独立性比较强。标记耦合是指一组模块通过参数表传递记录信息,就是标记耦合,这要求这些模块都必须清楚该记录的结构,并按结构要求对此记录进行操作,应尽量避免这种耦合,它使在数据结构上的操作复杂化了。在业务组件设计模型中业务组件之间尽量实现非直接耦合(总线模式,推荐使用)和数据耦合(共享库模式,控制使用),通过定义清晰的Web服务进行交互,业务组件内部的模块之间可以通过标准化的Web服务或者数据表来进行共享。

业务组件接口模型

业务组件作为一个可以独立的运行的模块,通过一系列的接口,可以独立完成本业务组件的功能。业务组件通过接口,可以组装到和基于标准的集成平台上,并和其他的组件或者系统共同完成企业的业务。基于标准的企业集成平台包含企业信息门户(门户标准)企业服务总线(Web服务标准)和数据服务总线(含数据模型),如下图所示:

 

当企业集成平台建立之后,基于标准,业务组件就可以简单的以“插拔”的方式组合到整体应用中。
业务组件接口通信方式松耦合实现方式

Web服务根据Web服务内部数据的流向可以分成两类,一是获取服务,即别的业务组件或系统调用Web服务,对外提供数据;二是写入服务,即其他业务组件或系统调用本业务组件或系统Web服务写入数据。前者比较简单,只要提供服务即可,但是对于后者,在实现过程中将会有两种实现方式:一是主动到 ESB调用Web服务,读取数据,然后直接写入系统,二是提供Web服务到ESB,等待业务组件或系统调用写入。采用第一种方式,不需要对外提供Web服务,直接调用ESB的Web服务即可,但是服务的调用以及写入是通过代码固化到系统中的;后者对外提供服务,不管调用系统是谁,只要调用既可写入数据,不会受到外部系统的变化的影响。如果是采用直接到ESB调用服务,然后用代码写入的方式,一旦业务流程发生变化,比如改为别的系统或者模块直接写入,这种方式就无法适应,需要重新增加一个写入的Web服务,因此比较好的解决方式是提供对外的一个写入Web服务,写入Web服务是独立的,满足别的系统主动写入的要求,如果是自己主动写入,则采用先到ESB上请求获取数据(本服务仅仅是通知ESB,要获取数据)然后由ESB实现对本次统的写入Web服务,这样,不管外部的系统如何变幻,接口是不变的,如下图所示:

注:任何一个数据交互都可以实现为两种方式,一种是查询类服务,一种是数据写入类服务。举例如下如果数据流向为A->B,则实现方式有两种,一种是A实现查询服务,一种是B实现导入服务。

 

除非是写入服务提供者业务需求非常明确,只有本系统调用才会写入,一般建议按照以上独立的写入服务方式来实现。采用独立的写入服务能更好的适应未来被动写入、或者写入操作需要经过评审或者确认之后的操作。

 

比如客户信息数据,如果是在CRM系统中创建,财务系统需要客户数据,有三种调用方式,一是财务系统直接到ESB调用CRM的客户信息查询Web服务,然后写入系统。二是事件机制,CRM系统中的数据变化时,对外提供的客户信息变更服务,服务调用中传递的消息就是变更的信息,调用财务系统的写入服务。如果还有其它的系统需要客户信息,可以在ESB中定义出发布/订阅关系。三是财务系统先请求ESB调用CRM的查询服务,然后由ESB调用财务系统的客户信息写入服务,写入数据。(注:这种场景比较少)如果未来业务流程发生变化,改由CRM直接将客户信息写入财务系统,则直接调用财务的写入服务即可,需要做的仅仅是配置一下 ESB即可,现有的程序不需要改变。第一种方式下,如果改成CRM写入,财务系统需要重新编码,第二种方式如果别的系统来主动查询客户数据,需要另外增加一个客户信息的查询服务,第三种情况,无论是如何改变化,需要的仅仅是增加一个请求调用即可,对所有的系统影响最小,因此是受外界需求发生变化后影响最小的方式,更好的解决了松耦合的问题。

业务组件接口事务处理-无状态的会话设计

 

为了保证业务组件的独立和松耦合,SOA中的具体服务应该都是独立的、自包含的请求,在实现这些服务的时候不需要前一个请求的状态,也就是说服务不应该依赖于其他服务的上下文和状态,即 SOA中的服务应该是无状态的服务。不同的业务组件之间是采用Web服务的方式进行交互,对于事务的控制很困难,应尽量将事务控制在一个业务组件中(关于事务的控制,详见下文关于组件内部松耦合设计的方案),如果是在不同的业务组件,需要事务控制,则考虑采用流程编排的方式实现,基于BPEL实现事务控制。

本文作者:肖建国 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读