深度探討 Delphi 三層架構

前言

  近年來的科技實力, 如果不把軟體開發在Web上或使用三層技術,基本上已經是落伍了,因為開發一套應用軟體是一個風險很高、時程冗長的一件大事,尤其是企業的ERP或e化系統,更必須依賴廉價的internet資源,來取得更快速更集中的資訊管理,因此,三層技術對軟件公司或企業MIS部門而言,已經是勢在必行的趨勢。


市場上常用的Web技術基本上分為下列三種:


1.
Thin-Client:就是完全以Web Page為主的Client,一般會以Java/PHP/ASP的語言來開發,當然最新ASP .NET也是屬於Thin-Client的網頁應用技術,顧名思義,用戶端程式較主從架構輕薄短小許多,僅包含使用者介面及基本的驗證程式碼,大部分的商業邏輯程式都在伺服器端,用戶端僅顯示伺服器處理後的結果,沒有部署的問題,更讓應用程式透過網際網路的傳播,可以服務更廣泛的人群,一般都是應用在大眾客戶的系統上, 如網站及B2C或B2B
的系統上。
2.
Thick-Client:就是在Client端安裝一些就厚重的基本Windows U/I程式,一般會以ActiveX或ActiveX From或VB/C++/Delphi語言所開發的2-Tier/3-Tier程式,因使Windows的操作界面,所以可以提供良好且親和的U/I,但是Client不僅部署麻煩,更有常見的DLL Hell問題,就是系統會因為DLL版本的不同而容易發生衝突。
3.
Smart-Client:就是利用Client端的U/I優勢,並具有Client端的運算能力,但商業運算邏輯還是利用Web service的方式,並可以支援連線、離線存取功能,最重要的是能自動安裝與更新版本,微軟的.NET平台中,除了上述ASP.NET的Thin-Client方案外, 其.Net Windows Form就是標榜Smart-Client為重點,也是下一代企業內部系統的發展主流。

  從以上我們得知,Thick Client的缺點就是執行程式體積大、部屬不易,與DLL Hell,而Thin Client 的缺點就是必須有網路才能存取、較差的使用者操作、開發方式複雜(例如現今的Web程式)等,因此,Smart-Client希望避免以上缺點, 並融合這兩者優點,同時提供親和豐富的U/I、又能集中管理程式,容易部署與安裝,降低管理成本等,為此,市場上出現了一套類似.Net Smart-Client方式的3-Tier開發工具(EEP),同樣可以達到Smart-Client功能 (除了支援PDA設備以外),筆者並不強調這方面的高深技術能力,反而是平實的技術的角度來探討如何來達到Smart-Client的效果。

從Delphi三層談起

  我們都知道,Delphi 4開始就提供三層的開發技術,但一直到Delphi 5才將三層技術成熟化,為此,EEP是利用Delphi 5與C++來完成這兩項工具的開發,所以繼承了所有Delphi 5或7的所有三層優點,在Delphi 5/7中,你也可以輕易使用TRemoteDataModule貼上TQuery與TDataSetProvider,這樣就可以透過MIDAS架構(Delphi的三層中介軟件)在Client端的應用程式使用TClientDataSet來連接,其實這並不是難事,但是,如果如果你要將系統做成Smart-Client那樣,就必須考量下列一些事,如下:

1.
TRemoteDataModule只能有一個:在Delphi中,遠端的主機是由socketsrv與TRemoteDataModule構成的,也就是以微軟DCOM的技術可以將遠端的TRemoteDataModule打開,但是因為TRemoteDataModule對單一Client用戶只能有一個,所以你必須將遠端所有TDataSetProvider與TQuery貼在這個TRemoteDataModule上,這樣整個系統就變得很難維護,如果有多人開發,如何共同維護一個TRemoteDataModule中的Object呢?而且貼了一堆Control,確實會讓人眼花撩亂。
2.
連線的管理,在Delphi中有一個TDataSetProvider必須與TClientDataSet保持密切的連繫,如果同時有多少User使用,它也必須保持TDatabase多少User的Connection,而且一但斷線,很難再重新連線,因此,你可能必須為他開發Connection Pooling的機制,這部份要做到穩定確實須要20到30個案才能達到。
3.
資料Insert/Delete/Update方式:在TDataSetProvider中雖有提供方式讓程式人員可以方便設計,但還是需要人工修正與優化的處理(因為其SQL語句過於呆板與冗長)。
4.

