三层的疑问(200分)

  • 主题发起人 citybug_ch
  • 开始时间
在delphi中,支持三种客户端数据获取方式,也就是支持三种客户端获取数据的协议,分别是DCOM、TCP/IP和HTTP。但是基于DCOM和TCP/IP两种协议的多层分布式系统,都有一个缺点----如果在服务器中有防火墙的存在,则无法正常工作;而基于HTTP协议的多层分布式系统,则可以与任何一个拥有TCP/IP地址的主机上的应用服务器连接。与Socket连接不同的是,它可以利用SSL安全机制来与一个保护在防火墙后面的服务器相连接。在Delphi 7里,使用TwebConnection组件来实现基于HTTP的连接,可以直接通过设置TwebConnection的UserName属性和Password属性来设置用户名和口令,这样就可以通过防火墙了。
要使用HTTP协议访问一个服务器,服务器端一定会有IIS(网络信息服务)的支持。因而在实现基于HTTP协议的多层分布式数据库时,一定要配置好服务器端的IIS,允许客户端通过HTTP协议访问服务器。
在基于HTTP的多层分布式数据库系统中,服务器上直接和客户通信的是HTTP服务器代理程序(HTTPsrvr.dll),所以客户程序要访问服务器上的数据,首先要定位它想连接的服务器上代理程序的确切位置,也就是它的Web地址。因而要在服务器上配置的,也就是HTTPsrvr.dll的地址。安装了IIS后,系统所在的盘的根目录下会有一个Inetpub的目录。我们可以在Delphi 7的安装目录下找到HTTPsrvr.dll,再把它复制到Inetpub/Scripts目录下。
安全稳定的多层分布式系统开发
在分布式计算环境中,应用系统除了必须能够正确而且有效率地运行之外,如何让应用系统更为安全,不会因为应用程序服务器或是数据库服务器故障而导致整个应用系统无法继续运行也是非常重要的。当连接数据库不成功时,可以把文件存在本地文件中。这是解决服务器出现问题的一个好方法。但这种方法并不总能应用得好,因为现实中很多业务是实时的,一台服务器有故障时,另外的服务器要能够把这台服务器的业务接过去。
例如,假设有这样一个多层分布式应用系统,其中包含了数十甚至数百台客户机、数台应用程序服务器,以及一台数据库服务器。有一天所有的用户正在输入数据,而且每一个用户已经在客户端机器中输入了数十笔数据,但是就在用户把这些数据更新回数据库时突然有一台应用程序服务器发生了故障,那么所有连接到这台应用程序服务器的客户端用户如何更新他们输入的数据到数据库服务器之中呢?如果更不幸的是此时是数据库服务器发生了故障,最好的做法是,当服务器没有全部出现故障时,未出现故障的服务器应该能均衡地接过所有故障服务器的业务(或叫负载)。当然了,如果全部出了故障,将数据写到本地数据库或文件中则是惟一的选择了。
在安全考虑中,除了要考虑数据的完整性的安全,还要对数据用户授权的考虑。在多层应用系统中,当客户端连接到应用服务器且开始使用TClientDataset组件以分段的方式PacketRecord向应用服务器取得数据的时候,应用服务器中的TdatsSetProvider的onGetData事件处理函数便会被触发。在onGetData事件处理函数中,程序员可以对即将传递到客户端的数据进行任何预先处理工作,比如加密数据或附加上一些额外的信息到客户端应用程序中。也可以执行一些登陆工作,以记录客户端向应用服务器程序取得了哪些信息。可以通过两种方式使用程序代码控制数据:一种是DataQuest;另一种方法则是设定FetchOnDemand=false,然后调用TclientDataSet方法在应用执行时在适当的时期向应用程序服务器取得数据。
实现安全稳定的多层分布式应用系统的条件
从以上问题可以看出,一个多层分布式应用系统必须满足以下条件才能成为安全稳定的分布式多层应用系统。
l 当所有的应用程序服务器都发生了故障或是数据库服务器发生了故障时,客户端应用程序应该有一种机制能够把用户更新的数据暂存在客户端机器中,等应用程序服务器或是数据库服务器恢复到正常后,客户端应用程序可以把暂存的数据加载到系统中,再更新回数据库服务器中。
l 当某台应用程序服务器发生故障时,原先连接到该应用程序服务器的客户端可以立刻连接到其他提供相同服务的应用程序服务器,并继续取得服务。这就是所谓的容错能力。
l 能够根据应用程序服务器的不同负荷,动态分配客户端的连接,不致于有的应用程序服务器负载过重,而有的应用程序服务器负载过轻,便利所有的应用程序服务器的负载达到一个平衡。这就是所谓的负载平衡能力。
Delphi 7 中的解决方案
在Delphi 7中,开发安全牢固的应用程序服务器与开发一般的应用程序服务器没有什么不同,主要的不同在客户端。因为这些能力是在客户端实现的,Delphi 7 提供了一个TsimpleObjectBroker组件,该组件提供了基本的容错能力和负载平衡能力。此外可继承这个组件实现更复杂的容错能力和负载平衡能力。而对暂存数据,使用TclientDataSet就可以轻松解决。
1. 暂存数据的实现
TclientDataSet提供了两个方法,即SaveToFile和LaodFromFile。当所有应用程序服务器都发生了故障或是数据库服务器发生了故障时,调用SaveToFile方法将ClientDataSet中所有的数据包括在客户端更新的数据保存到一个文件中,然后在应用程序服务器或是数据库恢复正常后再执行客户端应用程序,调用LoadFromFile方法加载先前存储的数据到ClientDataSet中,最后再调用ApplyUpdates方法把客户端更新的数据更新回数据库中。
2. 容错能力的实现
TsimpleObiectBroker组件会维护一个能够执行的应用程序服务器的机器列表,并且提供其中的机器名称给TDCOMConnection、spcletConnection或是TWEBConnection作为连接的远程机器的名称。当 TDCOMConnection、spcletConnection或是TWEBConnection可以从TsimpleObjectBroker取得一个新的能够执行的应用程序服务器的远程机名称,然后再连接到这台新机器以取得应用程序服务器的服务。
如果客户程序需要在运行期间动态地选择应用服务器,最好TSmpleObjectBroder组件来切换,而不使用ComputerName属性。TSmpleObjectBroder能够自动维护一个可用的应用服务器的列表。当分布式多层 应用系统连接组件需要连接一个应用服务器时,它就向TSmpleObjectBroder提出申请,TsmpleObjectBroder一般会随机提供一个应用服务器。如果TsmpleObjectBroder提供的应用服务器没法工作,则TsmpleObjectBroder会再换一个,直到分布式多层应用系统连接组件与应用服务器建立了连接为止。一旦分布式多层应用系统连接组件与应用服务器建立了连接,它就会自动把应用服务器的有关情况保存到有关属性中,如ComputerName、Dress或Host等。因为分布式多层应用系统连接组件有可能会断开连接,以后又要再次连接,这时就不必再向TsimpleObjectBroker提出申请。
3. 负载平衡能力的实现
要让分布式多层应用系统提供负载能力,只需要TsimpleObjectBroker的LoadBalanced属性值为True时就可以提供简单的负载平衡能力。
 
BearX :发给我一份吧!谢谢!
robin@guangder.com.cn
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2208355
 
能否发给我一分,ywzwyw@sina.com
 
BeaX,谢谢!
我也想学三层的,fairy-gl@163.com
 
多人接受答案了。
 
顶部