【大话QT之十三】系统软件自己主动部署实现方案
2017-08-05 10:42
225 查看
本篇文章是对【大话QT之十二】基于CTK Plugin Framework的插件版本号动态升级文章的补充,在上篇文章中我们阐述的重点是新版本号的插件已经下载到plugins文件夹后应该怎样更新本地正在执行的程序,是整个插件升级实现的后半部分。本篇文章就来讲述软件自己主动部署(当然,也包含插件升级)的前半部分。
我们必须有这样一点认识。即:我们的程序是执行在用户机器上的,插件更新不是我们手动放进去的,而必须有一种机制使client可以检測到须要升级插件了。然后将插件自己主动下载下来,最后自己主动进行安装或插件更新。
系统软件自己主动部署实现的基本架构为:
上图中的组成中,【应用】和【更新服务】部分是执行在client的,【数据库】和【文件server】是执行在服务端。而【Server (WebServer)】则负责client与服务端进行通信。其主要的流程例如以下:
1> client的【更新服务】採用QTimer::singleShot()定时触发版本号检測的逻辑。
2> 版本号检測逻辑中採用WebServer请求訪问服务端的版本号检測服务(通过PHP实现)。服务端回去訪问【数据库】。去检查比較是否有更高版本号的插件/升级包。
3> 检測信息返回给client的【更新服务】,当【更新服务】依据返回结果判定存在较新的插件/安装包时,開始訪问【文件server】运行下载操作,这里能够採用FTP下载。或者其他的某种方式将【文件server】上的更新文件下载到本地对应文件夹内。
4> 最后这一部分是系统软件部署/插件升级最麻烦的地方,client的【更新服务】会去推断【应用】模块中是否正在执行作业或者对外提供服务。
假设此时【应用】模块没有对外提供服务,则在给出用户提示的情况下能够直接升级或安装;假设此时【应用】模块正在对外提供服务,则须要採用空暇时更新的策略,当对外服务完毕之后进行更新。
基本上系统软件自己主动部署的逻辑架构就如上所看到的,但在实际代码中要实现还须要考虑一些非常重要的问题。
1. 要兼容安装包/升级包的各种文件,下载的文件有exe,dll,zip包等,必需要可以区分出下载文件的后缀名,然后依据不同的后缀,採用不同的安装或升级策略。
2. 要兼容各种平台,Windows、Linux、Mac OS等,不同的平台下安装包的形式有各种各样,比如:windows下有exe、dll、zip等;Linux下有rpm、tar.gz等。
3. 当【应用】模块正在对外提供服务,比如:正在进行网络操作,有打开的port,在进行插件更新或升级包安装时必须先将原有占用的port停掉。然后等插件更新完毕后又一次打开port恢复曾经的任务。
这个过程不是非常好控制,如今还没有处理这方面问题的经验。
最后。因为client要和服务端进行通信。因此必须採用定义同样的数据结构或通信协议,而在这个时候採用的google protobuf则提供了非常大的灵活性。
它的使用方式不仅简单,并且效率更高(通常和xml进行比較),并且支持非常多语言版本号,PHP、C++、Java等,强烈建议在以后的项目中涉及到网络通信时採用google protobuf来定义网络协议,它会给你带来意向不到的惊喜。
坚持每天的学习和积累。加油!
我们必须有这样一点认识。即:我们的程序是执行在用户机器上的,插件更新不是我们手动放进去的,而必须有一种机制使client可以检測到须要升级插件了。然后将插件自己主动下载下来,最后自己主动进行安装或插件更新。
系统软件自己主动部署实现的基本架构为:
上图中的组成中,【应用】和【更新服务】部分是执行在client的,【数据库】和【文件server】是执行在服务端。而【Server (WebServer)】则负责client与服务端进行通信。其主要的流程例如以下:
1> client的【更新服务】採用QTimer::singleShot()定时触发版本号检測的逻辑。
2> 版本号检測逻辑中採用WebServer请求訪问服务端的版本号检測服务(通过PHP实现)。服务端回去訪问【数据库】。去检查比較是否有更高版本号的插件/升级包。
3> 检測信息返回给client的【更新服务】,当【更新服务】依据返回结果判定存在较新的插件/安装包时,開始訪问【文件server】运行下载操作,这里能够採用FTP下载。或者其他的某种方式将【文件server】上的更新文件下载到本地对应文件夹内。
4> 最后这一部分是系统软件部署/插件升级最麻烦的地方,client的【更新服务】会去推断【应用】模块中是否正在执行作业或者对外提供服务。
假设此时【应用】模块没有对外提供服务,则在给出用户提示的情况下能够直接升级或安装;假设此时【应用】模块正在对外提供服务,则须要採用空暇时更新的策略,当对外服务完毕之后进行更新。
基本上系统软件自己主动部署的逻辑架构就如上所看到的,但在实际代码中要实现还须要考虑一些非常重要的问题。
1. 要兼容安装包/升级包的各种文件,下载的文件有exe,dll,zip包等,必需要可以区分出下载文件的后缀名,然后依据不同的后缀,採用不同的安装或升级策略。
2. 要兼容各种平台,Windows、Linux、Mac OS等,不同的平台下安装包的形式有各种各样,比如:windows下有exe、dll、zip等;Linux下有rpm、tar.gz等。
3. 当【应用】模块正在对外提供服务,比如:正在进行网络操作,有打开的port,在进行插件更新或升级包安装时必须先将原有占用的port停掉。然后等插件更新完毕后又一次打开port恢复曾经的任务。
这个过程不是非常好控制,如今还没有处理这方面问题的经验。
最后。因为client要和服务端进行通信。因此必须採用定义同样的数据结构或通信协议,而在这个时候採用的google protobuf则提供了非常大的灵活性。
它的使用方式不仅简单,并且效率更高(通常和xml进行比較),并且支持非常多语言版本号,PHP、C++、Java等,强烈建议在以后的项目中涉及到网络通信时採用google protobuf来定义网络协议,它会给你带来意向不到的惊喜。
坚持每天的学习和积累。加油!
相关文章推荐
- 【大话QT之十三】系统软件自动部署实现方案
- 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论
- Maven实现Web应用集成測试自己主动化 -- 部署自己主动化(WebTest Maven Plugin)
- 4000 ActiveMQ实现负载均衡+高可用部署方案
- XCode5.1.1怎样实现代码块自己主动排版
- Linux设备驱动实现自己主动创建设备节点
- ActiveMQ实现负载均衡+高可用部署方案(转)
- 基于反射实现自己主动化restful开发
- ActiveMQ实现负载均衡+高可用部署方案
- 一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)
- 自己主动下载源代码_并编译_打包_部署_重新启动服务的Shell脚本
- 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
- C#实现自己主动升级(附源代码)
- 嵌入式linux 实现mdev SD卡和U盘自己主动挂载和卸载的方法 mdev.conf
- NSLayoutConstraint-代码实现自己主动布局的函数使用方法说明
- ActiveMQ实现负载均衡+高可用部署方案(转)
- ActiveMQ实现负载均衡+高可用部署方案
- UNIX/LINUX使用expect实现人机自己主动交互功能
- 利用Continuous Testing实现Eclipse环境自己主动单元測试
- ActiveMQ实现负载均衡+高可用部署方案