當非常多人連線時,必須要有多個Server的負載平衡(Load Balance)設計Delphi雖有TSimpleObjectBroker元件,但面臨TDataSetProvider的有狀態連線,是無法讓你即時動態更換Server,再加上Delphi並沒有針對TSimpleObjectBroker提出相關詳細說明文件,更沒有看到應用的實例。

5.
這種Server Service的三層架構,應該要能做到同一部Server但能服務不同的客戶或資料庫(例如Application Service Provider的伺服器),也就是同一個應用程式可以隨不同的Client存取相對的Database,因為你的TRemoteDataModule中的TDatabase是事先寫死的,無法依不同的Client來連到不同的Database主機。
6.
BPL模組的切割,這是發展應用軟體重要的觀念,因為你不可能將一個大系統都寫成一個個EXE,除了程式很大外,更新與異動也很麻煩,所以,你必須在Client寫一個BPL Loader,在Server上設計一個Server控制中心(即所謂的A/P Server),並將你的U/I與Report寫成一個個的BPL,讓你容易部署這些程式,尤其是必須考量系統上線過程中,還可以機動更換這些Server端BPL,這也是一項挑戰。
7.

對於一個Server Service而言,必須要能隨時加入這些伺服端的服務(即所謂的Server Method),這部份必須要自行以DCOM來實做Interface,由於Interface的次序是不能隨意調動與事後的版本管理與維護都是讓人惡夢連連之處,對Programer來說,的確非常的不方便。

8.
對於Client端程式的部署與更新,這部份你必須自行負責,或許這也沒太多的技術性,但總是要花時間做到穩定。
9.
基本的安全性管理,這部份本來就必須自行開發,應該必較沒有疑問,大多數的企業或軟件公司都會自己去開發這部份的程序,但是在Server上規劃Security並不是一件簡單的事,必須要有足夠的經驗與規劃能力來完成這個需求。

   筆者並不是說Delphi有以上的缺點,而是Delphi非常開放,提供了你基本功能並讓你自由發揮,但你也必須通過上面最基本的考驗才能往下發展三層的系統。

如何解決三層問題

  EEP(Electornic Enterprise Platform)是訊光花了四年所開發的電子化企業平台,是以Delphi 5/7為基礎所開發的3-Tier發展平台,程序員可以輕易以Delphi 5/7用EEP以元件化的方式來開發應用系統,並開放所有元件的Source Code,目的來達到Smart-Client的目的,EEP四年來已經讓百家中大型的企業順利上線使用,所以,我們在此深入探討EEP如何解決以上的問題。

