绪言
随着传统的客户机/服务器模式的发展,其存在的弊端也促进显现,现一代的企业级应用体系结构-分布式三层结构的出现,提供了开发应用程序的更大的灵活性和可扩展性。
其优点如下:
。将复杂的业务逻辑封装起来
使传统的面向对象提高到一个新的层次,在一个组件中实现一个服务使得业务需求改变时的维护得到了简化。
。独立于程序设计语言
基于com组件的技术是一组二进制标准,与具体语言无关
。减少项目风险
基于服务的概念开发的组件,将公共业务逻辑作为企业对象从用户界面和数据层中分离出来,提高了组件的可重用性。
基本模式分为:表现层-业务层-数据层
表现层就是人机交互界面,根传统的应用程序没有什么区别(除了业务逻辑的减少)。
业务层也叫事务逻辑层或中间层。这一层主要用于大批量事务处理、事务支持、大型配置、信息传送和网络通信。在这一层,把复杂的业务关系细分为多项功能单一的服务,每项服务都执行一项特殊任务,这些服务可以用相对独立的服务组件来实现其功能。通过分布这些组件,可以平衡数据处理负载,协调逻辑关系,调整业务规模和业务规则。这一层可部署在网络的任何地方,通常称之为应用服务器。
数据层通俗一点,也就是我们传统的数据服务器。如oracle等。
在这种体系结构下,传统的表现层和数据层的业务逻辑,都将集中到业务层管理。这样增加了客户端应用程序的通用性、独立性,也避免了数据层臃肿的存储过程和触发器。另外,也减少了软件配置和版本更新的困难。只需要配置和更新业务层就够了。
运行机制
1. 用户端首先启动客户程序,客户程序将试图连接应用服务器,如果应用服务器还没有运行,客户端程序将激活应用服务器,并从中获得Iprovider接口。
2. 客户程序相应用服务器请求数据。如果TclentDataSet的FetchOnDemand属性设为True,客户程序将根据需要自动检索附加数据包,如BLOB字段。否则要显示调用GetNextPacket;
3. 应用服务器收到客户程序的请求后,就从远程数据库服务器检索数据,并打包反给客户程序。
4. 客户程序收到数据包后,把包打开,然后显示活进行处理。
5. 用户对数据进行编辑修改,然后向应用服务器申请更新数据。
6. 应用服务器收到客户程序的申请后, 就像远程数据服务器申请更新数据。出错则返回信息。
技术实现
delphi6中被重新扩充和包装的MIDAS技术-DataSnap提供了一个全面的解决方案。
可参见delphi6安装目录下的Demos\Midas中的示例
数据库服务器,和传统模式一样。安装一个数据库软件,如oracle
1. 创建业务层(应用服务器)
。新建一个应用,再从Multitier中增加一个Remote Data Module(远程数据模块),(delphi中提供了五中不同的连接方式,包括DCOM、TCP/IP、HTTP、OLEnterprise、CORBA。
五中方式各有利弊。除DCOM(win95需要安装DCOM95),都需要运行期软件支持,TCP/IP需要ScktSrver.exe或ScktSrvc.exe(NT),http需要IIS4.0或NetscapeServer3.6以上的Web服务器,并安装有Borland提供的Httpsrvr.dll程序,客户端必须有Wininet.dll,可由IE3.0以上的浏览器提供。CORBA服务器端和客户端需要安装ORB软件,可使用delphi随带的VisiBroker。客户端连接组件在通过Iprovider接口的引用之前出现异常,TCP/IP连接方式将无法检测到这种情况,也无法通知应用服务器,可能造成应用服务器资源被占用后得不到释放的后果。DCOM连接方式在首次激活应用服务器时要比TCP/IP慢。)在远程数据模块上放置Tquery,Ttable,TstoredProc,Tdatabase等(放置Tdatabase时需把HandleShared属性设为True,以免出现“Name not unique in context”错误);
。放置一个TdataSetProvider组件,并使得起Dataset属性设为你所放置的Tquery或Ttable等,连接你想连接的数据源。
。编写代码,实现商业规则。
你可以使用Edit菜单上的Add To Interface 来增加接口,也可以使用View菜单中的Type Library打开类型编辑器,增加接口、方法以及属性,实现你的商务逻辑。
3.创建客户端应用程序
。新建一个应用,增加一个Data Module(数据模块),在数据模块上放置你所需要的DataSnap组件,如TDCOMConnection
。将TDCOMConnection组件的有关属性设置指定到你所创建的应用服务器上,如果指定的服务器为注册,则需要先运行改服务器程序使之注册。然后设置Connected属性为True。
。在放置TclientDataSet组件到数据模块上,设置其RemoteServer属性指定为你所放置的TDCOMConnection,设置其ProviderName为应用服务器上的TdataSetProvider。这样客户程序就可以通过Iprovider接口与应用服务器通信。然后放置Tdatasource和你的数据感知控件,Tdatasource的DataSet指定为你放置的TclientDataSet,然后你就可以显示和编辑数据了。当修改完TclientDataSet中数据的本地副本后,客户端调用TClientDataSet的ApplyUpdates把改变提交回数据库。非Ado连接,多表查询需要用到TUpdateSql控件。
自动容错与负载平衡
在三层结构中,可以有多个执行相同服务的应用服务器同时工作,并在其中某个服务器发生故障后能将当前服务中的客户服务中的客户自动切换到另一台正常工作的应用服务器(容错),能将大量相同的客户请求平均分配到多个执行相同服务的应用服务器(平衡负载)。TsimpleObjectBroker组件将实现以上功能(OLEnterprise或CORBA方式有自己专门的中介服务,不需此组件)。
客户端TDCOMConnection控件无需设置ComputerName属性,设置ObjectBroker为你所创建的TsimpleObjectBroker组件,在 TsimpleObjectBroker组件的Servers属性中指定你所部署的应用服务器,LoadBalanced属性设置为True就可以利用此控件的负载平衡能力。一旦当前连接服务器发生了故障,为了不影响工作,为此,客户端应用程序必须切断和原来应用服务器的连接,然后调用TsimpleObjectBroker的SetConnectStatus以便通知TsimpleObjectBroker原先的应用程序服务器已无法继续使用,然后调用GetComputrForProgId重新建立连接。
后续
最重要的是如何使得程序高内聚松散耦合,怎样使得服务(业务)的构件化,事务原子化.
参考资料:《企业级解决方案及应用剖析》刘艺著