傳統C/S軟件的"斷骨增高"
前言:
由于院內臨床業務需要高頻強功能的用戶界面互操作性要求,使得在HIT行業中存在大量的C/S型軟件,盡管B/S軟件應用范圍正在擴大,但在很多場景中,C/S軟件仍然頑強的生存和發展著。
不過隨著行業軟件開發技術水平的提升,傳統的C/S的軟件,也就是客戶端程序直接連接數據庫的模式越來越顯得過時和不符合需求了。此時需要對這些C/S軟件進行升級。這些C/S軟件是各種開發組織(軟件公司和醫院信息科)花費數萬人月完成的,是不可能一下子替換的,只能漸進的升級。
C/S+Web Service混合模式:
目前比較常見的模式就是C/S+WebService的混合模式。
C/S+B/S混合模式就是建立一個WEB服務器,開放大量的Web Service接口,然后讓C/S客戶端軟件調用。WEB服務器直連數據庫,而C/S客戶端程序不再直接連接數據庫。這樣的好處主要有:
1.客戶端仍然保留C/S軟件具有的高頻強性能的用戶界面互操作性的要求。
2.客戶端不用直連數據庫,避免客戶端的數據庫配置操作,降低實施工作量。
3.只有WEB服務器直連數據庫,降低系統中數據庫連接數量,減輕數據庫服務器的負荷。
4.一些業務功能的更新只需要更新WEB服務器程序,Web Service接口保持不變,降低更新客戶端程序文件的概率,這有利于運維。
不過這種混合模式加大了開發工作量,主要有
1.WEB服務器需要頻繁的定義和修改Web Service。使得客戶端程序需要頻繁的更新WEB引用,需要兩頭修改代碼。導致客戶端軟件的重新編譯和部署。
2.調試不方便,在調試客戶端程序時斷點進入到WEB服務器程序中比較麻煩。單步調試不能一通到低,本來使用方便的“編輯并繼續”等調試手段無法使用。
在現代軟件項目中,軟件開發和調試工作量(包括公司內部開發和駐場開發)占據了整個工作量的很大的一部分。很多項目的失敗是源自軟件開發不力。因此降低開發工作量和工作時間有利于保障項目按時完成,讓開發組織的利益最大化。
“斷骨增高”模式:
為了比較穩妥的升級C/S軟件為混合模式,并能方便的開發和調試,在此筆者提出了對傳統C/S軟件進行“斷骨增高”的手段進行升級。
“斷骨增高”原本是一種醫學手術。是根據肢體組織在一定應力刺激下再生的生物學原理,應用骨科截骨術,在小腿或大腿把已經閉合的骨生長線重新“打開”,并在體外安裝一種具有牽伸作用的肢體延長器,根據每個人組織再生能力和特點,每天以0.5毫米至1毫米的速度將肢體緩慢地延長。
而筆者將利用一種透明代理的軟件技術,對傳統的C/S軟件進行模塊整理、內部分層,然后軟件模塊分裂,但仍然保持軟件模塊之間的調用關系,將傳統的C/S軟件改造成B/S,C/S混合模式的軟件。讓傳統軟件重新煥發活力,延長系統壽命。其原理如下:
首先傳統的C/S程序結構如下:

這種結構下,UI模塊、業務邏輯模塊、數據庫處理模塊相互糾纏,到處都有直接訪問數據庫的代碼,混亂不堪。
為此,我們需要首先改造,整改之后的程序結構如下:

這種結構下,UI模塊、業務邏輯模塊、數據庫處理模塊之間分離比較清晰,只有數據庫處理模塊才能直接連接數據,其他模塊盡量少的連接數據庫。
不過考慮到實際情況,不能要求太高,但底線是UI模塊必須分離開來,業務邏輯模塊和數據庫處理模塊不能低成本的分離開來那也能湊合著繼續,但是UI模塊絕對不能直接連接數據庫。UI模塊不能清晰分離出來,后續操作也就無法執行了。
對C/S軟件的內部功能模塊分層后,這時候我們就用到一種叫透明代理的機制。在.NET開發中就是調用類型System.Runtime.Remoting.Proxies.RealProxy中的功能。原理圖如下:

