董 強,許長霞
(西南計算機有限責任公司,重慶 400060)
伴隨信息化技術的飛速發(fā)展,軟件產品逐漸滲透應用到社會的各個領域??蛻羝谕浖a品能夠滿足更多的功能需求,快速適應功能需求變更,縮短產品研制周期等要求[1]。本文先分析傳統(tǒng)應用框架的缺陷,再結合實際工程應用需求,基于微內核設計思想,構建一套能夠支撐軟件產品高效、快速開發(fā)的應用框架。
傳統(tǒng)應用框架主要用于對各類基礎功能和業(yè)務功能進行整體性封裝,并實現(xiàn)對各功能適時調度和流程控制;基礎功能是一種與業(yè)務功能無關的功能,具有粒度小,復用度高的特點;業(yè)務功能主要用于實現(xiàn)軟件產品的業(yè)務需求?;A功能與基礎功能、業(yè)務功能與業(yè)務功能、基礎功能與業(yè)務功能之間都可能直接發(fā)生信息交互(包括功能調用、數(shù)據(jù)交換、消息交互等),傳統(tǒng)應用框架基本組成如圖1所示。
圖1 傳統(tǒng)應用框架基本組成圖Fig.1 Basic composition diagram of the traditional application framework
用戶對軟件產品功能需求的增多,軟件產品所包含的各類功能也隨之增多,功能之間的耦合程度變得更加緊密。新功能的增加和原功能的變更,都會導致應用框架和各類功能受到一定程度的影響,造成軟件產品修改、維護、擴展困難的問題,無法滿足客戶對軟件產品的高要求[2]。
微內核(Micro kernel)是提供操作系統(tǒng)核心功能內核的精簡版本[3],是內核的一種精簡形式。它提供一組“最基本”的服務,如進程調度、進程間通信、存儲管理、處理I/O 設備。其他服務,如文件管理、網(wǎng)絡支持等作為擴展服務通過接口連接到微內核[4]。將通常與內核集成在一起的系統(tǒng)服務層被分離出來,變成可以根據(jù)需求加入的選件,這樣就可提供更好的可擴展性和更加有效的應用環(huán)境。使用微內核設計,對系統(tǒng)進行升級,只要用新模塊替換舊模塊,不需要改變整個操作系統(tǒng)[5]。微內核具有可移植性、靈活性和擴展性,以及健壯性等特點[6]。微內核示意圖如圖2 所示。
圖2 微內核示意圖Fig.2 Schematic diagram of microkernel
組件化是指解耦復雜系統(tǒng)時將多個功能模塊拆分、重組的過程,有多種屬性、狀態(tài)反映其內部特性。為了達到解耦的目的[7],按照軟件產品需求將軟件產品拆分成多個組件[8],確定各組件的邊界和職責。拆分出來的各組件由于耦合度低,基本上互不影響,便于開發(fā)人員同步開展各組件的開發(fā)工作。開發(fā)完成的獨立組件按照集成規(guī)范集成到應用框架,由測試人員實施單元測試。當各獨立組件完成單元測試后,將所有組件集成到應用框架,進行集成測試,對測試過程暴露出軟件問題,只需要修改相應的組件。針對用戶變更的需求,定位變更組件后進行修改即可;針對用戶新增的需求,重新按照拆分組件、開發(fā)組件、組件單元測試、集成測試、修改組件等流程,最終形成軟件產品。組件化的意義還在于提升代碼復用性[9],可以直接將相同功能的組件運用到其他項目,而無所重新開發(fā),或者是對該組件進行重構,讓其復用程度更高,也便于后續(xù)軟件產品的復用[10],提高軟件產品的開發(fā)效率。
借鑒微內核操作系統(tǒng)設計思想和組件化的設計方法,將傳統(tǒng)軟件應用框架核心功能分離出來,作為軟件應用框架的內核服務,負責完成與具體業(yè)務功能無關的最基本功能,如組件管理、組件通信、組件連接等,它不會因為各類功能的擴展而不斷修改,僅用于支撐軟件產品的基本運行。由于其精簡形式的核心設計,更容易對其充分測試,保證整個系統(tǒng)的穩(wěn)定性。
基礎組件通過組件連接服務實現(xiàn)應用框架的基礎功能擴展,而不影響整體系統(tǒng)的穩(wěn)定性;根據(jù)軟件產品功能需求,開發(fā)或復用相應的業(yè)務組件,通過組件連接服務按需集成所有業(yè)務組件?;谖群嗽O計思想的軟件應用框架總體設計如下頁圖3 所示。
圖3 基于微內核設計思想的軟件應用框架總體設計圖Fig.3 Overall design diagram of software application framework based on microkernel design concept
按照基于微內核設計思想的軟件應用框架總體設計思路,細化內核服務功能,將其設計成基于微內核設計思想的軟件應用框架,它包括一個組件描述文件規(guī)范和組件管理服務、組件連接服務、組件通信服務等三種集成接口服務。組件管理服務提供加載組件、注冊組件、查詢組件、調度組件、卸載組件等功能;組件連接服務提供連接組件、獲取接口類集合、初始化組件、釋放組件等功能;組件通信服務用于各組件間的信息交互,包括發(fā)送信息和接收信息等?;谖群嗽O計思想的軟件應用框架組成如圖4 所示。
圖4 基于微內核設計思想的軟件應用框架組成圖Fig.4 Composition diagram of software application framework based on microkernel design concept
其中,基礎組件用于完成某類應用需求而構建的通用化功能模塊;業(yè)務組件用于完成特定應用需求而構建的專業(yè)化功能模塊。
軟件產品啟動時,宿主程序直接調用微內核應用框架提供的導出函數(shù),由其函數(shù)自動啟動組件管理服務;組件管理服務先依次加載各組件,再調用組件連接服務獲取各組件連接對象,然后將各組件注冊到組件管理服務中;各組件啟動時按需向組件管理服務注冊組件接收信息對象。
軟件產品運行中,各組件按需調用組件通信服務中的發(fā)送信息對象向其他組件發(fā)送交互信息;發(fā)送信息對象經過一系列的數(shù)據(jù)預處理,通過接收信息對象將交互信息分發(fā)到指定組件;接收到交互信息的組件,根據(jù)交互信息標識符進入對應的處理流程。
軟件產品退出時,組件管理服務調用組件連接服務釋放并卸載各組件。
組件描述文件規(guī)范是一種結構化的描述模板,定義了組件基本信息,以及組件與外部發(fā)生交互關系所需信息。具體包括組件信息、集成信息、交互信息、接口類信息的規(guī)范;其中,組件信息中組件標識符用于唯一標識某個組件;集成信息中集成接口標識符用于唯一標識某個組件功能點;交互信息中交互信息標識符用于唯一標識某個組件傳遞的某條信息;接口類信息中接口類標識符用于唯一標識某個組件的接口類。
考慮到組件描述文件規(guī)范應具備跨平臺、易閱讀、可擴展、可視化等特性,建議采用XML 文件格式來存儲組件描述信息。組件描述文件規(guī)范如圖5所示。
各組件參照組件描述文件規(guī)范,編寫專屬組件描述文件,并編碼實現(xiàn)其描述文件中定義的外部交互標識符所對應的邏輯代碼,再由組件管理服務通過組件描述文件中定義的外部交互標識符間接調用組件內部的邏輯代碼。組件描述文件規(guī)范使用原理圖如圖6 所示。
圖6 組件描述文件規(guī)范使用原理圖Fig.6 Schematic diagram of the use specification of component description files
組件管理服務為各類組件提供加載、注冊、查詢、調度和卸載等功能。
組件管理服務啟動時,自動掃描所有組件描述文件,將描述信息轉換成內存結構化數(shù)據(jù),再按照順序逐個加載組件,調用組件連接服務創(chuàng)建組件連接對象,通過組件連接對象獲取組件接口類集合,最后將已加載組件存儲到注冊組件集合中,實現(xiàn)組件的注冊。當某組件需要獲取其他組件提供的服務時,通過組件管理服務查詢組件接口集合;當不再使用某組件時,由組件管理服務對其卸載,并釋放軟件內存空間。組件管理服務注冊組件流程圖如圖7 所示。
圖7 組件管理服務注冊組件流程圖Fig.7 Flow chart of registered components of component management service
組件連接服務為各組件提供連接到組件管理服務的規(guī)范,各組件參照組件連接服務規(guī)范,編寫其具體邏輯代碼,實現(xiàn)組件連接功能。組件連接規(guī)范由一個組件連接(全局)函數(shù)和一個組件連接(基類)組成。
組件連接(全局)函數(shù)定義為一個函數(shù)名為*CreatePluginObject()的導出函數(shù)。各組件按規(guī)范定義該導出函數(shù),并在其函數(shù)內部調用new 方法創(chuàng)建一個組件連接子類對象,并返回該組件連接子對象。組件管理服務在加載組件后,直接調用組件連接(全局)函數(shù)用于獲取組件連接子對象。
組件連接(基類)包括獲取接口類集合、初始化組件、釋放組件等接口。各組件從組件連接(基類)派生各自的組件連接子類,并實現(xiàn)其接口功能。在組件連接(基類)和各組件連接子類對象中使用關鍵字virtual 定義的接口函數(shù)都會有建立一個與其對應的虛函數(shù)表,該虛函數(shù)表中存放每一個對象的虛函數(shù)入口地址。對于各組件來講,它會繼承基類的虛函數(shù)表同時增加自己的虛函數(shù)入口地址,當子類重寫基類的虛函數(shù),繼承過來的虛函數(shù)入口地址將被子類的重寫虛函數(shù)入口地址替代。程序運行時會發(fā)生動態(tài)綁定,將基類指針綁定到實例化的子對象,由組件連接基類根據(jù)組件連接子類對象來執(zhí)行不同的成員方法,已達到按需調用組件連接子類功能的目的。組件連接服務原理圖如下頁圖8 所示。
圖8 組件連接服務原理圖Fig.8 Schematic diagram of component connection service
組件通信服務為各組件之間的信息交互提供必要的通信鏈路。組件通信服務由發(fā)送信息和接收信息組成。組件通信服務原理圖如圖9 所示。
圖9 組件通信服務原理圖Fig.9 Schematic diagram of component communication service
發(fā)送信息用于某組件向其他組件發(fā)送交互信息。在組件通信服務內部創(chuàng)建一個由發(fā)送信息(基類)派生的發(fā)送信息(子類),實現(xiàn)發(fā)送信息接口功能,該接口包含全局數(shù)據(jù)交互標識符和數(shù)據(jù)流兩個參數(shù)。當該接口被調用時,根據(jù)全局數(shù)據(jù)交互標識符在注冊組件集合中查詢對應的交互規(guī)則,按照指定的傳輸模式進行組件信息傳遞。當傳輸模式設定為寄存模式,發(fā)送的數(shù)據(jù)流將被存放在發(fā)送隊列中,按照數(shù)據(jù)交互信息優(yōu)先原則從隊列中逐條取出并進入分發(fā)流程;當傳輸模式設定為及時模式時,發(fā)送的數(shù)據(jù)流將直接進入分發(fā)流程。在分發(fā)流程中,解析(接收)組件標識符來確定該條信息的通信方式(如:點播、組播和廣播3 種方式)。
點播:一個組件發(fā)送交互信息到一個指定組件對象
組播:一個組件發(fā)送交互信息到多個指定組件對象
廣播:一個組件發(fā)送交互信息到其他所有組件對象
寄存模式利用隊列“先進先出”(FI FO —First-In/First-Out)的重要特性,按照組件提出交互請求的順序依次存入數(shù)據(jù)緩存隊列,如圖10 所示。
圖10 寄存模式的數(shù)據(jù)緩存隊列Fig.10 Data cache queue in registration mode
針對寄存模式,先判斷輪詢定時器是否啟動,如果沒有啟動則啟動輪詢定時器,按照δt(ms)時間間隔查詢數(shù)據(jù)緩存隊列中的交互請求,查詢成功,則從隊列頭部取出一條交互請求,進入分發(fā)流程;循環(huán)查詢數(shù)據(jù)緩存隊列,直到查詢失敗,則停止輪詢定時器。
針對及時模式,暫停當前發(fā)送任務,直接進入分發(fā)流程,處理完成后恢復到之前的發(fā)送狀態(tài)。
接收信息用于某組件接收其他組件發(fā)送到本組件的交互信息。各組件從組件接收(基類)派生各自的組件接收(子類)實體類,并編碼處理其接收到的組件交互信息。組件通信服務經過一系列的預處理,通過調用接收信息(基類)間接調用各組件的接收信息(子類)實體類,組件接收方再依據(jù)約定的全局信息標識符對數(shù)據(jù)流進行解析,進入自身交互信息處理流程。
本文設計了一種基于微內核設計思想的軟件應用框架,支持項目團隊同步開發(fā)基礎組件和業(yè)務組件,通過基礎組件實現(xiàn)軟件應用框架功能的持續(xù)擴展,按照軟件產品需求加載對應業(yè)務組件,以達到最終實現(xiàn)具體軟件產品。利用本設計能夠適應軟件產品“短、頻、快”的開發(fā)特點,滿足用戶對產品的需求。該應用框架已應用到某領域的信息系統(tǒng)軟件中。