摘要:隨著軟件設(shè)計技術(shù)的發(fā)展,一般的企業(yè)應(yīng)用已經(jīng)從傳統(tǒng)的C/S模式演變?yōu)榉植际蕉鄬幽J?,分層模式可以最大限度地提高軟件系統(tǒng)的性能及可維護(hù)程度。不久前,我們承擔(dān)了一個醫(yī)院管理系統(tǒng)的設(shè)計和開發(fā),醫(yī)院希望以此來轉(zhuǎn)變醫(yī)院現(xiàn)有的運(yùn)行機(jī)制,提高服務(wù)質(zhì)量,實現(xiàn)全院醫(yī)用信息的整合。該系統(tǒng)除了目前常見的結(jié)費(fèi)系統(tǒng)、電子病歷外,還包括門診醫(yī)生模塊、住院醫(yī)生模塊、護(hù)士模塊等分支系統(tǒng)。所有模塊需要通過 Intranet 實現(xiàn)集成互聯(lián),并有部分的 Internet 功能,本項目平臺最后采用了微軟的Dot NET平臺,并采用三層的結(jié)構(gòu)體系。正確的體系劃分及軟件技術(shù)的合理選用使該系統(tǒng)取得了成功。
關(guān)鍵詞:分布式系統(tǒng);三層體系;四層體系
隨著軟件設(shè)計技術(shù)的飛速發(fā)展,傳統(tǒng)的C/S模式系統(tǒng)已經(jīng)不能適合大型開放式系統(tǒng)的開發(fā)需求。在傳統(tǒng)C/S模式的應(yīng)用系統(tǒng)中,系統(tǒng)的業(yè)務(wù)處理邏輯層和表示層集成在客戶端,與數(shù)據(jù)層所在的數(shù)據(jù)庫服務(wù)器形成了胖客戶端,瘦服務(wù)器的結(jié)構(gòu)。在這種結(jié)構(gòu)下,客戶端顯得極為臃腫,從而導(dǎo)致客戶端程序在編寫及升級維護(hù)時極為麻煩。另外傳統(tǒng)的客戶端程序界面單調(diào)、刻板,也不能適應(yīng)互聯(lián)網(wǎng)飛速發(fā)展情況下的使用需求。
在這種情況下,為了解決C/S模式的諸多缺陷,產(chǎn)生了B/S模式、分布式系統(tǒng)等多種體系結(jié)構(gòu)。這些體系在很大程度上解決了傳統(tǒng)C/S模式的不足。特別是當(dāng)微軟的Dot NET和SUN的J2EE平臺推出以后,分布式的三層或四層結(jié)構(gòu)體系已逐漸成為一種規(guī)范,在三層結(jié)構(gòu)中,系統(tǒng)分為表示層,業(yè)務(wù)邏輯層和數(shù)據(jù)庫層,客戶端作為表示層只是一個顯示的終端,業(yè)務(wù)邏輯層和數(shù)據(jù)庫層分別由專用服務(wù)器擔(dān)任。在這種模式下,客戶端的負(fù)重量大大減輕,而業(yè)務(wù)邏輯層則專門處理系統(tǒng)的業(yè)務(wù)邏輯部分,同時負(fù)責(zé)客戶端與數(shù)據(jù)庫的連接,這樣就大大減輕了服務(wù)器端的負(fù)荷。因此,B/S模式的系統(tǒng)在整體分布上更加合理,更加有益于系統(tǒng)開發(fā)和維護(hù)升級。在現(xiàn)有的技術(shù)中,要實現(xiàn)B/S模式的系統(tǒng),我們可以有兩種選擇,一種是微軟的Dot NET平臺,另外一種是SUN的J2EE。相比而言,微軟的Dot NET因為在操作系統(tǒng)上的優(yōu)勢,可用性和易用性比較好,而J2EE則是采用JAVA規(guī)范,具有平臺無關(guān)性的特點,適用于不同的平臺。
下面結(jié)合一個醫(yī)院管理系統(tǒng)的建設(shè),討論一下多層分布式系統(tǒng)在具體實踐中的運(yùn)用。
2004年,我們承擔(dān)了一個醫(yī)院管理綜合系統(tǒng)的設(shè)計和開發(fā),醫(yī)院希望以此來轉(zhuǎn)變現(xiàn)有的運(yùn)行機(jī)制,提高服務(wù)質(zhì)量和工作效率。該醫(yī)院是一個礦區(qū)醫(yī)院,醫(yī)院很早就開始從事信息化管理,但主要是結(jié)費(fèi)這一塊,同時,還有人事管理,藥品管理等幾個分支模塊。以上幾個模塊彼此之間沒有明顯的聯(lián)系,分屬于幾個不同的部門,彼此間信息流通量也不大。后來,院方對其進(jìn)行了改進(jìn),加入對病人電子病歷的管理和采集,這樣當(dāng)病人二次就診時,可以很容易地得到病人的既往病史。但隨著系統(tǒng)的運(yùn)行,院方希望對現(xiàn)有系統(tǒng)進(jìn)行改進(jìn),為了更好的為病人服務(wù),醫(yī)院考慮加入一些其它的分支系統(tǒng),比如門診醫(yī)生工作站、住院醫(yī)生工作站和護(hù)士工作站等等,并希望以此形成全院范圍內(nèi)一個集成的信息系統(tǒng),以使各種醫(yī)用信息能夠全面流通,給全院的各層人員提供及時準(zhǔn)確的信息,以提高工作效率。
在開發(fā)前期,我們首先要設(shè)計出詳細(xì)的系統(tǒng)功能規(guī)范,這一部分所花費(fèi)的時間很少,因為衛(wèi)生部在 2002 年曾經(jīng)頒發(fā)了一個有關(guān)醫(yī)院管理系統(tǒng)功能規(guī)范的通知,我們參考了該規(guī)范,很快確定了各分系統(tǒng)以及每個分系統(tǒng)的基本功能,但在選擇合適的系統(tǒng)平臺上有一番討論,考慮到醫(yī)院原有系統(tǒng)在某些地方運(yùn)行良好,是否有必要將原有系統(tǒng)淘汰重新設(shè)計,另外新的分系統(tǒng)到底采用何種平臺結(jié)構(gòu)也是需要考慮的問題。
醫(yī)院原有的結(jié)費(fèi)系統(tǒng)和電子病歷系統(tǒng)數(shù)據(jù)流向范圍比較固定,主要集中在交費(fèi)處和掛號處,一旦引入了新的系統(tǒng),必然要將數(shù)據(jù)流向醫(yī)院的各個部門。醫(yī)院的 Intranet已經(jīng)實施,因此首先考慮采用 B/S架構(gòu)體系,舊系統(tǒng)的數(shù)據(jù)模型盡可能保留。在系統(tǒng)的軟件平臺上,我們選用了Dot NET平臺,因為我們以前的開發(fā)都是基于Windows平臺的,在新的Dot NET平臺中,提供了C++,Basic,C#幾種語言,采用Dot NET平臺,對于習(xí)慣于Windows編程的人員來說,相對易于上手,可以最大限度地縮小人員的培訓(xùn)時間,節(jié)省經(jīng)費(fèi),同時在技術(shù)上也有很穩(wěn)固的基礎(chǔ),降低了系統(tǒng)開發(fā)失敗的風(fēng)險。確定所采用的架構(gòu)和技術(shù)后,我們在系統(tǒng)的開發(fā)中引用了中間件技術(shù)(Middleware)。中間件是位于操作系統(tǒng)與應(yīng)用程序之間的一類軟件,其主要功能是在分布式應(yīng)用中,在應(yīng)用程序及服務(wù)器之間提供通信服務(wù)并屏蔽了底層操作系統(tǒng)的復(fù)雜性,以減化系統(tǒng)的設(shè)計和維護(hù)工作,使設(shè)計者能專注于與應(yīng)用邏輯層有關(guān)的部分。目前的中間件技術(shù)主要有CORBA,J2EE,JVM,CLR等,在DOT NET框架中,其底層即是CLR(通用語言運(yùn)行時),CLR屏蔽了底層的復(fù)雜性,無論是用C#、Basic,還是C++編寫的代碼,最終都被翻譯成IL(中間代碼)來執(zhí)行,同時,Dot NET Framework中強(qiáng)大的類庫也給我們的系統(tǒng)開發(fā)提供了便捷。
在項目建設(shè)中,我們這樣設(shè)計架構(gòu)系統(tǒng),將系統(tǒng)分為三層:
(1)表示層采用ASP.NET 實現(xiàn)頁面輸出。這也是用戶直接訪問層,表示層接受來自網(wǎng)絡(luò)瀏覽器的 HTTP 請求,然后返回給客戶端瀏覽器可以顯示的 HTML 頁面。
(2)中間件層(業(yè)務(wù)邏輯層)用C# 實現(xiàn)業(yè)務(wù)邏輯和對數(shù)據(jù)庫的訪問,考慮到數(shù)據(jù)的分布特點,我們使用了數(shù)據(jù)庫連接池技術(shù)。
(3)數(shù)據(jù)庫層用 SQL Server 實現(xiàn)數(shù)據(jù)庫的管理和存儲過程,同時使用了負(fù)載均衡技術(shù)以提高系統(tǒng)性能。
我們大量的工作主要放在中間件層,由于系統(tǒng)中的醫(yī)生工作站分系統(tǒng)是主要部分,因此數(shù)據(jù)庫的負(fù)載成為一個不得不考慮的問題。我們決定采用數(shù)據(jù)連接池技術(shù),因為基本上每個醫(yī)生都對應(yīng)一個客戶終端,無論是病人資料的查詢或錄入,或者醫(yī)囑的處理,都涉及到對數(shù)據(jù)庫的頻繁讀寫,服務(wù)器對于數(shù)據(jù)連接的頻繁打開和關(guān)閉必然導(dǎo)致性能下降。一方面,我們預(yù)先考慮數(shù)據(jù)庫的連接量,在系統(tǒng)初始階段建立相應(yīng)的存儲空間,當(dāng)數(shù)據(jù)庫連接打開和關(guān)閉時都對該連接池進(jìn)行處理;另一面,我們也使用了高速緩存技術(shù),對某些固定的SQL 查詢結(jié)果,例如藥品查詢、藥性禁忌等,將結(jié)果采用緩存存儲,以加快對數(shù)據(jù)庫的訪問,降低了服務(wù)器端的負(fù)載,提高性能。值得一提的是,為了盡可能地避免糾紛,醫(yī)院要求采用醫(yī)生簽名制度,我們設(shè)計了電子簽名,采用加密算法保證各環(huán)節(jié)產(chǎn)生數(shù)據(jù)的有關(guān)人員不能抵賴。數(shù)據(jù)庫層我們選擇了 SQL Server,針對該院原來系統(tǒng)中大量使用的Access和Foxpro數(shù)據(jù)庫,我們在此次系統(tǒng)重建中針對實際情況統(tǒng)一使用了SQL Server數(shù)據(jù)庫,同時在數(shù)據(jù)庫內(nèi)容的設(shè)計上盡量做到按醫(yī)院的業(yè)務(wù)進(jìn)行組織(如醫(yī)生庫,藥品庫,病人庫,收費(fèi)庫等),為以后關(guān)系型的數(shù)據(jù)庫升級成為數(shù)據(jù)倉庫奠定了基礎(chǔ)。
在數(shù)據(jù)庫的設(shè)計中,我們到醫(yī)院做了大量的走訪工作,了解整個數(shù)據(jù)流,同時廣泛參考現(xiàn)有的系統(tǒng)。雖然對醫(yī)院行業(yè)不是很熟悉,但數(shù)據(jù)層開發(fā)遇到的問題并不是很大。在概要設(shè)計階段,我們使用了一些計算機(jī)輔助開發(fā)工具,這也加快了詳細(xì)設(shè)計的進(jìn)程。比如使用了 Sybase 的 Power Designer工具,在概要設(shè)計中規(guī)劃了 E-R 圖和各個分系統(tǒng)以及分系統(tǒng)之間的數(shù)據(jù)流圖,然后讓工具直接生成后臺數(shù)據(jù)庫中的基本表結(jié)構(gòu),大大提高了開發(fā)效率。
在系統(tǒng)的物理實現(xiàn)上,我們在醫(yī)院中心機(jī)房配置了一臺SQL SERVER 2000服務(wù)器,一臺應(yīng)用服務(wù)器,一臺WEB服務(wù)器。系統(tǒng)的醫(yī)生工作站模塊、病人電子病歷查詢模塊、藥品查詢模塊均采用WEB界面,通過應(yīng)用服務(wù)器與數(shù)據(jù)庫進(jìn)行通信。而結(jié)費(fèi),藥品管理等幾個模塊的細(xì)節(jié)處理則由C#開發(fā),放在應(yīng)用服務(wù)器上。這樣的處理使得整個系統(tǒng)的功能分布合理而高效,客戶端的Web界面簡潔而符合人們的使用習(xí)慣,服務(wù)器端功能的分解也使其負(fù)荷大大減輕。整個系統(tǒng)投入運(yùn)行后一直運(yùn)行正常,沒有出現(xiàn)過大的故障,系統(tǒng)的建設(shè)取得了成功。
在醫(yī)院管理系統(tǒng)的建設(shè)中,由于我們積極采用新技術(shù),合理劃分系統(tǒng)的功能結(jié)構(gòu),使得系統(tǒng)的設(shè)計與實現(xiàn)能夠按預(yù)期進(jìn)度正常完成,同時也為以后系統(tǒng)的維護(hù)奠定了良好的基礎(chǔ)。綜上所述,在互聯(lián)網(wǎng)飛速發(fā)展的今天,企業(yè)的分布式計算體系采用多層結(jié)構(gòu),在Dot NET和J2EE兩種技術(shù)之間進(jìn)行合理選擇,將是系統(tǒng)成功及高效運(yùn)轉(zhuǎn)的根本保障。
參考文獻(xiàn):
[1] 張友生,徐峰.系統(tǒng)分析師技術(shù)指南.北京:清華大學(xué)出版社,2004.
[2] 李建忠.MICROSOFT.NET框架程序設(shè)計.北京:清華大學(xué)出版社,2003.