【大話QT之十三】系統軟件自動部署實現方案

        本篇文章是對【大話QT之十二】基於CTK Plugin Framework的插件版本動態升級文章的補充,在上篇文章中我們闡述的重點是新版本的插件已經下載到plugins目錄後應該如何更新本地正在運行的程序,是整個插件升級實現的後半部分。本篇文章就來講述軟件自動部署(當然,也包括插件升級)的前半部分。

        我們必須有這樣一點認識,即:我們的程序是運行在用戶機器上的,插件更新不是我們手動放進去的,而必須有一種機制使客戶端能夠檢測到需要升級插件了,然後將插件自動下載下來,最後自動進行安裝或插件更新。

系統軟件自動部署實現的基本架構爲:

上圖中的組成中,【應用】和【更新服務】部分是運行在客戶端的,【數據庫】和【文件服務器】是運行在服務端,而【Server (WebServer)】則負責客戶端與服務端進行通信,其基本的流程如下:

        1> 客戶端的【更新服務】採用QTimer::singleShot()定時觸發版本檢測的邏輯。

        2> 版本檢測邏輯中採用WebServer請求訪問服務端的版本檢測服務(通過PHP實現),服務端回去訪問【數據庫】,去檢查比較是否有更高版本的插件/升級包。

        3> 檢測信息返回給客戶端的【更新服務】,當【更新服務】根據返回結果判定存在較新的插件/安裝包時,開始訪問【文件服務器】執行下載操作,這裏可以採用FTP下載,或者其它的某種方式將【文件服務器】上的更新文件下載到本地相應目錄內。

        4> 最後這一部分是系統軟件部署/插件升級最麻煩的地方,客戶端的【更新服務】會去判斷【應用】模塊中是否正在運行作業或者對外提供服務。如果此時【應用】模塊沒有對外提供服務,則在給出用戶提示的情況下可以直接升級或安裝;如果此時【應用】模塊正在對外提供服務,則需要採用空閒時更新的策略,當對外服務完成之後進行更新。

        基本上系統軟件自動部署的邏輯架構就如上所示,但在實際代碼中要實現還需要考慮一些很重要的問題。

1. 要兼容安裝包/升級包的各種文件,下載的文件有exe,dll,zip包等,必須要能夠區分出下載文件的後綴名,然後根據不同的後綴,採用不同的安裝或升級策略。

2. 要兼容各種平臺,Windows、Linux、Mac OS等,不同的平臺下安裝包的形式有各種各樣,例如:windows下有exe、dll、zip等;Linux下有rpm、tar.gz等。

3. 當【應用】模塊正在對外提供服務,例如:正在進行網絡操作,有打開的端口,在進行插件更新或升級包安裝時必須先將原有佔用的端口停掉,然後等插件更新完成後重新打開端口恢復以前的任務。這個過程不是很好控制,現在還沒有處理這方面問題的經驗。

最後,由於客戶端要和服務端進行通信,因此必須採用定義相同的數據結構或通信協議,而在這個時候採用的google protobuf則提供了很大的靈活性。它的使用方式不僅簡單,而且效率更高(通常和xml進行比較),而且支持很多語言版本,PHP、C++、Java等,強烈建議在以後的項目中涉及到網絡通信時採用google protobuf來定義網絡協議,它會給你帶來意向不到的驚喜。

堅持每天的學習和積累,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章