系统软件自动部署实现方案

在上篇文章中咱们阐述的重点是新版本的插件已经下载到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来定义网络协议,它会给你带来意向不到的惊喜。

坚持天天的学习和积累,加油!

相关文章
相关标签/搜索