1.
EEP使用了動態的Create TDataSetProvider的技術,Server端使用了一TServiceManager來將一般的TDataModule裡的TQuery自動建立在一個空的TRemoteDataModule中,這樣就可以讓每個U/I畫面的後端的TDataModule獨立出來,各自維護,不必糾纏在一起。
2.
在EEP中透過TserviceManager讓一個TQuery會建立出一個相對的TDataSetProvider,而且會自動建立TDatabase來連線到DataBase主機中,如下圖,因此EEP可以在Server端控制要Create幾個Tdatabase來讓幾個虛擬的TdataSetProvider來共用,這部份就是Connection Pooling的機制,EEP可以輕易控制50個Concurrent的Client僅使用10個Database Connection,來減輕Database的負擔。另一個重點就是TClientDataSet與TDataSetProvider是無狀態的連線方式(隨時保持不連線),因為TDataSetProvider與TDataBase要讓大家隨時共用的關係,所以導致Client端輸入資料的過程中,Internet可以是斷線狀態(甚至A/P Server也可以重新開啟),只要事後網路是通的,A/P Server是可以被啟動的,即可將資料存回到Server上。
3.
EEP有提供一個TUpdateComp的元件來負責自動產生精準且100%的Insert/Delete/Update的SQL語法,不但語法精簡(為了增加效能),而且還提供Insert/Delete/Update時與其他Table的過帳設定,並能自動控制Begin /Commit/RollBack的時機。
4.
EEP有集中式的A/P Server控制中心,各A/P Server間有多少Client上線會相互通知,並且會讓主A/P Server(Master)按各個A/P Server的上線數來平均分配,如此可以面臨更多的Client同時使用系統,目前最大的成功案例已超過600台的Client同時使用8部A/P Server的經驗。
5.
由於TServiceManager元件會依客戶端的ClientDataSet服務時自動配置TDataSetProvider與TDatabase,所以系統即可依Client所指定的Database Name來動態決定TDatabase的資料庫,來達到隨時切換不同Database的功能。
6.
不管是Client端或Server端,EEP把所以的U/I畫面與報表都切割成一個個的BPL為單位,其目的就是為了能讓各個單元成為獨立的應用組件,更容易掛接與抽換模組,讓個別差異較小的企業組件可以容易替換與維護。
7.
EEP採用單一的DCOM Interface,可以讓你隨時掛接到A/P Server的任何Server BPL,這些Server BPL的Method我們提供的特殊的呼叫與傳遞方式,讓你更易維護與開發這些Server Service。
8.
EPP有自動的Web安裝程序,可以透過網站即可為你部署所有的Client,並可以自動比對各個BPL的版本來與A/P Server同步更新模組,達到Client完全免維護的境界。
9.
EEP提供了一組標準的安全管理機制,從Login到Menu功能表的管控都有標準的程序,由於採用開放碼的因素,這些安全管控機制也可以讓企業自行定義。

EEP就是 Smart-Client?

  微軟大力推廣Smart-Client的觀念與未來的影響,所以我們就以微軟的官方網站所發表的定義來檢驗EEP Delphi 5/7在Smart-Client的能力:

1.使用區域端的資源:這裡指的包含硬體與軟體的資源,可能是利用區域端的CPU計算能力、記憶體,將生產力軟體連接至企業營運系統;這也是EEP在Client端運用了Windows 98/2000/XP等系列的平台來執行EEP瘦小的Client BPL(基本上每個BPL大約50K到200K間),其實最重要的是這種Windows U/I用戶必較習慣也容易滿足。
2.連接:Smart client應用程式通常是大型分散式系統的一部分。例如,應用程式可能跟一系列的Web services溝通,不僅可以維護程式,也不必到處部署與這些更新服務; 這部份EEP雖沒有使用Web Server(沒有用到Web Server), 但是以A/P Server來集中提供連接服務與後端的商業處理邏輯,達到的目的是一樣的。
3.離線的能力:由於可善用區域資源,此類應用程式可讓使用者在缺乏網路連線或是不穩定的狀況下仍可運作。不論是出差需求或是移動工作者,利用桌上型電腦、筆記型電腦,都能在離線時持續運作,而當連線時,也可智慧的自動擷取或更新資料;這部份EEP提供的資料離線的解決方案,共有CAC(CacheConpoment)以Cache元件暫取Local端的資料,再等連線時自動與Server同步;另一方案是在Client端安裝簡易型的資料庫,並利用Client的A/P Server(區域型Server)將會自動記錄所有Local的SQL語法,並當網路連線時將這些SQL語法傳回集中式的主Server上執行以保持資料同步。
4.智慧型安裝與更新:這是與傳統Rich client最大的差別。以.NET framework為例,系統管理者便可透過檔案複製、下載,或是利用HTTP部署應用程式,同時可以保持自動更新版本的能力;在EEP中,Client的部署也是基本功能。
5.用戶端裝置的彈性:隨著數位裝置的蓬勃發展,不論是手機、PDA、遊戲機、車用電腦等,新的技術平台也將提供其支援Smart client應用程式架構的能力;這一點是唯一EEP平台無法取代.NET Framework的地方,因此在未來的EEP版本中,也會提供ASP .Net Module的解決方案,來解決此問題。

