3. 問題在我工作的軟體專案中,類似的應用存在於多個軟體系統中,雖然這些系統在子系統設計及職責劃分方面也如上圖一般進行了明確的分層及模組化,但在核心的「通訊採集子系統」的設計及實現上存在諸多通病,導致整個子系統的可理解性、可維護性、可測試性、對需求變動的適應性極差。集中表現在:
1. 整個系統被設計成乙個「非常龐大」的「業務排程控制類」,沒有進行職責的拆分和封裝;
2. 在通訊方式實現類(比如:串列埠通訊類、語音卡控制類、tcp/ip通訊類)中完成所有業務處理功能;(絕大多數板卡廠商demo程式就是這樣演示的,有意無意間誤導了很多剛剛接觸cti、ivr系統開發的入門者)
3. 對於多工併發,多個裝置上、下行同時通訊的管理非常複雜;
4. 對於需求變化的適應性非常差;
5. 系統**幾乎沒有可復用性了。
4. 新問題針對上述問題,總結、分析以往經驗和教訓,以「**復用」為出發點重新設計了通訊採集系統體系架構,並較好地解決這些突出問題,並梳理出大量可復用的功能**。詳細說明請參考《乙個典型的採集伺服器體系結構設計》一文:
但是,後來再次開發通訊採集伺服器,以應有於不同的業務需求時,發現原來的架構存在如下的典型問題:
1、「採集控制器」幾乎不能重用、但與新開發的採集控制模式非常相識。但是,每次新開發的「採集控制器」邏輯都非常相識,但必須修改業務採集類的類名和方法名,修改狀態機的轉換關係,修改協議呼叫的類名和方法名。
2、「業務採集類」的變化,會直接影響到「採集控制器」。
3、「通訊協議類」的變化,會直接影響到「採集控制器」。
4、通訊控制流程、時序的變化,會直接影響到「採集控制器」。並且要正確實現這些變化,必須在與此無關的「採集控制器」中,小心翼翼地扣**出來改。
5. ioc重構設計 開源的通用採集伺服器,是在原有系統架構的基礎上,增加業務抽象介面,引用ioc的設計理念,倒置互動類之間的依賴關係,採用di來實現類之間的依賴關聯的動態關聯。
1、 抽象「業務排程核心類」的核心邏輯流程,將所有類方法的呼叫設計成對介面方法的呼叫。
2、 抽象「採集控制類」的核心邏輯流程,將所有類方法的呼叫設計成對介面方法的呼叫。「採集控制器」類被設計成乙個通用的「工控機主機板」,只要遵循「主機板」約定的介面,換插不同的「業務採集類」、「通訊協議類」,就可以實現完全不同的採集業務需求、按照完全不同的通訊協議與底層模組通訊。
3、 將「採集控制類」中的狀態機管理邏輯剝離出來,將狀態機檢測和控制**設計成對介面方法的呼叫。只要遵循狀態機介面,就可以靈活實現不要業務需求的狀態轉換控制,在執行期動態建立狀態機例項,並注入到「採集控制類」,完全接觸「採集控制器」與「業務狀態機類」靜態依賴。
4、 去掉「通訊介面卡」、「協議介面卡」,增加「通訊介面」、「協議介面」和「業務介面」,按照介面要求重構通訊類、協議類、採集業務類,解決原來系統架構中:新增一種通訊方式、通訊協議時,還必須在相關的介面卡中增加新型別識別**的設計弊端。
6. 技術基礎與規約本設計的核心的設計原理:ioc容器根據反射機制動態建立實現約定介面的業務物件,動態注入到採集排程控制器中。採集排程控制器是乙個高層次抽象的active class,自動不斷地呼叫狀態機介面方法來執行「業務採集類」要求的業務通訊指令。
本設計的核心的重要設計約定:採集排程控制器只呼叫抽象的介面方法,那麼具體的上層業務任務,如何動態的翻譯成具體的通訊協議?又如何知道當前的任務如何開始,何時結束?本設計要求:業務採集類必須管理好自己的業務步驟與通訊協議之間的對應關係(確實非常難以在抽象,用動態配置的方法使用起來反而更複雜),採集排程控制器只負責動態建立兩者之間的執行期物件關係。業務採集類必須實現採集排程控制器要求的指定介面方法,用以實現採集任務的發起、執行下一條指令、結束、異常重發、異常中止、故障處理等採集流程控制功能。這正好是採集排程控制器高層抽象的價值和通用性的設計基礎。
框架使用者只需按照介面約定,編碼實現具體業務需求的相關採集、狀態機、協議業務類;在配置這些類的執行期引數,採集伺服器就大功告成。採集伺服器在允許時,會自動載入配置引數,動態建立相關的業務邏輯物件,並完成依賴注入,整個系統就能按具體的業務要求完成通訊、採集任務。
7. 採集伺服器設計 通訊採集伺服器是常常是實時監控、資料採集類系統的核心,實現與底層的軟體子系統、硬體終端、遠端裝置的通訊、下行命令的執行、上行資料的接收、協議解析,並且完成業務資料的分析以及顯示驅動。它既是系統的通訊樞紐,也是業務核心。
下圖是基於ioc理念重新設計的通用的開源採集伺服器子系統體系結構:
編了乙個伺服器
伺服器 include 包含socket 2版本的標頭檔案 include include pragma comment lib,ws2 32.lib 呼叫網路動態庫!int tmain int argc,tchar argv word sockversion 0x0002 定義版本號 sockve...
乙個簡單的Squid伺服器
本文參考http blog.s135.com book squid chap07.html a13,基本上是一步步照做 一 伺服器主機 centos5.3 159.226.3.209 區域網環境 網路設定 172.16.2.24 閘道器 172.16.2.254 說明 由於區域網所用閘道器已另行設定...
乙個簡單的Http伺服器
計算機網路的課程設計 使用基本的socket編寫的,採用多執行緒處理訪問 寫了 一下午,本來想把php鏈進來,結果之後就不想碰了 環境是 vs2010 主要是兩個類 httpserver 用來建立監聽response 用來響應請求能夠處理get 和 post報文只是因為沒有後台的指令碼語言處理,所以...