系統軟件自動部署實現方案

在上篇文章中咱們闡述的重點是新版本的插件已經下載到plugins目錄後應該如何更新本地正在運行的程序,是整個插件升級實現的後半部分。本篇文章就來說述軟件自動部署(固然,也包括插件升級)的前半部分。數據庫

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

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

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

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

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

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

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

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

1. 要兼容安裝包/升級包的各類文件,下載的文件有exe,dll,zip包等,必需要可以區分出下載文件的後綴名,而後根據不一樣的後綴,採用不一樣的安裝或升級策略。xml

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

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

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

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

相關文章
相關標籤/搜索