結論‧
  以上,是以純技術角度分析EEP在Smart-Client中所扮演的角色,不管時代如何演進,IT平台的改朝換代總是每5年到10年發生一次,更讓我們在追逐科技洪流中被淹沒了,科技的進步是一把兩刃尖刀,一邊帶來新的商機與更多的便利性,另一編卻讓我們幾年來所學的經驗完全的喪失殆盡,這也是我們身為科技人的最大的無奈,在我們期待科技的進步與新商機的形成的同時,也期待能保持住前面所做的投資與技術的累積,在跟上與保持距離的拿捏才是軟體公司最難的抉擇,你準備好了嗎?

部份文章參考資料摘自:
Taiwan.CNET.com文章:Smart client有多Smart
Shoppingguide.ithome.com.tw:微軟Smart Client

 

载自:http://www.infolight.com.tw/WebClient/SuccessDetail.aspx?DocumentID=NTM=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MateyFrame是一款由Delphi开发的三层架构框架,经过多年的升级改进,版本由MateyFrame V1.0升级到了当前的MateyFrame V5.0版本。MateyFrame V5.0具有功能强大、负载量大、安全性高、可扩展性强、同时支持B/S与C/S运行模式、开发简单等特性。MateyFrame V5.0由中间层服务端、客户端框架、MateyWeb组件三部分组成,同时支持 Oracle、MSSQL、MySQL数据库。 中间层服务端 采用面向对象方法设计而成,具有稳定性强、安全性高、负载量大、可扩展性强等特性。 采用数据库连接池技术,支持多数据库应用及多种数据库的应用,可以很好的处理断网、数据库重新启动等异常情况,一旦外界环境恢复后,连接池将重新连接数据库,不需要重启服务程序。 使用HTTP协议与客户端进行通信,可以适合企业内网及企业外网等任何网络环境,更适合在Internet网络上运行程序。 服务端支持多种类型的大型数据库一起使用,支持的数据库有:Oracle、MSSQL、MySQL。 服务端采用插件技术开发,系统核心插件可以直接使用,另外用户可轻松地扩展自己需要的服务插件。 服务端采用会话管理技术,为每个客户端会话分配唯一的加密密钥,交互数据在底层进行加密传输,保证了数据在传输过程中的高安全性。 服务端支持多实例运行模式,当客户端用户量大增时,可以适当增加中间层实例,解决大并发量的问题。 服务端插件实现了真三层、伪三层的核心插件,用户可以根据安全级别选用任何一种模式进行应用。 服务端使用Win服务运行模式,重启服务器不需登录系统开启服务程序,服务端即可自动运行。 具有客户端程序发布功能,可以为客户端软件的自动更新服务。 客户端框架 客户端设计成 EXE+BPL+DLL 的文件结构模式,具有扩展性强、易于开发、易于维护、使用简单等特点; 程序框架同时支持B/S、C/S模式,即可以通过客户端运行程序,也可以通过浏览器运行程序,并且支持两种模式同时存在。 使用插件开发模式,业务功能根据实际需要封装在不同的模块 DLL 中,即插即用; 封装了强大的基类,底层数据访问、出错处理、权限控制等; 系统功能根据业务模块信息自动生成,可以手动配置功能菜单列表; 框架中包含用户及权限管理插件,拿来即用,此模块可严格控制各功能Form 的详细权限(添加、修改、删除)、特殊数据的读取权限; 框架中包含了数据字典、系统参数的设置功能,拿来即可用。 框架采用调用时下载相关依赖文件的模式进行程序更新,具有更新文件少、更新速度快等特点; 框架支持程序文件流加载模式,更新的程序文件不需要保存在客户端的机器上,可大大增强程序的安全性。 框架有设计模式与运行模式之分,在设计模式下客户端通过框架功能用SQL可以直接读取到数据库的数据,方便程序开发;但在运行模式中,此功能不可用,这样可以保证数据的安全性。 框架设计了通用的报表设计模块,用户只需简单调,就可以得到自己所需要的报表模板设计,得到功能所需要的报表。 可选用分页数据处理技术,使大批量数据分页返回,分解服务器的压力; 具有负载平衡的功能,当连接的中间层服务器端负载过大或者崩溃时,会自动转向其它可用中间层服务器。 具有断线重连功能,当网络的异常恢复时,系统底层连接会重新连接,不用重启程序就可使用。 框架提供超级查询组件,组件可以根据编号、名称、五笔码、拼音码对需要查询的数据进行快速过滤。 MateyWeb组件 MateyWeb组件是一款能被IE加载运行的ActiveX控件,它是客户端程序在B/S模式下运行的载体。 MateyWeb组件支持WinXP、Win2000、Win2003、Win7、Vista等操作系统。 MateyWeb组件支持IE及以IE为内核的所有浏览器。 应用场合 非常适合开发各种应用于Internet之上的大中型的MIS管理软件
基础篇:Delphi深度编程技术 第1章 理解Windows消息 1.1 消息概述 1.2 Windows消息工作机理 1.3 Delphi的VCL消息系统处理原理 1.4 发送消息 1.4.1 Perform() 1.4.2 SendMessage()和PostNessage() 1.4.3 消息的发送 1.5 消息处理 1.6 消息过滤 第2章 进程与线程 2.1 进程与线程 2.1.1 进程概述 2.1.2 进程的直接创建 2.1.3 列举系统打开的进程 2.1.4 线程概述 2.2 进程间通讯(IPC) 2.2.1 利用WM_COPYDATA消息实现进程间通讯 2.2.2 利用内存映射文件实现进程间通讯 2.3 TThread对象 2.3.1 线程的创建 2.3.2 线程的挂起和恢复 2.3.3 线程的终止 2.3.4 与VCL同步 2.4 线程同步 2.4.1 临界区(CriticalSection) 2.4.2 互斥(Mutex) 2.4.3 信号量(Semaphore) 2.5 进程的优先级别 2.5.1 进程的优先级类 2.5.2 相对优先级 2.6 后台多线程数据查询实例 第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件创建实例 3.3 组件的高级技术--属性编辑器和组件编辑器 3.3.1 组件的属性编辑器 3.3.2 组件的组件编辑器 3.3.3 带有属性编辑器和组件编辑器的自定义组件实例 3.4 创建对话框组件 第4章 文件操作 4.1 文件的基本操作 4.1.1 文本文件 4.1.2 有类型文件 4.1.3 INI文件 4.1.4 无类型文件 4.1.5 文件的复制 4.2 内存映射文件 4.2.1 内存映射文件的应甩 4.2.2 映射文件的使用 4.3 内存映射文件的应用 第5章 创建DLL应用程序 5.1 DLL概述 5.2 DLL的创建 5.2.1 DLL项目文件 5.2.2 Exports关键字的使用 5.2.3 DLL中的变量 5.2.4 DLL实例:动态DLL中的窗体 5.3 DLL的调用 5.3.1 静态调用 5.3.2 动态调用 5.4 DLL的入口函数和出口函数 5.4.1 进程/线程的初始化和例程的终止 5.4.2 DLL入口/出口示例 5.5 利用DLL创建插件程序 5.5.1 插件程序的设计思想 5.5.2 插件应用程序的创建 5.5.3 创建调用插件程序的主程序 第6章 两层数据库应用程序 6.1 关系型数据库 6.1.1 关系型数据库概述 6.1.2 结构化查询语言(SQL) 6.2 数据库的连接 6.2.1 基于BDE的数据库连接 6.2.2 基于0DBC的数据库连接 6.2.3 基于AD0的数据库连接技术 6.3 TSession元件 6.4 1 DahBase组件 6.4.1 TDataBase组件的使用 6.4.2 用配置文件动态设置BDE 6.5 数据访问组件 6.5.1 TTable组件 6.5.2 TQuery组件 6.5.3 TStoredProc过程 6.6 数据感知组件 6.7 事务 第7章 多层数据库应用程序 7.1 一个简单的多层应用系统 7.1.1 服务器端应用程序的建立 7.1.2 客户端应用程序的建立 7.2 多层应用系统处理数据的原理 7.2.1 多层应用系统的结构 7.2.2 存取数据的运作原理 7.2.3 更新数据的运作原理 7.3 容错处理和负载平衡 7.4 Active Form 第8章 Socket编程 8.1 WinSock基础 8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 客户/服务器模式 8.1.4 面向连接的协议套接字的调用 8.1.5 面向无连接协议的套接字的调用 8.2 利用Winsock API实现Socket编程 8.2.1 常用WinSockAPI函数 8.2.2 利用WinSockAPI实现Socket编程 8.3 利用组件实现Socket编程 8.3.1 TClientSocket组件 8.3.2 TServerSocket组件 8.3.3 远程抓屏示例 8.4 通讯中间件的制作 8.4.1 磁盘队列的实现 8.4.2 客户端和服务器端发送接收磁盘队列数据的套接字的建立 8.4.3 中间件的简单应用 第9章 串口编程 9.1 串口通信的基础知识 9.1.1 同步通信和异步通信 9.1.2 波特率和数据传输率 9.2 串口通信API 9.2.1 DCB数据结构 9.2.2 与串口通信相关的函数 9.3 利用API函数创建串口通信示例 9.3.1 发送数据部分设计(向串口写数据) 9.3.2 数据部分设计(从串口读数据) 9.3.3 程序的具体设计和实现 9.4 利用SPC0MM组件实现串口通信编程 9.4.1 SPCOMM组件的安装 9.4.2 SPCOMM组件的属性、方法和事件 9.4.3 利用SPCOMM通讯组件实现串口通讯的实例 应用篇:物资管理信息系统项目应用开发 第10章 物资管理信息系统概述及其总体框架设计 10.1 系统总体结构设计 10.2 物资管理信息系统需求定义和业务流程图 10.2.1 仓储管理 10.2.2 计划管理 10.2.3 合同管理 10.2.4 物资管理系统的业务流程 第11章 物资管理信息系统后台数据库设计 11.1 关系型数据库概述 11.1.1 关系型数据库 11.1.2 物资管理信息系统数据库的建立 11.2 物资管理信息系统数据结构的设计 11.2.1 权限管理数据结构的设计 11.2.2 仓储管理数据结构的设计 11.2.3 计划管理数据结构的设计 11.2.4 合同管理数据结构的设计 11.2.5 基础设置数据结构的设计 第12章 应用服务器的实现 12.1 创建应用服务器的实例 12.2 状态区编程 12.3 动态数据库的连接 12.4 远程数据模块的建立 第13章 客户端应用程序的设计 13.1 客户端应用程序系统流程和系统功能 13.1.1 系统流程 13.1.2 系统功能 13.2 构建客户端应用程序框架 第14章 动态连接应用服务器的实现 第15章 通用权限管理模块的设计 15.1 系统登录的设计 15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的制作 16.1 通用查询组件的创建 16.2 通用报表模块的制作 第17章 通用基础数据维护模块的设计 17.1 界面设计 17.2 代码实现 17.2.1 以目录树的格式显示部门档案数据 17.2.2 利用目录树导航数据 17.2.3 利用目录树操作数据 17.2.4 按表格的标题排序 17.2.5 打印部门档案 第18章 物资管理信息系统业务操作模块的设计 18.1 数据表的设置 18.2 收料单据主表显示区 18.3 具体的材料明细表显示区 18.4 数据操作区 第19章 综台查询模块的设计 19.1 数据源的设置 19.2 窗体样式设计 19.3 代码实现 19.3.1 查询数据 19.3.2 打印数据 19.3.3 全部浏览
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值