摘要:
在基于面向服务体系架构(SOA)中,“组件化”是一个很重要的概念,如何进行“组件化”开发是搭建企业级业务基础平台时需要考虑的一个重要课题,本文通过建立业务组件(BC)接口模型及内部结构模型,提供了一个在新开发系统环境下基于Web服务和OSGi标准的组件化开发模型。
什么是业务组件(BC)
企业架构(EA)
业务组件(BC)
组件业务模型(CBM)
服务组件框架(SCA)
本文所提到的业务组件(BC),是比SCA组件更大范围的概念,这几个概念的颗粒度从大到小的排列顺序如下:系统(每个企业只有一个系统)、应用、业务组件(BC)、模块、SCA组件(粗粒度服务)。
总线模式(Bus)和SOA、OSGi
通过以上概念的分析,我们可以看到,本文提到的业务组件(BC),是指具体的一个软件实现,业务组件(BC)跟IBM的业务组件模型(CBM)中提到的业务组件有一定的对应关系,但是一般来说,业务组件(BC)可能包含CBM中的多个业务组件或者一个CBM的业务组件封装成多个业务组件(BC)。另外CBM更多的是从业务角度来考虑,是业务上的概念,业务组件(BC)则是从技术实现角度考虑。服务组件框架(SCA)定义的粒度和业务组件(BC)相比来说,SCA划分的还是很细,业务组件(BC)是更粗粒度的一个软件实现概念。
业务组件(BC)模型
组件的粒度和对外接口设计决定了组件的可复用和松耦合(Loose Coupling)特性。粒度过大,灵活性小,难以实现复用,粒度过小,管理成本提升,使得复用性也很难改善;接口和实现的分离,保证各项业务组件在提供标准化的服务接口的前提下可以替换各种可选的实现,而不会影响系统其它部分的实现,接口设计不当,对于组件的耦合会有很大的影响。
业务组件的粒度
根据前文所定义的业务组件定义,我们把整个企业的所有软件称之为系统,即一个企业只有一个系统;系统下面划分成若干应用,每个应用完成一个相对独立的业务功能,比如财务管理、人力资源管理等,一般来说是一个厂商独立完成(后文还会提到,如果是基于一个业务基础平台,多个厂商可以在一个应用中);应用下面划分成若干业务组件,业务组件是相对独立的功能,其可以进一步划分成若干模块,从而形成了系统-应用-业务组件-模块这样四个层次的模型。根据SCA的定义,模块下面可以进一步划分成程序集为更小的粒度。从软件复用角度来看,业务组件是独立部署的最小颗粒,模块是复用的最小颗粒。
除了业务组件需要粒度控制外,Web服务的粒度控制也是一项十分重要的设计任务。通常来说,对于将暴露在整个系统外部的服务推荐使用粗粒度的接口,而相对较细粒度的服务接口通常用于企业和机构系统架构的内部。从技术上讲,粗粒度的服务接口可能是一个特定服务的完整执行,而细粒度的服务接口可能是实现这个粗粒度服务接口的具体的内部操作。虽然细粒度的接口能为服务请求者提供了更加细化和更多的灵活性,但同时也意味着引入较难控制的交互模式易变性,也就是说服务的交互模式可能随着不同的服务请求者而不同。如果暴露这些易于变化的服务接口给系统的外部用户,就可能造成外部服务请求者难于支持不断变化的服务提供者所暴露的细粒度服务接口。而粗粒度服务接口保证了服务请求者将以一致的方式使用系统中所暴露出的服务。
业务组件的松耦合设计
业务组件接口模型
图 2. 企业集成平台模型
当企业集成平台建立之后,基于标准,业务组件就可以简单的以“插拔”的方式组合到整体应用中。
业务组件接口通信方式松耦合实现方式
图 3. 服务调用顺序
除非是写入服务提供者业务需求非常明确,只有本系统调用才会写入,一般建议按照以上独立的写入服务方式来实现。采用独立的写入服务能更好的适应未来被动写入、或者写入操作需要经过评审或者确认之后的操作。
比如客户信息数据,如果是在CRM系统中创建,财务系统需要客户数据,有三种调用方式,一是财务系统直接到ESB调用CRM的客户信息查询Web服务,然后写入系统。二是事件机制,CRM系统中的数据变化时,对外提供的客户信息变更服务,服务调用中传递的消息就是变更的信息,调用财务系统的写入服务。如果还有其它的系统需要客户信息,可以在ESB中定义出发布/订阅关系。三是财务系统先请求ESB调用CRM的查询服务,然后由ESB调用财务系统的客户信息写入服务,写入数据。如果未来业务流程发生变化,改由CRM直接将客户信息写入财务系统,则直接调用财务的写入服务即可,需要做的仅仅是配置一下ESB即可,现有的程序不需要改变。第一种方式下,如果改成CRM写入,财务系统需要重新编码,第二种方式如果别的系统来主动查询客户数据,需要另外增加一个客户信息的查询服务,第三种情况,无论是如何改变化,需要的仅仅是增加一个请求调用即可,对所有的系统影响最小,因此是受外界需求发生变化后影响最小的方式,更好的解决了松耦合的问题。
业务组件接口事务处理-无状态的会话设计
J2EE架构下业务组件(BC)实现
基于OSGi标准,业务组件内部的模块通过一个具有动态加载类功能的微内核连接,统一管理各个模块,为了便于管理,将不同模块之间的类接口采用服务注册的方式进行管理,具有类动态加载功能的微内核和类接口管理组成类总线(JCB)的基本功能,为了更好的实现重用,有些模块是共用的,比如数据访问模块、日志管理模块等。
在一个应用中,不同业务组件公用的功能,作为应用内部的公共组件,一个应用中部署一个公共组件即可,各个业务组件共用。在一个业务组件中,不同模块公用的功能,作为公共模块,相当于工具类,公共模块需要在每个业务组件中部署。公共服务平台作为企业级的公共服务对外提供企业级的Web服务,比如主数据管理等。业务组件构成如下图所示:
图 4. 业务组件模型(公共类-公共组件-公共服务平台)
注:
业务组件中的公共组件和公共服务平台的差异是公共组件是应用内部的,提供应用级别的服务;公共服务平台则是面向企业整个系统的,是提供系统级的服务,两者有时候可以互相替换,主要是看其处于那个级别。
基于IBM产品体系的实现
业务组件(BC)在WAS中的部署
EAR文件(file Enterprise Achieve)除了包含JAR、WAR以外,还包括EJB组件、部署文件application-client.xml、web.xml、application.xml等全部企业应用程序。
根据前文所述业务组件(BC)的定义,业务组件适合于在WAR文件层面进行划分,即一个WAR作为一个业务组件,一个或者几个WAR组成一个应用(EAR),多个应用构成企业的系统;业务组件内部进一步划分为多个模块(Bundle),每个模块相对独立,可以独立维护,独立升级和安装,以插件的方式通过类总线进行关联。为了实现重用,在EAR层面,将企业级的业务组件单独部署,比如主数据、统一认证、工作流等,建立公共服务平台;在WAR层面,各厂商的公共的业务组件单独封装在公共组件(WAR)中,如系统管理、系统参数管理等。在模块级别采用公共模块的方式,在各个WAR中以工具模块(Bundle)方式提供,如数据库访问、日志(Log4j)等。公共组件(WAR)、内部服务总线(ESB)和类总线(JCB)、工具模块(Bundle)组成应用系统的业务基础平台(Business Platform)(如浪潮的Loushang平台)。
在系统部署的时候,一台服务器上安装一个Websphere实例,一个实例根据主机的性能可以安装多个节点(Node),每个节点(Node)可以安装多个虚拟机(JVM),每个虚拟机可以安装多个EAR应用,每个EAR有多个WAR,不同WAR之间文件不会冲突,WAR内部采用OSGI标准分成多个模块(Bundle)。不同公司的系统是不同的EAR,同一个公司可以有多个EAR。如下图所示:
图 5. WAS部署模型(系统-应用-业务组件-模块)
EAR之间数据交换采用通过企业级服务总线(ESB)的Web服务,大数据量数据共享在数据总线上通过企业级的共享数据库进行共享,通过数据总线共享的数据不是实时的,是有一定的延误或者准实时的。共享库是企业的资产,不隶属于任何一个厂商。
WAR之间数据交换采用通过企业或者内部的服务总线(ESB)的Web服务,不同的WAR共用一个数据库,但是数据表根据WAR的职责进行划分,每个WAR可以只读所有的共享的数据表,但是只能写自己控制的表,对其它WAR控制的表、表结构很复杂或者易变的表的读作操,都应通过Web服务进行,以实现WAR之间的松耦合。一个EAR中的共享数据库(对企业来说是私有数据层)在各个WAR之间结合更加紧密,一般采用直接访问的方式,不在私有数据层存放共享库数据,私有数据仅仅是一些控制类或者跟业务无关,不需要共享的数据。企业级共享库一般从性能、不同厂家便于控制等角度考虑,数据同步是准实时的,数据在各个EAR的私有数据层一般会有一个拷贝,让各个EAR之间相对更加独立。以上仅仅是一般原则,如果是一个厂商,两个EAR之间也可以像一个EAR共享一个数据库。EAR和共享库之间的关系如下图EAR和共享库的关系所示:
图 6. EAR和共享库的关系
\
Bundule之间数据交换可以类似WAR的Web服务调用,也可以直接通过类总线,调用Bundule对外发布的接口,特别是需要具有事务处理能力和更高的性能要求的情况。一个WAR内原则上不再划分数据表的控制,由WAR自己内部进行管理。
一般来说,WAR是相对比较稳定的,不需要完全进行替换升级,日常的变更是通过Bundle来实现的,由于Bundle在应用方面是基于插件的方式进行开发的,数据方面由于业务组件本身是基于标准信息服务或者作为企业资源的开放的数据表、视图(Web服务和数据模型,作为企业的两个资产),因此可以实现热插拔,保证了系统可以连续运行,而不至于因为系统升级而影响到业务的运行或者最小程度的营销业务的运行。
在实际部署的情况下,有可能会出现整个企业只有一个EAR(功能简单,最极端情况),或者一个厂商把应用分别部署在不同的EAR,需要根据企业规模,主机部署等,从性能、易于管理等角度考虑。由于WAR之间是松耦合的,基于企业服务总线(ESB)和信息服务总线(ISB),可以实现灵活的组装,因此一个或者多个WAR可以进行灵活组装部署。
以上基于J2EE的应用服务器WAS(IBM WebSphere Application Server,WAS),对J2EE架构模式下的文件体系进行分析,针对前文提到的业务组件模型实现提供一个实现建议。
业务组件(BC)实现举例
对于营销管理应用(EAR)来说,其内部可以进一步划分成客户关系、供应商管理、购销存管理等多个个业务组件,作为三个独立的WAR,三个业务组件之间如果需交互通过营销管理应用EAR自己的ESB(从企业角度来说,需要建立联邦ESB)进行交互,或者通过企业的集成平台中的ESB进行交互。三者共用一个数据库,逻辑上把表划分成三个部分,分别由三个业务组件进行管理,每个业务组件有自己的控制表,对于其它业务组件控制的表只读,如果需要访问,如前文所述,通过其它业务组件提供的服务进行访问。
客户关系管理还可以进一步划分成市场管理、销售管理、服务管理等多个模块,为了便于管理,可以在此基础上再划分的更细一层,比如市场管理可以进一步划分成客户分类管理、客户群管理、客户拜访管理等模块(Bundle),模块(Bundle)之间可以通过类直接调用,不同的模块之间的调用通过类总线实现。从管理和系统升级调度考虑,模块不宜太少,也不易太多。
以上就一般企业常用到的功能按照前文所描述的模型基于J2EE架构上具体实现做了说明,可以作为组件化开发的一个参考。
总结
出处:http://www.uml.org.cn/zjjs/20111201.asp