專利名稱:一種c++應用程序版本動態(tài)管理系統(tǒng)和方法
技術領域:
本發(fā)明涉及一種C++應用程序版本動態(tài)管理系統(tǒng)和方法,在不停止服務的情況 下,對應用邏輯進行更新、擴展與增強,實現(xiàn)“即插即用”。
背景技術:
目前階段,一套應用系統(tǒng)在業(yè)務邏輯發(fā)生調(diào)整變化,需要升級時,主要采用以下幾 種實施方案一是申請計劃停機,更新應用程序;二是切換到備份系統(tǒng),更新應用程序 ’三 是采用集群方案,按機器、分批次更新應用程序。不論采用哪種方案,有的需要中斷系統(tǒng)服 務;有的上線操作或者故障后回滾操作非常復雜,加重運維人員工作負擔;有的需要額外 增加設備資源,提高運維成本。插件(plug-in)技術在業(yè)界有著廣泛的應用,很多軟件(比如firefOx、winamp 等)都支持它,其中以Eclipse平臺最著名。插件技術是指在軟件的設計和開發(fā)過程中,將 整個應用程序劃分為宿主程序和插件對象兩部分,宿主程序能夠調(diào)用插件對象,插件對象 能夠在宿主程序上實現(xiàn)自己的邏輯,而兩者的交互基于一種公共的通信契約。宿主程序可 以獨立于插件對象存在,因此,我們可以在避免改變宿主程序的情況下通過增減插件或修 改插件的方式增加或調(diào)整功能。使用了插件式機制的應用程序是一個框架,這個框架由于使用了插件架構(gòu),變得 穩(wěn)固且具有良好的可擴展性。擴展性的優(yōu)點在于它屏蔽了宿主程序與插件對象之間復雜的 交互和通信聯(lián)系,第三方插件開發(fā)者無需關注框架的宿主程序是如何運行的,如何調(diào)用插 件對象等復雜問題。事實上,他們完全無需了解框架的宿主程序是如何編寫的,只須關心自 己所要解決問題的處理邏輯,只要這個邏輯編寫正確,并且符合插件式框架規(guī)定的格式和 流程,這個插件文件就將能夠被框架的宿主程序識別并安裝。以航信開放平臺應用為例,由于不同部門使用處理的業(yè)務數(shù)據(jù)類型千差萬別,業(yè) 務流程也復雜多變,都必須根據(jù)實際情況開發(fā)自己專門應用邏輯,如果每個新應用項目都 必須讓開發(fā)人員從頭構(gòu)建,無疑是一種智力與經(jīng)驗的浪費,同時浪費的還有寶貴的開發(fā)時 間。使用插件式機制的應用程序發(fā)布插件接口,它就好像一個應用功能的容器,應用插件開 發(fā)人員可以根據(jù)自己的需要實現(xiàn)協(xié)議接口,不斷填充和增強這個容器的功能,從而這個容 器為功能的擴展提供了無限的空間。插件可基于動態(tài)共享庫實現(xiàn),動態(tài)共享庫是具有某種功能的一種軟件模塊,它可 以在需要時才被系統(tǒng)載入調(diào)用。動態(tài)共享庫文件本身并不能獨立運行,但它能夠被其他程 序調(diào)用實現(xiàn)。
發(fā)明內(nèi)容
基于上述問題,本發(fā)明人提供一種C++應用程序版本動態(tài)管理系統(tǒng)和方法,通過 合理利用動態(tài)共享庫技術,可以解決以上問題。將應用邏輯封裝成動態(tài)共享庫,同時設計系 統(tǒng)框架對其實現(xiàn)動態(tài)裝載,在應用程序版本升級時,只需升級相應動態(tài)共享庫文件,然后系統(tǒng)框架對其進行裝載,實現(xiàn)應用程序的在線更新,整個過程不需要停機中斷服務,即所謂熱 插拔。本發(fā)明的C++應用程序版本動態(tài)管理系統(tǒng)包括應用插件模塊;宿主程序模塊;應 用處理接口類模塊;應用處理接口類動態(tài)注冊模塊;應用插件裝/卸載模塊;應用版本發(fā)布 模塊;應用版本獲取模塊。其中,應用插件模塊是后綴為.so類型的動態(tài)庫文件,該模塊將應用的業(yè)務處理 邏輯打包。其中,宿主程序模塊是可執(zhí)行文件,相當于應用插件的容器,負責裝載應用插件, 創(chuàng)建應用處理接口對象,接受外部調(diào)用后,執(zhí)行接口對象中的接口函數(shù),該函數(shù)實現(xiàn)應用插 件中的業(yè)務邏輯處理。在處理外部請求之前還負責調(diào)用應用版本獲取模塊獲取應用版本, 比較版本號和應用當前使用的版本號,如果發(fā)生變化,則先調(diào)用應用插件卸載模塊,將當前 使用的應用插件卸載,然后調(diào)用應用插件裝載模塊,裝載新版本的應用插件,實現(xiàn)版本的更 新。如果一次應用處理需要分為多個應用模塊的話,第一個模塊負責把得到的應用版本號 發(fā)給后續(xù)模塊,從而保證這次請求的整個處理過程采用統(tǒng)一的應用版本。其中,應用處理接口類模塊用于實現(xiàn)宿主程序與應用插件之間的調(diào)用接口。為了 實現(xiàn)在應用插件業(yè)務邏輯發(fā)生變化時不需要更改宿主程序,該模塊將包括一個基類和相應 的派生類,并且基類中的接口函數(shù)定義成純虛函數(shù),由宿主程序調(diào)用,派生類中的接口函數(shù) 實現(xiàn)具體應用邏輯,打包在應用插件中,這樣宿主程序裝載應用插件以后,就可以通過執(zhí)行 純虛接口函數(shù),利用C++對象的多態(tài)性來調(diào)用插件中的應用邏輯了。其中,應用處理接口類動態(tài)注冊模塊是在應用插件被裝載的過程中,將應用處理 接口派生類從應用插件中動態(tài)加載到宿主程序,并且要支持一個應用插件中注冊多個不同 的應用處理接口派生類。因為C++語言層面沒有根據(jù)類名動態(tài)加載對象的機制,所以我們 提供了一個根據(jù)類名從應用插件中動態(tài)加載所需的C++對象的工廠方法,宿主程序根據(jù)應 用處理接口派生類名調(diào)用工廠方法創(chuàng)建應用處理接口對象。應用插件中的應用處理接口派 生類中需要調(diào)用一個宏,該宏定義了一個全局對象,宿主程序調(diào)用操作系統(tǒng)庫函數(shù)dlopen 裝載應用插件時,全局對象的構(gòu)造函數(shù)被執(zhí)行完成把應用處理接口派生類的創(chuàng)建函數(shù)注冊 到工廠方法維護的C++對象創(chuàng)建方法容器中,該容器把C++類名和類的創(chuàng)建方法進行關聯(lián)。 宿主程序通過該工廠方法根據(jù)應用處理接口派生類名檢索創(chuàng)建方法并執(zhí)行,完成C++對象 的動態(tài)加載,并且支持在一個應用插件中注冊多個應用處理接口派生類。其中,應用插件裝/卸載模塊的使用者是宿主程序,功能是通過調(diào)用操作系統(tǒng)庫 函數(shù)dlopen將應用插件裝載進宿主程序;通過調(diào)用操作系統(tǒng)庫函數(shù)dlclose將應用插件從 宿主程序中卸載。其中,應用版本發(fā)布模塊包括應用版本總控服務模塊、應用版本管理服務模塊和 版本公告牌以及配置文件。所述應用版本發(fā)布模塊將用戶配置的應用版本號從配置文件中 加載到版本公告牌中,用于宿主程序模塊感知版本的變化,以實現(xiàn)應用集群(多機)環(huán)境下 的版本發(fā)布。版本公告牌采用共享內(nèi)存存儲(目的是提高訪問性能),分為A塊和B塊兩個 部分,在版本更新時更新非當前使用塊,版本生效時切換當前使用塊,采用A/B塊設計的目 的是為了版本回滾方便,只需切換當前使用塊即可。應用版本總控服務模塊負責接收版本 升級的命令,然后調(diào)用版本管理服務模塊,實現(xiàn)版本公告牌的版本更新。應用版本管理服務模塊接收應用版本總控服務模塊的調(diào)用,如果是升級則從版本配置文件中將版本號裝載到 版本公告牌中,如果是回滾則直接切換版本公告牌的當前使用塊。配置文件記錄應用版本 號以及應用插件的存放目錄。其中,應用版本獲取模塊接收外部請求訪問版本公告牌,獲取當前版本。本發(fā)明還提供一種C++應用程序版本動態(tài)管理方法,該方法包括版本發(fā)布和版本 更新兩個部分其中,版本發(fā)布包括如下步驟(如圖3)1.應用版本總控服務模塊接收版本升級的命令。2.應用版本總控服務模塊調(diào)用版本管理服務模塊。3.應用版本管理服務模塊判斷指令,如果是升級則從版本配置文件中將版本號裝 載到版本公告牌中,如果是回滾則直接切換版本公告牌的當前使用塊。其中,版本更新包括如下步驟(如圖4)1.宿主程序模塊在啟動時,調(diào)用應用處理接口類動態(tài)注冊模塊,創(chuàng)建一個C++對 象創(chuàng)建方法容器,該容器把C++類名和類的創(chuàng)建方法進行關聯(lián)。2.宿主程序模塊接收應用請求命令。3.宿主程序模塊調(diào)用應用版本獲取模塊獲取版本號。4.宿主程序在執(zhí)行業(yè)務邏輯之前先判斷該版本號是否與宿主程序當前正在使用 的插件版本一致(最初執(zhí)行時宿主程序當前插件版本號初始為空,所以會初始裝載一次), 如一致則繼續(xù)第7步驟執(zhí)行,不一致則先調(diào)用應用插件卸載模塊將當前使用的應用插件卸 載,然后根據(jù)獲取的版本號調(diào)用應用插件裝載模塊裝載新版本的應用插件,實現(xiàn)版本的更 新。5.應用插件在被裝載時,會調(diào)用應用處理接口類動態(tài)注冊模塊,把應用處理接口 派生類的創(chuàng)建函數(shù)注冊到宿主程序維護的C++對象創(chuàng)建方法容器中。6.宿主程序根據(jù)應用處理接口派生類類名檢索C++對象創(chuàng)建方法容器,獲取應用 處理接口派生類的創(chuàng)建函數(shù)并執(zhí)行,創(chuàng)建應用處理接口對象。7.宿主程序調(diào)用應用處理接口對象的接口函數(shù),開始執(zhí)行應用插件中的業(yè)務處理 邏輯。8.產(chǎn)生處理結(jié)果。本發(fā)明的C++應用程序版本動態(tài)管理系統(tǒng)和方法的優(yōu)點在于1)采用動態(tài)共享庫可以少停機時間,提高服務質(zhì)量,這一點對于提供7* 小時服 務的關鍵應用系統(tǒng)尤為重要;2)操作簡單,簡化上線、回滾流程;3)還可以實現(xiàn)基于用戶的版本控制,實現(xiàn)多版本并行,方便不同開發(fā)測試人員交 叉調(diào)試,節(jié)省測試資源。
參照如下附圖將更加易于理解本發(fā)明圖1為本發(fā)明C++應用程序版本動態(tài)管理系統(tǒng)方框2所示為版本號的傳遞過程示意圖。
圖3為本發(fā)明C++應用程序版本動態(tài)管理方法的版本發(fā)布流程圖4為本發(fā)明C++應用程序版本動態(tài)管理方法的版本更新流程圖5所示為版本發(fā)布管理模塊的設計方框圖。
具體實施例方式以下參照附圖,具體說明本發(fā)明C++應用程序版本動態(tài)管理系統(tǒng)的具體實施過程。如圖1所示,本發(fā)明C++應用程序版本動態(tài)管理系統(tǒng)包含應用插件模塊;宿主程序 模塊;應用處理接口類模塊;應用處理接口類動態(tài)注冊模塊;應用插件裝/卸載模塊;應用 版本發(fā)布模塊;應用版本獲取模塊。其中,應用插件模塊是后綴為.so類型的動態(tài)庫文件,該模塊將應用的業(yè)務處理 邏輯打包。其中,宿主程序模塊是可執(zhí)行文件,相當于應用插件的容器,負責裝載應用插件, 創(chuàng)建應用處理接口對象,接受外部調(diào)用后,執(zhí)行接口對象中的接口函數(shù),該函數(shù)實現(xiàn)應用插 件中的業(yè)務邏輯處理。在處理外部請求之前還負責調(diào)用應用版本獲取模塊獲取應用版本, 比較版本號和應用當前使用的版本號,如果發(fā)生變化,則先調(diào)用應用插件卸載模塊,將當前 使用的應用插件卸載,然后調(diào)用應用插件裝載模塊,裝載新版本的應用插件,實現(xiàn)版本的更 新。如果一次應用處理需要分為多個應用模塊的話,第一個模塊負責把得到的應用版本號 發(fā)給后續(xù)模塊,從而保證這次請求的整個處理過程采用統(tǒng)一的應用版本。如圖2所示。其中,應用處理接口類模塊用于實現(xiàn)宿主程序與應用插件之間的調(diào)用接口。為了 實現(xiàn)在應用插件業(yè)務邏輯發(fā)生變化時不需要更改宿主程序,該模塊將包括一個基類和相應 的派生類,并且基類中的接口函數(shù)定義成純虛函數(shù),由宿主程序調(diào)用,派生類中的接口函數(shù) 實現(xiàn)具體應用邏輯,打包在應用插件中,這樣宿主程序裝載應用插件以后,就可以通過執(zhí)行 純虛接口函數(shù),利用C++對象的多態(tài)性來調(diào)用插件中的應用邏輯了。其中,應用處理接口類動態(tài)注冊模塊是在應用插件被裝載的過程中,將應用處理 接口派生類從應用插件中動態(tài)加載到宿主程序,并且要支持一個應用插件中注冊多個不同 的應用處理接口派生類。因為C++語言層面沒有根據(jù)類名動態(tài)加載對象的機制,所以我們 提供了一個根據(jù)類名從應用插件中動態(tài)加載所需的C++對象的工廠方法,宿主程序根據(jù)應 用處理接口派生類名調(diào)用工廠方法創(chuàng)建應用處理接口對象。應用插件中的應用處理接口派 生類中需要調(diào)用一個宏,該宏定義了一個全局對象,宿主程序調(diào)用操作系統(tǒng)庫函數(shù)dlopen 裝載應用插件時,全局對象的構(gòu)造函數(shù)被執(zhí)行完成把應用處理接口派生類的創(chuàng)建函數(shù)注冊 到工廠方法維護的C++對象創(chuàng)建方法容器中,該容器把C++類名和類的創(chuàng)建方法進行關聯(lián)。 宿主程序通過該工廠方法根據(jù)應用處理接口派生類名檢索創(chuàng)建方法并執(zhí)行,完成C++對象 的動態(tài)加載,并且支持在一個應用插件中注冊多個應用處理接口派生類。其中,應用插件裝/卸載模塊的使用者是宿主程序,功能是通過調(diào)用操作系統(tǒng)庫 函數(shù)dlopen將應用插件裝載進宿主程序;通過調(diào)用操作系統(tǒng)庫函數(shù)dlclose將應用插件從 宿主程序中卸載。如圖3所示,其中,應用版本發(fā)布模塊包括應用版本總控服務模塊、應用版本管理 服務模塊和版本公告牌以及配置文件。所述應用版本發(fā)布模塊將用戶配置的應用版本號從配置文件中加載到版本公告牌中,用于宿主程序模塊感知版本的變化,以實現(xiàn)應用集群 (多機)環(huán)境下的版本發(fā)布。版本公告牌采用共享內(nèi)存存儲(目的是提高訪問性能),分為 A塊和B塊兩個部分,在版本更新時更新非當前使用塊,版本生效時切換當前使用塊,采用 A/B塊設計的目的是為了版本回滾方便,只需切換當前使用塊即可。應用版本總控服務模塊 負責接收版本升級的命令,然后調(diào)用版本管理服務模塊,實現(xiàn)版本公告牌的版本更新。應用 版本管理服務模塊接收應用版本總控服務模塊的調(diào)用,如果是升級則從版本配置文件中將 版本號裝載到版本公告牌中,如果是回滾則直接切換版本公告牌的當前使用塊。配置文件 記錄應用版本號以及應用插件的存放目錄。其中,應用版本獲取模塊接收外部請求訪問版本公告牌,獲取當前版本。首先,應用處理接口類模塊為AppPlugin,里面定義三個純虛接口 SVrInit、 svrDone和svrProcess。應用處理接口類在應用插件中實現(xiàn)應用處理接口類的派生類。 svrlnit用于應用插件中實現(xiàn)服務啟動時應用需要做的一些初始化工作,比如建立數(shù)據(jù)庫 連接等;svrDone用于應用插件中實現(xiàn)服務停止時應用需要做的一些資源釋放工作,比如 斷開數(shù)據(jù)庫連接等;svrProcess用于應用插件中實現(xiàn)應用處理的具體業(yè)務邏輯。應用插件裝/卸載模塊實現(xiàn)一個具有Wrapper facade模式的類PluginHelper,該 類包括=Load函數(shù),封裝操作系統(tǒng)的dlopen函數(shù),實現(xiàn)應用插件的裝載;Unload函數(shù),封裝 dlclose函數(shù),實現(xiàn)應用插件的卸載。應用處理接口類動態(tài)注冊模塊,實現(xiàn)動態(tài)加載C++對象到宿主程序的工廠,定義 工廠類factory,它維護一個全局的C++對象創(chuàng)建方法關聯(lián)容器CreatorContainer,把類名 和類對象的創(chuàng)建函數(shù)指針關聯(lián),如下所示typedef void水(水CreateFuntion) (void);typedef map〈string,CreateFuntion>CreatorContainer ;Factory 還提供一個 void*Create (const std: string& className)方法被宿主 程序調(diào)用,該方法根據(jù)類名className檢索關聯(lián)容器CreatorContainer獲取類的創(chuàng)建函數(shù) 指針,然后執(zhí)行該函數(shù)創(chuàng)建對象。定義模板類 Creater :template〈class T>class Crcater ;該模板類提供create函數(shù)創(chuàng)建模板T類型的對象static void氺create (){return static_cast<void氺>(new Τ) ;}模板類 Creater 的構(gòu)造函數(shù) Creater (const std::string& classname)把函數(shù)指 針create和模板參數(shù)類名classname注冊到Factory類維護的容器CreatorContainer中。定義一個宏REGISTER #define REGISTER(class_name)\Creater<class_name>class_name(#class_name)這個宏在應用處理接口派生類中使用,例如一個應用處理接口派生類叫BusinessPlugin,那么在該類的定義文件(cpp文 件)中需聲明宏:REGISTER(BusinessPlugin),該宏用BusinessPlugin這個類型參數(shù)化 Creater模板類,定義一個模板類的全局對象。因為是全局對象,所以它在dlopen加載應用 插件時會定義Creater〈BusinessPlugin>BusinessPlugin ( "BusinessPlugin,,);
這樣,就執(zhí)行Creater的構(gòu)造函數(shù)把應用處理接口派生類的創(chuàng)建函數(shù)注冊到 Factory維護的C++對象創(chuàng)建方法容器中,宿主程序調(diào)用Factory類的create方法就能創(chuàng) 建注冊類的對象,然后就可以調(diào)用對象的svrlnit、svrDone和svrProcess方法,執(zhí)行相應 應用業(yè)務邏輯。應用插件模塊是后綴為.so類型的動態(tài)庫文件,該模塊將應用的業(yè)務處理邏輯 打包,里面包括應用處理接口派生類,具體打包方式按照操作系統(tǒng)提供的方式,比如在 Solaris平臺,編譯選項采用-KPIC,鏈接選項采用-G。宿主程序模塊采用Tuxedo(交易中間件)服務實現(xiàn),在啟動時初始化當前版本為 空,在處理外部請求之前調(diào)用應用版本獲取模塊獲取應用版本,比較版本號和應用當前使 用的版本號,如果不一致,則先調(diào)用應用插件卸載模塊,將當前使用的應用插件卸載,然后 調(diào)用應用插件裝載模塊,裝載新版本的應用插件,然后根據(jù)應用插件接口派生類的名字檢 索C++對象創(chuàng)建方法容器,獲得派生類的創(chuàng)建函數(shù)并調(diào)用,創(chuàng)建應用插件接口對象,然后執(zhí) 行對象的svrProcess方法,執(zhí)行相應應用業(yè)務邏輯得到處理結(jié)果并返回。如果一次應用處 理需要分為多個應用模塊的話,第一個模塊負責把得到的應用版本號發(fā)給后續(xù)模塊,從而 保證這次請求的整個處理過程采用統(tǒng)一的應用版本。本實施實例中,應用版本發(fā)布模塊包括兩個tuxedo (交易中間件)服務應用版本 總控服務模塊(APP_VER_CTL)、應用版本管理服務模塊(APP_VER_MNG),另外還有版本公告 牌、版本配置文件。本實施實例中,如圖5所示,應用版本總控服務模塊統(tǒng)一控制版本的更新以及多 個機器之間版本的一致性。它接收管理工具的更新請求并分發(fā)給應用版本管理服務模塊 (APP_VER_MNG)。管理服務模塊負責將版本信息更新至版本公告牌并由總控服務模塊控制 生效。應用版本獲取服務模塊通過訪問版本公告牌獲得當前版本信息,通過報文傳給后續(xù) 應用處理。具體升級流程如下版本配置文件被更新;調(diào)用版本管理服務讀取配置文件至版本公告牌;應用服務讀取公告牌,發(fā)現(xiàn)版本變化后重新裝卸應用插件;如需回滾則直接調(diào)用版本管理服務,根據(jù)配置文件中回滾信息,直接回滾至之前 版本。1)應用版本總控服務模塊服務進程名為app_Ver_Ctl,為了防止版本更新請求的并發(fā),只部署一個,啟動順 序在管理服務和應用服務之前??偪胤漳K接收版本更新請求,異步調(diào)用管理服務模塊,要求更新版本信息。待 所有管理服務模塊均更新結(jié)束后,同步調(diào)用管理服務模塊,切換活動塊,生效新的版本信 肩、ο數(shù)據(jù)接口 服務名為APPVERCTL序號中文名英文名數(shù)據(jù)類型描述輸入1指令FC0MMANDshort1:升級 2丨丨丨丨滾輸出i狀態(tài)FSTATUSshort0成功 -1:失敗2)應用版本管理服務模塊服務進程名為app_Ver_mng,一個機器部署一個,啟動順序在總控服務模塊之后和 應用服務模塊之前。服務啟動時創(chuàng)建版本公告牌的共享內(nèi)存,并初始化。管理服務模塊接收總控服務模塊的版本更新請求,生效請求。版本信息查詢請求將控制塊結(jié)構(gòu)返回。服務停止時釋放分配的共享內(nèi)存塊。數(shù)據(jù)接口 >版本更新服務服務名為APPVMLXX,XX表示01_99的數(shù)字,代表不同機器,每個物理機各不相同。
η-'ν中文名英文名數(shù)據(jù)炎型描述 ΛΤ 指令FC0MMANI)short1升級,2:回滾活動塊標志FACTIVESiMIDSTRING活動塊標志,A或B輸出1狀態(tài)n^STATUSshort0成功, -1:失敗輸出2版本信息FVERNAMESTRING成/[J插件版本,如 l.ibav. so. 1.0)>版本生效服務服務名為APPVMAXX,XX表示01_99的數(shù)字,代表不同機器,每個物理機各不相同。
序號中文名英文名數(shù)據(jù)類型描述輸入1活動塊標志FACTIVESHMIDSTRING活動塊標志,A或B輸出1狀態(tài)FSTATUSshort0 成功,-1 失敗3)版本公告牌版本公告牌由一塊共享內(nèi)存組成,邏輯上劃分為共享內(nèi)存控制塊、共享內(nèi)存塊A 和共享內(nèi)存塊B三個部分??刂茐K存放控制信息,內(nèi)存塊A和B存放版本信息。共享內(nèi)存塊由外部設定的key值創(chuàng)建。
共享內(nèi)存控制塊存放如下數(shù)據(jù)當前可用的共享內(nèi)存塊編號,A或B,在內(nèi)存初始創(chuàng)建后(即管理服務啟動時),兩 塊共享內(nèi)存均不可用,設為0。共享內(nèi)存塊A/B的生效時間。共享內(nèi)存塊A/B的狀態(tài),正常/裝載中/失效。共享內(nèi)存塊A/B共享內(nèi)存塊A/B由中順序存放著各應用的版本信息應用的代號charappId[MAXAPPIDLEN];應用的版本:charverName [2] [APPVERSIONLEN]。4)版本配置文件MAXMACHINE =應用服務器機器數(shù)目......#下面是應用版本信息[PLUGIN]IPCKEY=版本公告牌的共享內(nèi)存鍵值PLUGIN_PATH =插件存放目錄APP_VER =應用插件版本名本實施實例中,應用版本獲取服務模塊采用一個Tuxedo服務實現(xiàn)。服務進程名為app_fe_rcv,一個機器可部署多個,啟動順序在總控服務模塊、管理 服務模塊之后和應用服務模塊之前。服務啟動時連接版本公告牌的共享內(nèi)存。接收應用請求,查詢版本公告牌,獲取版本信息,將版本信息填入報文,發(fā)給應用 服務。服務停止時斷開版本公告牌的共享內(nèi)存。數(shù)據(jù)接口服務名為APPFERCV
權利要求
1.一種C++應用程序版本動態(tài)管理系統(tǒng),其特征在于,所示系統(tǒng)包括應用插件模塊; 宿主程序模塊;應用處理接口類模塊;應用處理接口類動態(tài)注冊模塊;應用插件裝/卸載模 塊;應用版本發(fā)布模塊;應用版本獲取模塊。
2.根據(jù)權利要求1的C++應用程序版本動態(tài)管理系統(tǒng),其中,所述應用插件模塊是后綴為.so類型的動態(tài)庫文件,該模塊將應用的業(yè)務處理邏輯打包;所述宿主程序模塊是可執(zhí)行文件,相當于應用插件的容器,負責裝載應用插件,創(chuàng)建應 用處理接口對象,接受外部調(diào)用后,執(zhí)行接口對象中的接口函數(shù),該函數(shù)實現(xiàn)應用插件中的 業(yè)務邏輯處理;所述應用處理接口類模塊用于實現(xiàn)宿主程序與應用插件之間的調(diào)用接口 ;所述應用處 理接口類模塊包括一個基類和相應的派生類,并且基類中的接口函數(shù)定義成純虛函數(shù),由 宿主程序調(diào)用,派生類中的接口函數(shù)實現(xiàn)具體應用邏輯,打包在應用插件中,宿主程序裝載 應用插件以后,可以通過執(zhí)行純虛接口函數(shù),利用C++對象的多態(tài)性來調(diào)用插件中的應用 邏輯;所述應用處理接口類動態(tài)注冊模塊是在應用插件被裝載的過程中,將應用處理接口派 生類從應用插件中動態(tài)加載到宿主程序,并且要支持一個應用插件中注冊多個不同的應用 處理接口派生類;所述應用插件裝/卸載模塊,由宿主程序使用,通過調(diào)用操作系統(tǒng)庫函數(shù)dlopen將應 用插件裝載進宿主程序;通過調(diào)用操作系統(tǒng)庫函數(shù)dlclose將應用插件從宿主程序中卸 載。所述應用版本發(fā)布模塊,包括應用版本總控服務模塊、應用版本管理服務模塊和版本 公告牌以及配置文件;所述應用版本發(fā)布模塊將用戶配置的應用版本號從配置文件中加載 到版本公告牌中,用于宿主程序模塊感知版本的變化,實現(xiàn)應用集群環(huán)境下的版本發(fā)布;所述應用版本獲取模塊接收外部請求訪問版本公告牌,獲取當前版本。
3.根據(jù)權利要求2的C++應用程序版本動態(tài)管理系統(tǒng),其中,所述宿主程序模塊在處理外部請求之前還負責調(diào)用所述應用版本獲取模塊獲取應用 版本,比較版本號和應用當前使用的版本號,如果發(fā)生變化,則先調(diào)用所述應用插件卸載模 塊,將當前使用的應用插件卸載,然后調(diào)用所述應用插件裝載模塊,裝載新版本的應用插 件,實現(xiàn)版本的更新;如果一次應用處理需要分為多個應用模塊的話,第一個模塊負責把得 到的應用版本號發(fā)給后續(xù)模塊,從而保證這次請求的整個處理過程采用統(tǒng)一的應用版本。
4.根據(jù)權利要求2的C++應用程序版本動態(tài)管理系統(tǒng),其中,所述應用處理接口類動態(tài)注冊模塊還提供一個根據(jù)類名從應用插件中動態(tài)加載所需 的C++對象的工廠方法,所述宿主程序根據(jù)應用處理接口派生類名調(diào)用工廠方法創(chuàng)建應用 處理接口對象;應用插件中的應用處理接口派生類中調(diào)用一個宏,該宏定義了一個全局對 象,所述宿主程序調(diào)用操作系統(tǒng)庫函數(shù)dlopen裝載應用插件時,全局對象的構(gòu)造函數(shù)被執(zhí) 行完成把所述應用處理接口派生類的創(chuàng)建函數(shù)注冊到工廠方法維護的C++對象創(chuàng)建方法 容器中,該容器把C++類名和類的創(chuàng)建方法進行關聯(lián),所述宿主程序通過所述工廠方法根 據(jù)所述應用處理接口派生類名檢索創(chuàng)建方法并執(zhí)行,完成C++對象的動態(tài)加載,并且支持 在一個應用插件中注冊多個應用處理接口派生類。
5.根據(jù)權利要求2的C++應用程序版本動態(tài)管理系統(tǒng),其中,在所述應用版本發(fā)布模塊中所述版本公告牌采用共享內(nèi)存存儲,分為A塊和B塊兩個部分,在版本更新時更新非當 前使用塊,版本生效時切換當前使用塊,實現(xiàn)版本回滾方便,只需切換當前使用塊即可;所述應用版本總控服務模塊負責接收版本升級的命令,然后調(diào)用所述版本管理服務模 塊,實現(xiàn)版本公告牌的版本更新;所述應用版本管理服務模塊接收應用版本總控服務模塊的調(diào)用,如果是升級則從版本 配置文件中將版本號裝載到所述版本公告牌中,如果是回滾則直接切換所述版本公告牌的 當前使用塊;所述配置文件記錄應用版本號以及應用插件的存放目錄。
6.一種通過權利要求1-5所述的C++應用程序版本動態(tài)管理系統(tǒng)進行C++應用程序版 本動態(tài)管理的方法,其特征在于所述方法包括版本發(fā)布和版本更新兩個部分,其中所述版本發(fā)布包括如下步驟1)應用版本總控服務模塊接收版本升級的命令;2)應用版本總控服務模塊調(diào)用版本管理服務模塊;3)應用版本管理服務模塊判斷指令,如果是升級則從版本配置文件中將版本號裝載到 版本公告牌中,如果是回滾則直接切換版本公告牌的當前使用塊;所述版本更新包括如下步驟1)宿主程序模塊在啟動時,調(diào)用應用處理接口類動態(tài)注冊模塊,創(chuàng)建一個C++對象創(chuàng) 建方法容器,該容器把C++類名和類的創(chuàng)建方法進行關聯(lián);2)宿主程序模塊接收應用請求命令;3)宿主程序模塊調(diào)用應用版本獲取模塊獲取版本號;4)宿主程序在執(zhí)行業(yè)務邏輯之前先判斷該版本號是否與宿主程序當前正在使用的插 件版本一致(最初執(zhí)行時宿主程序當前插件版本號初始為空,所以會初始裝載一次),如一 致則繼續(xù)第7步驟執(zhí)行,不一致則先調(diào)用應用插件卸載模塊將當前使用的應用插件卸載, 然后根據(jù)獲取的版本號調(diào)用應用插件裝載模塊裝載新版本的應用插件,實現(xiàn)版本的更新;5)應用插件在被裝載時,會調(diào)用應用處理接口類動態(tài)注冊模塊,把應用處理接口派生 類的創(chuàng)建函數(shù)注冊到宿主程序維護的C++對象創(chuàng)建方法容器中;6)宿主程序根據(jù)應用處理接口派生類類名檢索C++對象創(chuàng)建方法容器,獲取應用處理 接口派生類的創(chuàng)建函數(shù)并執(zhí)行,創(chuàng)建應用處理接口對象;7)宿主程序調(diào)用應用處理接口對象的接口函數(shù),開始執(zhí)行應用插件中的業(yè)務處理邏輯;8)產(chǎn)生處理結(jié)果。
全文摘要
本發(fā)明提供一種C++應用程序版本動態(tài)管理系統(tǒng)和方法,包括應用插件模塊、宿主程序模塊、應用處理接口類模塊、應用處理接口類動態(tài)注冊模塊、應用插件裝/卸載模塊、應用版本發(fā)布模塊、應用版本獲取模塊;通過合理利用動態(tài)共享庫技術,將應用邏輯封裝成動態(tài)共享庫,同時設計系統(tǒng)框架對其實現(xiàn)動態(tài)裝載,在應用程序版本升級時,只需升級相應動態(tài)共享庫文件,然后系統(tǒng)框架對其進行裝載,實現(xiàn)應用程序的在線更新,整個過程不需要停機中斷服務,即所謂熱插拔。
文檔編號G06F9/445GK102073520SQ201010624578
公開日2011年5月25日 申請日期2010年12月30日 優(yōu)先權日2010年12月30日
發(fā)明者楊勇生, 段鍇, 許囡囡 申請人:中國民航信息網(wǎng)絡股份有限公司