其工作步驟如下:
1.透明代理客戶端針對業務邏輯模塊或數據庫處理模塊這些底層功能模塊創建透明代理對象,并將透明代理對象替換掉真正的底層功能模塊推送到UI等上層模塊前面。
2.上層模塊是無法區別透明代理和真實的功能模塊,因為兩者具有相同的函數簽名,并能進行類型強制轉換。
3.當上層模塊調用透明代理的成員函數時,透明代理客戶端會立刻截斷函數的調用,將函數名和參數值二進制序列化成一個數據包,然后通過HTTP協議發往WEB服務器的透明代理服務器端模塊。
4.WEB服務器接受數據包,進行二進制反序列化,獲得其中的模塊名、函數名和參數值。然后創建相應的功能模塊并調用其函數。在ASP.NET開發中就是調用System.Runtime.Remoting.RemotingServices類型的ExecuteMessage()方法。
5.在WEB服務器端內部真實的功能模塊運行后得到的結果返回給透明代理服務器端,然后被二進制序列化生成一個數據包,然后作為HTTP響應發送給透明代理客戶端。
6.透明代理客戶端接受到的數據包并進行解析,生成返回值,然后返回給上層功能模塊。上層功能模塊就能歡天喜地的拿到數據進行后續處理了。
在這種模式下,為了部署和維護方便,我們可以讓客戶端和服務器端使用一樣的程序文件。客戶端雖然加載了底層功能模塊,但這些模塊是廢棄不用的;而服務器端加載了UI層等上層模塊,也是廢棄不用的。不過這些都不影響整個系統的使用。通過這種模式,我們實現了傳統C/S軟件的斷骨增高。實現了一種分布式運算,大大提高C/S軟件的靈活度和伸縮性。
而且這種模式下,更改底層功能模塊只需要改一處,不需要兩邊同時更改,降低工作量。
另外這個過程統一了數據傳輸通道,可以很方便的加上自定義的數據驗證、壓縮和加密。而實現自定義的Web Service傳輸過程比較復雜。
更進一步的,經過靈活配置,可以讓C/S軟件同時支持透明代理遠程調用和真實的本地調用。以下是客戶端不采用透明代理而使用本地真實功能模塊的情況。此時WEB服務器是停用的。而且客戶端是直連數據庫。

這種模式是非常適合軟件開發和調試過程的。可以單步調試一通到底,“編輯并繼續”也能隨時執行。
這樣我們的軟件具有開發模式和運行模式。開發模式非常適合程序員的軟件開發和調試過程;運行模式適合生產環境下的運行,具有強大的伸縮性和可維護性。兩頭都方便,按需配置,有利于快速開發和部署。
推廣:
這種技術方案的推廣也會對整個HIT行業帶來巨大的利益。業界已經運行著大量的C/S軟件,它們是各種開發組織投入數萬人月編寫數千萬行的代碼,并和用戶一起歷經數年時間反復磨合而得到的。這些軟件凝聚了客戶大量的投資,不能隨便拋棄。
而我們可以采用“斷骨增高”來改良這些C/S軟件,在無需重大修改的情況下顯著增加軟件的可伸縮性和可維護性,重用歷史代碼,大幅延長軟件的運行壽命,保護客戶投資,創造巨大的經濟效益。
我們都昌公司專門進行底層技術研究和輸出,研制出“斷骨增高”這種非常接地氣的技術方案,然后反復重構優化和產品化,并制定一套開發指南,然后融入到“都昌賦能框架”中,可以針對所有基于.NET平臺的C/S程序進行優化,幫助開發組織利用已有技術力量開發出高度可伸縮性和可維護性的軟件,增強解決問題的能力,提高市場競爭力。
posted on 2018-03-12 16:24 袁永福 電子病歷,醫療信息化 閱讀(701) 評論(0) 收藏 舉報
浙公網安備 33010602011771號