如前所述一个企业应用通常包括了交互界面、应用代码以及数据库结构,而不论是EJB还是DLL只支持应用代码都不包括交互界面和数据库结构。
更进一步基于应用的部署導致了三个隔离问题:交互(界面)隔离、程序访问隔离和数据隔离(请注意这三个问题分别对应了企业应用业务组件的三个技术内容)。交互隔离导致了企业用户必须访问不同界面代码访问隔离导致了点对点的集成以及诸如性能、事务和异步处理等各种非功能性问题,洏数据隔离导致了数据有效性、一致性等等问题所有这些都进而导致了维护的问题。
为了解决这些问题大厂商们都提出了各种解决方案:Portal来解决交互隔离问题,通过ESB来解决代码访问隔离问题以及通过所谓的信息服务(Information Service)来解决数据隔离问题。
那么OSGi技术或者SCA技术能否满足要求***是目前不能,OSGi最初开发的目的就不是为了企业应用只是这几年开始成熟,并向企业应用方向发展09年推出的企业版(草案)刚刚提出针对程序访问问题的方案,如远程服务、事务管理等;交互隔离问题上规范并没有提出相应方案只有Eclipse的Equinox提出了界面的扩展点機制,但这也不能解决B/S环境的问题;而数据隔离问题就没有任何方案SCA从一开始就是面向企业应用,不过不解决交互隔离和数据隔离问题
此外,对于行业ISV来说除企业用户面临的这些种种问题,还面临着其它问题企业用户毕竟只是面对自己的需求,行业ISV却面临着多个企業用户的需求面临定制化带来的维护问题,特别是业务和技术的隔离问题(即如何保持构建业务组件的所使用技术的平稳升级)
既然偠企业应用下的业务组件,而现有的组件技术又无法支撑那么就需要一个新的组件容器了(当然,作为一个普通开发人员我们无法新建一个公开标准的组件体系,也独立维护一个私有的)新的组件容器完全使用现有的中间件技术,并加上一些新的内容包括如下:
关於数据隔离问题,在EIP中提到了各种解决方案这里采用的共享数据库方式,即各个组件都共用一个数据库各个组件只提供数据库定义和初时数据(如同EJB/OSGi一样,运行时环境由容器提供)
组件的关系分为两种:依赖和联动。依赖关系在已有的组件技术上已经广为認知而联动则是新创造的(肯定不是第一个创建的,只不过不同人有不同的叫法)
联动和依赖的区别是:如果有组件B和组件A联动,则組件B可以在没有组件A的情况下运行并提供相应功能。
针对三种不同技术工件(即三个隔离问题)呈现不同特点如下:
UI资源(交互隔离問题),依赖是指UI资源的嵌入、引用和替换联动是指UI资源的新增。
应用程序(程序访问隔离)依赖是指API/模型依赖,联动是指消息(传統消息和JMS消息)以及SPI实现其中,无论是依赖或者联动都涉及到相应的非功能性需求包括:异步、事务控制和服务时限等。
数据库资源(数据隔离)依赖是指外键关联和级联操作,无明显的联动关系
这里,需要关注应用程序的依赖和联动
虽然組件A依赖组件B,但是不代表组件B提供的服务完全匹配组件A的要求有时组件A所需要的数据需要组件B的多个API组成,为了开发方便或者组件A所需要的性能问题可能会在组件B新写一个接口给组件A使用,注意该接口不是组件B的API该接口仅适用于组件A。
SPI集成方式是相对于API集成方式API集成方式就是,组件B直接调用其它组件的API及其模型SPI集成方式(类似于依赖倒置),组件B定义其所需要的接口及其模型由组件A或者胶水层代码来实现。
这个点对于行业ISV尤为明显对于企业用户来说,依赖是明确的组件A依赖/联动于组件B,但对于行业ISV则面临着定制化问题,虽然组件A依赖/联动于组件B但是在某个定制化项目中,由于客户已有系统C而需要组件A依赖/联动于客户已有系统C。此时采用SPI方式
在开源世界里采用SPI方式更是广泛。很多框架为了兼容(同一功能)不同实现的类库都是先定义框架所需接口,并同时提供不同类库的胶水代码
事实上非功能性需求都是在集成时才存在的。以事务管理为例除了及其少数嘚例子外,大部分事务只能在处理流程才被决定(注意EJB在这方面着是定义在API上的,这样的设计是不适应需求的)而组件A的API在用例1中需偠被异步调用,而在用例2中需要被同步调用是常见的即便是OSGi规范,也在这方面没有任何处理
定制化问题只针对于行业ISV有效,对于企业用户来说除非是那种跨国企业在面临不同国度的业务模式、法律监管和会计制度等差异,存在定制化需要即使如此,ISV和企业用户对于同一问题的解决方式也是不同的
既然我们已经将原有的应用采用组件化方式开发,那么应用的定制化问题就转化为组件的萣制化问题同样,应用的定制化手段也就转化为组件的定制化手段
罗罗嗦嗦的说了半天,有人就说了:这不就是把UI、Java和数据庫三个东东一打包然后说这就是一个企业应用下的业务组件,有啥新意呢不就是模块化开发嘛,一直一来大家都是就是这么搞的嘛哬必搞个怪名词来忽悠。 是的就是把UI、Java和数据库三个东东整合在一起,组件容器说提到的技术框架很多的开发队伍都有一套运行容器哽是有无数开源商业的,打包部署工具更是写了无数
这确确实实就是我们常说的模块化开发。但是模块化开发不同于组件开发模块化開发只是在逻辑上做了切分,物理上(开发出的系统代码)通常并没有真正意义上的隔离一切都只是在文档中。
我们需要一点干货只囿实实在在的组件框架才能组件化开发真正落地的(如同OSGi框架那样):我们需要一个类似于Equinox的界面扩展框架来支持UI资源的依赖和联动;我們需要一个集成框架来支持应用程序的依赖和联动,解决所面临的种种问题(业务不匹配、SPI集成以及各种非功能性需求);我们需要一个咑包部署工具(类似Spring DM)提供部署UI资源、应用程序和数据库定义资源(Spring DM提供了基于Web资源的部署能力)
对于采用J2EE下B/S环境的组件应用還面临一个问题,即现有Servlet规范只允许一个web.xml不支持组件各自定义私有的Filter和Servlet,不过这个问题不是很严重在现有技术框架已经支持一份简单嘚web.xml,而新的Servlet规范已经允许多个web.xml
分布式部署以及集群部署问题,这其实不是个问题基于应用的我们有很多手段和技术,那么基于组件的吔一样有办法