版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Confidential(秘密)基于RO负载均衡中间件设计方案说明书Version 1.0Written By wu_yanan楠楠楠楠个人工作室 2002,2003 All Rights Reserved目录1 引言1.1 编写目的基于RO这套框架下的即时通讯软件,包括应用服务器,登录服务器和客户端,可以用于互联网或者局域网中,运行在Windows操作系统之上,是基于企业级应用服务平台的基础设施之一。1.2 缩略语1.3 参考资料<企业级应用服务平台开发与使用详解><分布式操作系统原理实现>2 VPN技术介绍2.1 缩略语VPN,网络安全,隧道技术,L2TP,GRE,
2、IPSec,IKE,防火墙,QoS,网络管理2.2 VPN定义利用公共网络来构建的私人专用网络称为虚拟私有网络(VPN,Virtual Private Network),用于构建VPN的公共网络包括Internet、帧中继、ATM等。在公共网络上组建的VPN象企业现有的私有网络一样提供安全性、可靠性和可管理性等。 2.3 虚拟专用网络的基本用途2.3.1 虚拟专用网络支持以安全的方式通过公共互联网络远程访问企业资源。与使用专线拨打长途或(1-800)电话连接企业的网络接入服务器(NAS)不同,虚拟专用网络用户首先拨通本地ISP的NAS,然后VPN软件利用与本地ISP建立的连接在拨号用户和企业V
3、PN服务器之间创建一个跨越Internet或其它公共互联网络的虚拟专用网络。2.3.2 通过Internet实现网络互连。a). 使用专线连接分支机构和企业局域网。 不需要使用价格昂贵的长距离专用电路,分支机构和企业端路由器可以使用各自 本地的专用线路通过本地的ISP连通Internet。VPN软件使用与当本地ISP建立的连接和Internet网络在分支机构和企业端路由器之间创建一个虚拟专用网络。b). 使用拨号线路连接分支机构和企业局域网。 不同于传统的使用连接分支机构路由器的专线拨打长途或(1-800)电话连接企业 NAS的方式,分支机构端的路由器可以通过拨号方式连接本地ISP。VPN软件
4、使用与本地ISP建立起的连接在分支机构和企业端路由器之间创建一个跨越Internet的虚拟专用网络。 2.3.3 连接企业内部网络计算机在企业的内部网络中,考虑到一些部门可能存储有重要数据,为确保数据的安全性,传统的方式只能是把这些部门同整个企业网络断开形成孤立的小网络。这样做虽然保护了部门的重要信息,但是由于物理上的中断,使其他部门的用户无法,造成通讯上的困难。 用VPN方案,通过使用一台VPN服务器既能够实现与整个企业网络的连接,又可以保证保密数据的安全性。路由器虽然也能够实现网络之间的互联,但是并不能对流向敏感网络的数据进行限制。使用VPN服务器,但是企业网络管理人员通过使用VPN服务器
5、,指定只有符合特定身份要求的用户才能连接VPN服务器获得访问敏感信息的权利。此外,可以对所有VPN数据进行加密,从而确保数据的安全性。没有访问权利的用户无法看到部门的局域网络。2.4 VPN虚拟专用网络应用 客户端在企业内部,或者在Internet通过VPN虚拟专用网络,连接登录服务器,登录服务器3 负载均衡3.1 定义负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。3.2 作用负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少
6、用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。3.3 负载均衡相关技术3.3.1 软硬件负载均衡a) 软件负载均衡软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。 软件解决方案缺点也较多,因为每台服务器上安装额外的软件运行会消耗系统不定量的资源,越是功能
7、强大的模块,消耗得越多,所以当连接请求特别大的时候,软件本身会成为服务器工作成败的一个关键;软件可扩展性并不是很好,受到操作系统的限制;由于操作系统本身的Bug,往往会引起安全问题。 b) 硬件负载均衡硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。负载均衡器有多种多样的形式,除了作为独立意义上的负载均衡器外,有些负载均衡器集成在交换设备中,置于服务器与Internet链接之间,有些则以两块网络适配器将这一功
8、能集成到PC中,一块连接到Internet上,一块连接到后端服务器群的内部网络上。一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。3.3.2 负载均衡算法负载均衡策略的优劣及其实现的难易程度有两个关键因素:一、负载均衡算法,二、对网络系统状况的检测方式和能力。a) 轮循均衡(Round Robin):每一次来自网络的请求轮流分配给内部中的服务器,从1至N然后重新开始。此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。b) 权重轮循均衡(Weighted Round Robin):根据服务器的不同处理能力,给每个服务器分配不同的权值,使其
9、能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是3,C的权值是6,则服务器A、B、C将分别接受到10%、30、60的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。 c) 随机均衡(Random):把来自网络的请求随机分配给内部中的多个服务器。 d) 权重随机均衡(Weighted Random):此种均衡算法类似于权重轮循算法,不过在处理请求分担时是个随机选择的过程。 e) 响应速度均衡(Response Time): 负载均衡设备对内部各服务器发出一个探测请求(例如Ping),然后根据内部中各服务器对探测请求的最快响应时间来决
10、定哪一台服务器来响应客户端的服务请求。此种均衡算法能较好的反映服务器的当前运行状态,但这最快响应时间仅仅指的是负载均衡设备与服务器间的最快响应时间,而不是客户端与服务器间的最快响应时间。f) 最少连接数均衡(Least Connection): 客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更
11、加符合实际情况,负载更加均衡。此种均衡算法适合长时处理的请求服务,如FTP。g) 处理能力均衡: 此种均衡算法将把服务请求分配给内部中处理负荷(根据服务器CPU型号、CPU数量、内存大小及当前连接数等换算而成)最轻的服务器,由于考虑到了内部服务器的处理能力及当前网络运行状况,所以此种均衡算法相对来说更加精确,尤其适合运用到第七层(应用层)负载均衡的情况下。 h) DNS响应均衡(Flash DNS): 在Internet上,无论是HTTP、FTP或是其它的服务请求,客户端一般都是通过域 名解析来找到服务器确切的IP地址的。在此均衡算法下,分处在不同地理位置的负载均衡设备收到同一个客户端的域名解
12、析请求,并在同一时间内把此域名解析成各自相对应服务器的IP地址(即与此负载均衡设备在同一位地理位置的服务器的IP地址)并返回给客户端,则客户端将以最先收到的域名解析IP地址来继续请求服务,而忽略其它的IP地址响应。在种均衡策略适合应用在全局负载均衡的情况下,对本地负载均衡是没有意义的。3.4 负载均衡具体应用3.4.1 DNS负载均衡DNS负载均衡技术是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。
13、DNS负载均衡示例图: 3.4.2 NAT负载均衡 NAT(Network Address Translation 网络地址转换),可以将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。很多硬件厂商将这种技术集成在他们的交换机中,作为他们第四层交换的一种功能来实现,一般采用随机选择、根据服务器的连接数量或者响应时间进行选择的负载均衡策略来分配负载。由于地址转换相对来讲比较接近网络的低层,因此就有可能将它集成在硬件设备中,通常这样的硬件设备是局域网交换机。NAT负载均衡示例图: 3.4.3 反向代理负载均衡反向代理(Reverse Pro
14、xy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。 反向代理负载均衡示例图: 3.4.4 混合型负载均衡有些大型网络,由于多个服务器群内硬件设备、各自的规模、提供的服务等的差异,我们可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即
15、把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。我们将这种方式称之为混合型负载均衡。此种方式有时也用于单台均衡设备的性能不能满足大量连接请求的情况下。混合型负载均衡示例图: 4 系统架构图4.1 负载均衡系统物理架构图4.1.1 网络拓扑该负载均衡系统包括:客户端,登录服务器集群,应用服务器集群,数据库服务器集群。物理逻辑架构图如下:4.1.2 功能介绍1) DNS服务器/NAT端口映射:系统可采用DNS负载均衡或者NAT负载均衡的技术,在DNS/路由器上设置相应路由信息,两至多台登录服务器进行负载均衡处理。2) 登录服务器 登录服务器采用集群方式,可以配置一台或者多台,登录服务器
16、完成客户端的身份验证,安全授权。登录服务器相当于登录服务器,登录服务器运行后,向集中应用服务器发送请求,获取全局用户列表信息,和各个应用服务器负载信息。且在后台侦听,一旦发现有用户连接,先向客户端发送一个加密密钥,在以后通信中,该密钥作为安全验证的依据。用户向登录服务器发送用户名及密码信息后,登录服务器根据用户密钥对用户信息进行解密之后,判断是否合法用户(用户名,IP过滤机制)。如果是非法用户,立即断开连接,且加入黑名单(根据系统设置,对用户连接限制)。如果合法用户,根据负载算法,分配一台应用服务器,把IP及端口号发送给客户端,并且断开与客户端的连接。3) 集中应用服务器集中应用服务器,主要获
17、取全局用户信息,集中应用服务器启动后,处于侦听状态,实时接受应用服务器相应的用户列表信息,更新全局用户信息。并且向所有应用服务器和登录服务器发送更新全局用户信息。4) 应用服务器应用服务器采用集群方式,可以配置一台或者多台,应用服务器完成相应的业务逻辑,通过DAO或API与后台数据库连接。定时向集中应用服务器发送用户列表信息,负载信息。并且接受登录服务器授权的客户连接,提供相应服务,拒绝与非授权(非法)用户连接。转发本应用服务器用户之间的消息,根据全局用户列表,转发其它应用服务器上的用户信息。另外应用服务器还包括:Service即插即用功能,参数动态配置功能,权限控制模块,日志管理,消息队列管
18、理,异常处理等功能。4.2 负载均衡系统软件架构图4.2.1 系统架构图系统业务处理采用分层结构,按接入层,业务控制、逻辑处理,数据层三层方式,在业务上易于维护,扩展。并保证了系统数据安全。接入层包括TCP接入,UDP接入,HTTP接入等业务层接入,主要负责业务解析,协议转换,业务代理,负载均衡,验证摘要,业务调用等工作。业务控制,逻辑处理层主要负责具体的业务处理。数据层向业务控制,逻辑处理层提供数据访问接口,包括DAO访问,底层数据。4.2.2 业务接入模块软件结构图说明:业务接入模块在结构上主要分为两在部分,业务代理部分,业务监听部分。业务代理主要是根据负载均衡算法,动态从应用服务器集群中
19、分配一台SERVER远程调用连接,响应用户请求。在系统部署上业务接入模块可部署在多台机器上,通过NAT/DNS实现负载均衡。业务监听负责监听业务请求信息,根据业务对象插件管理模块配置,通过协议转换,业务解析后,通过消息分派,调用真正的后台业务处理模块处理。 5 运行环境设计说明系统运行的配置参数 *.ini,日志规范日志格式采用格式规范<Service> <ServiceName> . </ServiceName> </Service>6 系统处理模块与流程图6.1 集中应用服务器系统6.1.1 集中应用服务器相应模块集中应用服务器启动2.从数据
20、库获取全局列表4.启动后台侦听4.1 初如化配置参数4.2 监听服务端口4.3 接收应用服务器信息更新全局信息列表4.4 接收登录服务器信息更新全局信息列表4.4 发送差异信息列表到应用服务器4.5 发送差异信息列表到登录服务器3.加载IP过滤模块1.读取配置文件1.1 加载次集中Server IP集中应用服务器启动流程:集中应用服务器先从数据库获取全局用户信息,根据配置文件,并启动后台侦听线程实时接受各个应用服务器相应的用户列表信息,更新全局用户状态信息。a) 向所有应用服务器发送其它应用服务器用户列表信息,及系统已经通过登录验证,但没有连接应用服务器的用户列表。b) 向登录服务器发送更新全
21、局已连接应用服务器用户信息,和已通过验证,但尚未接入应用服务器的用户列表。对应用服务器,集中应用服务器只是被动的响应消息,尽量不主动的向应用服务器主动发送消息。减少网络流量。且每次发送的消息应该是差异消息。(只是在A用户S对S中B用户转发,且在SA的全局列表中找不到B用户所在的S时,向集中应用服务器提交请求, 获取B用户所在S中的全局列表信息时)。对登录服务器,集中应用服务器可主动,或者被动响应登录服务器。发送已经连接应用服务器的用户列表。6.1.2 集中应用服务器流程图6.2 登录服务器系统启动流程图登录服务器启动4.从集中服务器获取全局列表5.启动后台侦听2.1 初如化配置参数2.2 监听
22、服务端口2.3 更新应用服务器列表2.4 处理用户登录2.5 处理负载均衡2.6 日志记录2.7 重新登录(客户离线)2.8 向应用服务器发送密钥库2.1 初如化配置参数2.2 监听服务端口2.3 获取全局列表3.加载IP过滤模块1.读取配置文件2.启动密钥生成库登录服务器启动流程:登录服务器根据配置文件,启动密码生成库(以便用户连接时产生随机验证密钥),然后从集中应用服务器获取全局用户信息(用户ID, 密码),启用IP过滤模块,并启动后台全局列表维护线程和用户登录侦听线程。全局列表维护线程: 向主应用服务器发送请求,获取全局用户列表信息(用户ID,已通过登服务器验证,连接状态(已连接/未连接
23、应用服务器)等)。用户登录侦听线程: 收到用户登录信息,到本地已通过验证列表,及全局用户列表(已通过登服务器验证,连接状态(已连接/未连接应用服务器)中查找,如果不存在相应信息,验证用户身份,通过后,更新本地全局用户状态信息(已验证,未连接),处理负载均衡算法,分配连接的应用服务器IP,写入日志记录。并且向主应用程序发送通过验证用户信息(用户ID,密钥等)。6.3 应用服务器系统启动流程图应用服务器启动1.从集中服务器获取全局列表2.启动后台侦听2.1 初如化配置参数2.2 监听服务端口2.3 处理用户登录2.4 发送新接入用户信息2.5 处理业务逻辑2.6 日志记录2.1 初如化配置参数2.
24、2 监听服务端口2.3 获取全局列表2.4 获取密钥库2.启动IP过滤模块3. 启动业务对象插件管理应用服务器启动流程:应用服务器加载配置文件,从集中应用服务器获取全局用户信息(用户ID, 密码),启用IP过滤模块,启动业务对象插件管理器,载入业务对象模块。并启动后台全局列表维护线程和用户业务逻辑侦听线程。全局列表维护线程:向主应用服务器发送已连接的全局用户列表信息(用户ID,连接状态等)。用户登录侦听线程: 收到用户登录信息,到本地已通过验证列表,及全局用户列表(已通过登服务器验证,连接状态(已连接/未连接应用服务器)中查找,如果不存在相应信息,验证用户身份,通过后,更新本地全局用户状态信息
25、(已验证,未连接),处理负载均衡算法,分配连接的应用服务器IP,写入日志记录。并且向主应用程序发送通过验证用户信息(用户ID,密钥等)。应用服务器采用集群方式,可以配置一台或者多台,应用服务器完成相应的业务逻辑,通过DAO或API与后台数据库连接。定时向集中应用服务器发送用户列表信息,负载信息。并且接受登录服务器授权的客户连接,提供相应服务,拒绝与非授权(非法)用户连接。转发本应用服务器用户之间的消息,根据全局用户列表,转发其它应用服务器上的用户信息。另外应用服务器还包括:Service即插即用功能,参数动态配置功能,权限控制模块,日志管理,消息队列管理,异常处理等功能。7 类描述7.1 服务
26、器端类图介绍7.1.1 数据库访问模块介绍1) uConnDBConfig单元类图说明:TConnDBConfig类主要功能:1. 通过Ini配置文件,读取数据库连接参数。2. 配置文件可以不同(XML,TXT等),但参数不变。3. ADO连接参数从该类中取,可以与配置分离。具体调用:function setConnectionStr: Boolean;扩充思路:function setConnectionStr(xml): Boolean; overload;function setConnectionStr(txt): Boolean; overload;特点: 通过一个配置类获取,可减低
27、耦合性,如果要采用不同的配置文件,不需修改相关数据库类的代码即可。2) uIConnDB数据库访问接口单元IConnDataBase = interface(IUnknown) 'D9E176DD-F38C-4AE8-8E00-7E8686C1CCB0' function getDBConnection: TCustomConnection; function ConnfigDBConnection :Boolean; function getConnDBKind: TConnDBKind; /通过该类设置Connection参数 procedure setConnDBConf
28、ig(pConnDBConfig :TConnDBConfig); /通过该类设置Connection参数 end;说明:IconnDataBase接口主要功能:1. 通过该接口取得数据库的Connection的连接。2. 可以从TConnDBConfig类中加载数据库连接参数,连接数据库。3. 获得数据库连接类型。4. 设置TConnDBConfig类中数据库连接参数。特点: 通过该接口去访问数据连接对象,连接数据库,设置参数等。在其它类调用的时候,可以不用关心是什么数据库,怎么存取数据库配置文件等,只需调用接口的方法即可,真正的实现是由工厂来完成的,(工厂可以根据配置文件,生成不同的产品)
29、。3) uConnDB数据库访问类(基类)说明:TConnDB类主要功能:1. 从TPersistent派生,加入了动态运行时信息(RTTL)。2. function getDBConnection: TCustomConnection; virtual; abstract; function ConnfigDBConnection: Boolean; virtual; abstract; 两个函数被定义成了抽象函数,由派生类实现。3. 实现了interface的默认方法。特点: 两个虚函数,由具体的派生类返回,如BDE的连接将返回TDatabase,而ADO的连接则返回TADOConnect
30、ion, ConnfigDBConnection方法是根据配置参数,根据不同的连接对象(BDE,ADO),处理不同的数据库连接。4) uConnDB_SQLServer单元说明:TConnBDEDB_SQLServer, TConnADODB_SQLServer类主要功能:1. 实现SQLServer的ADO和BDE数据库连接。2. function setConnectionStr(xml): Boolean; overload;function setConnectionStr(txt): Boolean; overload;实现两个方法,对于ADO连接创建TADOConnection,对
31、于BDE则创建Tdatabase。特点: 派生两个实现类TConnBDEDB_SQLServer和TConnADODB_SQLServer,TConnBDEDB_SQLServer采用BDE访问数据库,而TConnADODB_SQLServer采用ADO访问数据库。 ConnfigDBConnection方法是根据配置参数,对不同的连接对象(BDE,ADO),处理不同的数据库连接。附:uConnDB_ORACLEServer单元和uConnDB_ACCESSServer单元与前面描述类同。5) uConnDBFactory工厂类单元附:开始创建数据访问类时,用了抽象工厂模式,本来是考虑到,不同
32、的连接对象,会使用不同的数据感知控件访问。用抽象工厂,在使用不同方式访问数据库,可以配置不同的产品类。后因BDE已经渐渐退出市场。因此没对其进行完善。原始的设计也被保留了下来。说明:TConnDBFactory类type TConnDBFactory = class(TPersistent) public function CreatorConnDB() :IConnDataBase; virtual; abstract;end;主要功能:创建一个CreatorConnDB得到一个 IconnDataBase接口,抽象方法,这里是抽象工厂的用法。抽象工厂创建一系列产品,产口都实现IconnDa
33、taBase该接口,派生不同的工厂,创建不同的产品系统类型。6) uConnDBFactory_SQLServer工厂类单元说明:TConnBDEDBFactory类主要功能:从抽象工厂派生,创建不同的产品系列对象, 即 TConnBDEDB_SQLServer和TConnADODBFactory_SQLServer。function TConnBDEDBFactory_SQLServer.CreatorConnDB() :IConnDataBase;var connDB: TConnDB;begin connDB := TConnBDEDB_SQLServer.Create; Result
34、:= connDB;end; function TConnADODBFactory_SQLServer.CreatorConnDB() :IConnDataBase;var connDB: TConnDB;begin connDB := TConnADODB_SQLServer.Create; Result := connDB;end;附:uConnDBFactory_ACCESSServer工厂类单元和uConnDBFactory_Oralce工厂类单元和前面所述雷同。7.1.2 元数据访问模块封装介绍1) uMPropList RTTL实现类单元说明:TMPropList类主要功能: 1.
35、 实现RTTL信息。 2. 对published属性字段的读取。 3. 利用GetProp和SetProp等方法,实现对底层类属性字段的读取操作。2) uDataTransferObjectFactory 元数据注册工厂单元说明:TRegDTOFactory类主要功能: 1. 对系统所有的元数据类(TdataTransferObject及派生类)进行注册。 2. 通过字符串,得到其已经注册的元数据的Tclass. 3. initialization _RegDTOFactory := TRegDTOFactory.Create; 在初始化时已经创建该对象,该对象为全局对象,在系统退出时,由操作
36、系统回收空间。使用方法:所有的元数据,都在系统初始化的时候进行注册,比如TbillVO类:initialization _RegDTOFactory.RegClassName(TBillVO);注册工厂对注册的元数据进行管理,查找,创建等。3) uDataTransferObject 元数据类及元数据列表类单元说明:元数据,传输对象,数据载体简称(DTO),O/P Maping中的数据实体。对映数据库的映射。元数据类型必须要支持数据序列化功能和持久化功能。在三层或多层设计中,层与层之间传输的就元数据(传输对象),从而使系统的开发,真正面向对象具有可维护,易用性,数据无关性,无数据集处理异常等优
37、点。序列化:网络中传输的是字节流,我们需要把一个对象转化成字节流,传输到服务器端后,又需要再把字节流转化成对象的技术。持久化:需要把一个对象实体存入到介质的一种手段。这里指(把一个对象存入DB数据库中,或把DB数据库表中数据转化成一个对象的能力)。一个读,一个写。数据持久化的原理:怎么把一个对象持久化,一般都需要语言的支持,例如反射机制,动态运行时信息等,在DELPHI中可以根据动态运行时,获取自己变量,能动态获得数据类型,存取数据的能力。要设计一个通用的底层持久化对象往往是困难的,因为在一个对象中,有可能它的本身一个变量就是其它的一个类,当然这个类本身也必须要支持持久化,否则,该变量无法被持
38、久化。关键的实现是采用了递归调用的技术,已不属本方案的讨论范围,具体请考虑有关资料。说明:该单元类设计较复杂,详细说明如下:1. TPersistentAdapter类:主要功能: 实现了数据持久化接口的一个基类。 该类实现从TROComplexType派生,实现持久化功能的基础上,对接口进行封装,从该类派生的对象,可以不用实现QueryInterface等几个方法。另外加入SetDestroyFlag对接口的生命周期进行控制。如果调用SetDestroyFlag设置为真,则用完接口之后,自动释放,不再受接口生命周期控制,有关生命周期问题请参考(COM原理)。使用说明: procedure S
39、etDestroyFlag(b_Destroy: Boolean); stdcall; 设置为真。2TDataTransferObject类: TDataTransferObject = class(TPersistentAdapter, IDataTransferObject) private PropList : TMPropList; FFldProperty: TDTOProperty; DTOSQL: TDTOSQL; DTODisplay: TDTODisplay;说明: 元数据,传输对象,简称(DTO)。多层应用中,层与层之间传输的实体对象。1TMPropList:底层实现RTT
40、L功能的一个辅助类。附:在DTO进行序列化时,并不会实现该类的序列化。2TDTOProperty类:声明如下: TDTOProperty = class(TPersistentAdapter) private FDTOType: TDTOInfoType; /类型(table, view) FMapName: String; /名字 _Index: Integer; /索引在Grid中的位置 published Property FIndex: Integer Read _Index Write _Index; Property DTOType: TDTOInfoType Read FDTOT
41、ype Write FDTOType; Property MapName: String Read FMapName Write FMapName; public constructor Create; override; destructor Destroy; override; end;FDTOType: 标识实体映射的类型(table, view),FmapName: 映射的名字,_Index: 在Grid中的索引,这里要详细讲一下,这个索引的概念,我们假设从服务器端获取一个TDTOList(数据对象列表),而每个对象在List中都有自己的位置,可能被删除,新增,但会不会和界面中的Gri
42、d一致呢,不一致,因此这个就是默认更新界面索引用的,你可能会想,我点击的时候就能判断行列,干嘛用这个,因为有时候你可能会在程序内部多次处理新增,删除,操作,如此一来,整个数据就乱了。一句话,就是由于TDTOList里面的DTO索引和Grid中的索引可能会不一致造成的。附:在DTO进行序列化时,并不会实现该类的序列化。3TDTOSQL类声明如下:TDTOSQL = class(TPersistentAdapter) private FVisSelectList: TStringList; /隐藏生成SQL语句列表 (隐藏字段不生成select语句) FVisInsertList: TString
43、List; /隐藏生成SQL语句列表 (隐藏字段不生成Insert语句) FVisUpdateList: TStringList; /隐藏生成SQL语句列表 (隐藏字段不生成Update语句) published Property VisSelectList: TStringList Read FVisSelectList Write FVisSelectList; Property VisInsertList: TStringList Read FVisInsertList Write FVisInsertList; Property VisUpdateList: TStringList R
44、ead FVisUpdateList Write FVisUpdateList; public constructor Create; override; destructor Destroy; override; end;功能说明: 该类可以在用代码生成工具进行配置的时候,控制字段是否生成SQL语句,可控制(Select语句,Insert语句, Delphi语句)。原因: 我们在开发的时候,有些字段,比如自动加1的字段,我们并不想使用这些字段。因为生成这些字段,可能造成insert失败。附:在DTO进行序列化时,并不会实现该类的序列化。4TDTODisplay类声明如下: TDTODispl
45、ay = class(TPersistentAdapter) private FDTOCaptionList: TStringList; /说明列表 FHideDTOList: TStringList; /隐藏字段列表 (隐藏字段不显示界面)。 FBindCtlList: TList; /绑定控件 procedure RefVOCtlDisplay(pDTO: TDataTransferObject); function GetFldContent(pTO: TDataTransferObject; i_j: Integer): String; procedure DrawControlLab
46、el(tmpCtl: TControl; Caption: String); procedure DrawControlContent(tmpCtl: TControl; Caption: String); published Property DTOCaptionList: TStringList Read FDTOCaptionList Write FDTOCaptionList; Property HideDTOList: TStringList Read FHideDTOList Write FHideDTOList; Property BindCtlList: TList Read
47、FBindCtlList Write FBindCtlList; public procedure FreeBindCtlList; procedure BindControl(tmpCaptionCtl,tmpCtl: TControl; fld: String); overload; procedure BindControl(tmpCaptionCtl,tmpCtl: TControl; fld, fldEx: String); overload; public constructor Create; override; destructor Destroy; override; end
48、;功能介绍: TDTODisplay是一个和UI显示相关的类。通过代码生成工具,FDTOCaptionList里面会自动存放上所有的Grid的Caption的显示,及需要隐藏的界面字段。 同时,BindControl设置DTO绑定的字段。同步更新界面和DTO元数据对象的显示。使用需知: FBindCtlList列表存放的数据结构如下: PTBindCtl = TBindCtl; TBindCtl = Record CtlCaption: TControl; /绑定控件(标题) Ctl: TControl; /绑定控件(内容) fld: String; /字段名称 fldEx: String;
49、/字段名称2 在使用数据工具的时候,可对数据库的每个字段,进行标识。 注意: 我们在DTO(数据传输对象的TDTOProperty的_index里放置的是Grid对应的行,那么对应的列呢? 答案在FbindCtlList里面,因为我们虽然使用了DTO元数据传输对象,但字的字段有些是不会生成UI的,那么我们必须对它的字段进行重新整理,以达到对象的属性和Grid的行列映射的目的。以现实(数据感知)功能。附:在DTO进行序列化时,并不会实现该类的序列化。在做一份数据库文档的同时,通过代码生成,可以实现Grid的标题设置,同时可以设置字段以达到对UI界面的控制。(使用配置工具的重要性)。5. TDat
50、aTransferObject类:详细说明:TDataTransferObject = class(TPersistentAdapter, IDataTransferObject) private PropList : TMPropList; FFldProperty: TDTOProperty; DTOSQL: TDTOSQL; DTODisplay: TDTODisplay; FOP: String; function GetDTOProperty: TDTOProperty; published Property OP: string Read FOP Write FOP; proced
51、ure InitDTOObject; virtual; procedure SetIndex(FIndex: Integer); virtual; function IsEqual(pDTO: TDataTransferObject): Boolean; virtual; abstract; public property FPropList: TMPropList read PropList write PropList; property FldProperty: TDTOProperty read FFldProperty write FFldProperty; property FDT
52、OSQL: TDTOSQL read DTOSQL write DTOSQL; property FDTODisplay: TDTODisplay read DTODisplay write DTODisplay; procedure RefVOCtlDisplay; procedure SetDTOObj(pDTO: TDataTransferObject); procedure GetDTOObj(pDTO: TDataTransferObject); public constructor Create; override; destructor Destroy; override; end;简单描述:所有数据传输对象(DTO),层与层之间传输的对象,须从TDataTransferObject派生,在服务器接口定义的对象是TDataTransferObject类型。说细说明:Property OP: string Read FOP Write FOP; 这个字段,在客户端调用insert,update, delete时,会自动修改此标识,连同数据一起传到服务器,然后由服务器端获得OP,生成语句执行。procedure RefVOCtlDisplay
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中国重症心血管疾病临床营养评估与管理专家共识课件
- 《机械能》教案物理科课件
- 十九届四中精神应知应会试题
- 车队五一节前安全培训课件
- 影像技师年度影像设备日常维护与性能校准工作总结(3篇)
- 2025年门诊医生就诊效率提升与患者就医体验改善专项总结(3篇)
- 银行内部调查与处理制度
- 银行合规管理制度更新
- 2026年工地员工考试题目及答案
- 车间检修前安全培训报道课件
- 社区家庭医生签约培训
- 直播平台开播标准话术模板
- 2025-2026学年浙美版二年级美术上册全册教案
- 物业设施设备保养计划表
- 髋关节置换围手术期加速康复护理
- 2024-2025学年湖北省襄阳市襄城区九年级(上)期末数学试卷
- 2026届安徽省合肥市42中学物理八上期末达标检测试题含解析
- 重力梯度仪精度提升路径-洞察及研究
- GJB3206B-2022技术状态管理
- 财务报表分析(第6版)全套
- 军事训练法规课件
评论
0/150
提交评论