• 【大话QT之十三】系统软件自己主动部署实现方案


            本篇文章是对【大话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来定义网络协议,它会给你带来意向不到的惊喜。

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

  • 相关阅读:
    unity HideInInspector与SerializeField
    Unity3D之游戏架构脚本该如何来写(转)
    写在创业公司工作后
    工作选择
    指针引用
    sqrt函数实现
    超平面
    【读书笔记】读《程序员面试宝典》
    【小白学游戏常用算法】一、随机迷宫算法
    【Cocos2d-x游戏开发】浅谈游戏中的坐标系
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7289465.html
Copyright © 2020-2023  润新知