傳統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程序進行優化,幫助開發組織利用已有技術力量開發出高度可伸縮性和可維護性的軟件,加強解決問題的能力,提升市場競爭力。