標籤:自動部署google protobuf插
本篇文章是對【大話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來定義網路通訊協定,它會給你帶來意向不到的驚喜。
堅持每天的學習和積累,加油!