ESFramework介绍之(20)―― 插件自动升级

简介: 当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对(AddinPair)实现了一组相似或相近的需求/功能。

    当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对(AddinPair)实现了一组相似或相近的需求/功能。

    好了,我们已经开发了十多对插件对,然后分别XCopy到了各个服务器节点上,“整个系统”已经投入了运行。通过前面的介绍(回顾),相信大家对我们的“整个系统”有了个大致的映像。我们的IRAS服务器通常只存在于一个节点上,而我们的AS和对应的多个FS通常分布在非常多个节点上(比如每个大中城市都分配一个AS),而且这些节点相距非常遥远,深圳AS位于深圳、上海AS位于上海、武汉AS位于武汉等等。整个系统非常正常稳定的运行了一段时间后,某一天,用户要求增加一个新功能,这时你说,“非常简单,只需要开发一个对应的功能插件和客户端插件即可”。是的,对开发来说确实只需要这样,但是对于部署了?你需要“跑到”每个节点上安装新的功能插件,你也需要“跑到”所有的客户端那里安装新的客户端插件。安装是很容易的,XCopy就行了,但是,你“跑”得过来吗?

    看来,插件能够自动升级、自动加载/运行是非常重要的。手动进行这些工作,不仅效率低、而且非常容易出错。好了,我们来看ESFramework是如何对插件自动升级进行支持的。
    插件自动升级包括以下几个方面的意思:
(1) 当发现有更新版本的插件时,下载新版本插件覆盖旧版本插件。(插件版本升级)
(2) 当发现有原来没有的插件时,下载新插件。(添加新功能)
(3) 当发现原来的某插件在标准的插件目录中已经不存在时,删除本地对应的插件。(删除某项功能)

    AddinUpgradeType枚举反映了以上几种情况。

    public   enum  AddinUpgradeType
    {
        Add ,Remove ,Update ,Keep 
// keep 表示不需更新
    }

    我们需要在某个地方保存“标准的插件目录”信息,这通常是位于CommonDb(公共数据库,每个AS、FS、IRAS都可以访问)。标准插件目录中存储了每个插件的最新版本信息,这些信息由AddinVersionInformation类表示:

1     public   class  AddinVersionInformation
2      {
3           public   int      AddinKey ;
4           public   float  NewVersion ;
5           public   bool   Valid ;
6           public   string  AddinFileName ;
7      }

    插件的自动升级由IAddinUpgrador支持,每当启动升级过程时,IAddinUpgrador的工作步骤如下:
(1) 获取标准目录中的所有插件信息,并与本地的插件信息相比较,得到一个AddinUpgradeContent集合,集合中的AddinUpgradeContent对象反映了对某个插件应该进行怎样的操作――下载新版本覆盖、删除、下载新添加的插件。        AddinUpgradeContent定义如下:

1     public   class  AddinUpgradeContent
2      {
3           public   int  AddinKey  =   - 1  ;
4           public  AddinUpgradeType UpgrageType  =  AddinUpgradeType.Keep;
5          
6           public   string  AddinFileName ; // 下载插件后存储于本地的名称
7      }


(2) 对于每个AddinUpgradeContent,IAddinUpgrador进行审查,并根据UpgrageType执行对应的操作。
    比如是覆盖本地的插件,则IAddinUpgrador首先会删除本地存储介质上的插件,然后下载新版本插件到本地,接着要求IAddinManagement从内存中动态移除对应的插件,最后,命令IAddinManagement加载新版本的插件。这里存在一个插件动态替换的问题,大家可以通过链接进行了解。

(3) 将升级成功/失败的信息输出、或记录到日志中。

    IAddinUpgrador接口定义如下:

    public   interface  IAddinUpgrador
    {
        IAddinUpgradeHelper  AddinUpgradeHelper{
set  ;}        
        IAddinManagement     AddinManagement{
set  ;}        
        
string                  LocalAddinDirectory{ set  ;}

        IAddinUpgradeMsgOutputer AddinUpgradeMsgOutputer{
set  ;}

        
void  StartUpgrador() ;
    }

    
public   interface  IAddinUpgradeHelper
    {
        
string  GetAddinUrl( int  addinKey) ;
        AddinVersionInformation[] GetAddinVersionNew() ;
    }

    
public   interface  IAddinUpgradeMsgOutputer
    {
        
void  PutoutMsg( string  msg) ;  // 用于记录升级成功、异常等信息
    }

    关于IAddinUpgrador的实现,大家可以参考发布的ESFramework源码中的Addin目录。

    在我们的FS或客户端程序中(因为这两个地方需要实现插件自动升级),我们通常设置一个定时器,每隔一段时间就调用IAddinUpgrador. StartUpgrador()方法一次,来实现自动升级过程。

    这里讲的是插件自动升级的过程,如果我们的服务平台发生了改变,AS、FS需要升级,该如何处理?其实思想与本文是差不多的,这将在下篇文章中介绍。
    感谢关注!

上一篇文章:ESFramework介绍之(19)―― 对动态组ActiveGroup的支持

转到  :ESFramework 可复用的通信框架(序)

 

 

目录
相关文章
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明
516 0
|
6月前
|
消息中间件 JSON 监控
【UE插件DTRabbitMQ】 虚幻引擎蓝图连接RabbitMQ服务器使用插件说明
本插件可以使用蓝图连接 RabbitMQ服务器,并推送或者监听消息。
261 4
|
C语言 Ubuntu
流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署
 源码下载地址:https://github.com/EasyDarwin/EasyDarwin/archive/v7.0.5.zip 查看 Ubuntu 的版本号 sudo lsb_release -a ubuntu 14.04 更新 gcc/g++ 4.9.2 ubuntu14.04 自带的是4.8版本,而最新的4.9.2对c++11的支持更好一些。
2332 0
|
传感器 API Android开发
Alljoyn瘦客户端库介绍(官方文档翻译 下)
由于其他事情耽误,这个翻译现在才完成。接上篇—— 4 瘦客户端核心库架构   由于AllJoyn瘦客户端核心库(AJTCL)必须运行在那些功耗受限、计算能力有限、资源紧缺的设备上,因此它无法像运行在通用型计算机系统上那样使用和AllJoyn标准核心库(AJSCL)一样的架构。
1215 0
|
传感器 自然语言处理 API
Alljoyn瘦客户端库介绍(官方文档翻译)
Alljoyn瘦客户端库介绍(上)   1、简介  本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍。本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中。
1174 0
|
数据库 UED
ESFramework介绍之(22)―― 服务器系统自动升级
(本文名字取为“服务器系统自动升级”,实际上适用于所有应用程序自动升级的情况。)    前文介绍了在服务器或客户端应用程序运行的过程中,插件如何自动升级、更新。基于前文相同的理由,AS、FS、IRAS也需要有自动升级的功能。
942 0
|
容器
ESFramework介绍之(29)―― 插件公共设施 AddinUtil
(本文适用于 ESFramework V0.2+)    不知你是否还记得,前面我们讲过,ESFramework规定了插件有如下特点: (1)一个插件是一个独立的物理单元。它可以独立的提供一项完整的服务(功能),而不需要依赖于其它插件。
809 0