`
flyeagle
  • 浏览: 211650 次
  • 来自: ...
社区版块
存档分类
最新评论

web程序在线更新实现

阅读更多
    说说以前的一个web程序在线更新实现,给没有实现过的人们提供一点思路,这是我一个项目的实现,也许方式不是很好,但是它实现了基本的需求。
    
    公司的开发了一个web产品,这个web产品部署在全国很多地方有客户,但是由于后期的功能提升和bug修改,就需要对部署在客户处的web程序进行更新,但是由于部署比较分散,更新起来比较麻烦,并且由于客户有较多不懂软件,给他们提供更新包对于他们来说也不是很好,所以,需要一个自动更新的实现,以前在实现这个功能的时候,在网上找过,感觉这方面的资料和实现很少,所以就自己摸索着实现了。以下是实现思路,没什么新技术,就是一些技术的融合而已:
  
   1、更新数据:
         web程序更新存在程序更新、数据库更新、服务器更新;
        程序更新涉及的主要是程序文件、配置文件更新。数据库更新涉及数据库数据、表结构更新、服务器更新,主要是服务器版本升级。

   2、实现方式:
        1)、本地提供更新服务器,在更新服务器上提供程序版本记录标志、程序更新包(里面含更新策略,如,更新程序文件覆盖路径、或者添加路径,数据库数据文件,表结构更新文件、服务器更新(这个正常更新应该比较少))。
       
        2)、web产品上含有程序更新包下载功能,这个含自动或主动,所谓自动就是在程序上设置定时更新功能,程序在某个时刻自动检测服务器版本,并于本地版本进行对比,如果有更新就自动更新,如果没有,则不更新。主动更新就是需要人为的点击之后进行对比更新。
       
        3)、在每次更新时,web程序将更新服务器上的更新包下载到本地,然后进行自动解压,之后解压包中提提供了程序文件更新策略、数据库更新策略,依照更新策略进行程序的更新。但是,由于会存在程序无法更新的情况,我的实现是,对于部署在windows上的程序更新,我使用java提供了一个exe可执行文件,直接调用这个exe程序来进行程序的更新,在更新时,先启动exe文件,然后停止web服务器,再进行程序的更新,更新完成后,直接通过exe启动web服务器,这样整个过程都不需要人进行干预。如果是非windows操作系统,使用shell(只考虑了unix家族的实现)脚本调用一个java程序来进行程序的更新操作,基本同上。

        4)、在更新时,能使用本地服务器进行的更新部分,尽量使用本地服务器进行更新,如:数据库数据文件及表结构的更新,不能的才选择exe更新程序或脚本启动程序进行更新。
        
        5)、因为在更新程序时服务器会停止,这样将影响用户的使用,所以,要尽量选择在使用较少的时候进行程序的更新操作(这是我实现这个程序最大缺点,因为如果一个服务器不能停止或者停止程序影响非常大的话,这样的更新方式将不可行,但是正常情况如果我们有程序更新也还是要停止服务器的)。
      
        6)、如果客户无法上网或者说无法上外网的话,上面的更新策略也存在问题,这样的话就给他提供更新包,然后提供更新包存放的位置,直接运行exe或者shell脚本文件。当然这样的话对于服务器启动或停止,数据文件的更新都需要考虑好如果进行。


  以上是我实现的一些方式和注意点。欢迎大家指正。因为实现没什么新技术,所以,代码就不提供了(公司产品程序)。
       
        

       
        
分享到:
评论
29 楼 luolinyi520 2012-12-22  
能加下你QQ讨论一下吗?我现在正好要做这个功能,和你的需求一模一样。希望你看到尽快回复,我的QQ519290168,非常感谢!
28 楼 zzy491042824 2012-03-12  
实在不好意思,楼主您好,我给您发了一个站内信,希望楼主能看一下,耽误您的时间,实在抱歉
27 楼 wh8766 2010-07-20  
表结构更新是指怎样程度的更新呢?那么怎样做到对已有数据不造成破坏?
26 楼 litianyi520 2010-02-25  
svn + ant ,服务器 lvs 搞定
25 楼 sw1982 2010-02-25  
因为电信每秒赚的钱比我们程序员一辈子赚的钱都要多 )。
~~~~一天有24小时,每小时60分,每分60秒。。。哈哈,不在乎一秒钟的事情
24 楼 zli.ray 2010-02-24  
flyeagle 写道
zli.ray 写道
呵呵,我们公司在客户现场都派有开发人员,不存在这个问题。
感觉,如果是比较复杂的程序升级的话,最好有开发人员在现场实施,或远程协助。有些升级,真的不是一个升级程序能搞定的。

另,有些简单的升级,比如CS的客户端进行升级,可以借助现有的技术,比如webstart,很傻瓜,很强大。

     呵呵,你们开发的应该就是项目,还没有达到产品的程度吧,最多可能也就是有较多的模块相似,或者说可重用,还需要根据各个客户的需求进行功能的定制,我所说的是产品,就算不能像一般的cs产品那样一点不改动,至少也是各个客户的产品都几乎不改动,要达到这个程度了,这样的更新程序对于减少成本我相信是非常有用的。如果产品部署在全国各地,每升级一个版本就要派人到现场去部署实施,这样的造价还是不小的。

实不相瞒,我是做电信的,不同省都差不多,只是客户的需求不尽相同,得定制。
我们的升级,有小升级和打升级。小升级就是发给现场一个升级包,有那边的开发人员进行具体操作。
打升级的话,那可以说是声势浩大、人仰马翻,现场没有个专门的团队是不行的。因为很多升级都牵扯到数据,不能有一点差错(因为电信每秒赚的钱比我们程序员一辈子赚的钱都要多 )。
所以,我们的升级不会、也不敢使用你所说的自动升级的策略。

不过,对于你说的我们开发的“是项目,还没有达到产品的程度吧”,这一点我不认同,我们的也是产品,只不过,这个产品太大太复杂,虽然核心相同,但还是需要做很多定制化的工作。还有,CS只是举个例子,我们的产品不是单纯的CS,而是一个大杂烩,啥都有。
23 楼 flyeagle 2010-02-24  
zli.ray 写道
呵呵,我们公司在客户现场都派有开发人员,不存在这个问题。
感觉,如果是比较复杂的程序升级的话,最好有开发人员在现场实施,或远程协助。有些升级,真的不是一个升级程序能搞定的。

另,有些简单的升级,比如CS的客户端进行升级,可以借助现有的技术,比如webstart,很傻瓜,很强大。

     呵呵,你们开发的应该就是项目,还没有达到产品的程度吧,最多可能也就是有较多的模块相似,或者说可重用,还需要根据各个客户的需求进行功能的定制,我所说的是产品,就算不能像一般的cs产品那样一点不改动,至少也是各个客户的产品都几乎不改动,要达到这个程度了,这样的更新程序对于减少成本我相信是非常有用的。如果产品部署在全国各地,每升级一个版本就要派人到现场去部署实施,这样的造价还是不小的。
22 楼 flyeagle 2010-02-24  
wangzhongjie 写道
产品的架构也是不得不考虑的一个因素,比如jmx,osgi

这里和产品的架构关系不大,我所要实现的就是如何在一个web产品发布以后,在下一个稳定版本发布后,如何不到客户本地去就能较为简单方便的把需要升级的程序和数据库给更新完成,减少人力到各地出差或者需要进行远程协助,也就是减少人为的干预。
21 楼 zli.ray 2010-02-24  
呵呵,我们公司在客户现场都派有开发人员,不存在这个问题。
感觉,如果是比较复杂的程序升级的话,最好有开发人员在现场实施,或远程协助。有些升级,真的不是一个升级程序能搞定的。

另,有些简单的升级,比如CS的客户端进行升级,可以借助现有的技术,比如webstart,很傻瓜,很强大。
20 楼 wangzhongjie 2010-02-24  
产品的架构也是不得不考虑的一个因素,比如jmx,osgi
19 楼 flyeagle 2010-02-22  
我所写的就是依据公司产品的需求来实现的,目前已经在使用,没什么新技术,就是个实现思路问题。相信如果是将web系统以产品形式进行发布的话,都应该有这方面的需求,至于现实方式应该也是多样化的,但是既然是产品,那么每次升级都应该是一个相对将稳定的版本,同时也不可能时常的进行产品更新,这样太影响用户使用,所以,如果想以持续集成的方式来进行升级显然是不现实的。
18 楼 kill8108 2010-02-22  
做产品的,都应该有这个方面的需求了,支持下!
17 楼 linliangyi2007 2010-02-22  
UP楼主一下,楼主提出了一个很实用的设想,抛出一个有趣的命题。
我上一家公司在规划一套企业内部的“云”计算平台(大家莫笑),虽然概念有吹嘘之嫌疑,但也提出了一个正对“虚拟服务资源”(硬盘、JVM/CPU 、数据库/DataSource)的一体化管理分配方案,就是楼主的设想的进一步演进。

这个论题大家可以各抒己见一下啊
16 楼 flyeagle 2010-02-22  
kafei819000 写道
在客户端安装Cruisecontrol和svn客户端或者cvs客户端与版本库进行配置,通过ant脚本加上windows命令或shell脚本进行程序更新呢,客户端的Cruisecontrol可以配置手工执行或者自动执行,进行程序重新部署,自己写程序多麻烦,当然你版本库的安全性设置好,如果还觉得不安全 建议研读Cruisecontrol代码 抽取有用的进行重新编写,也比楼主这样简单方便。



  你说的我不知道能不能满足我的需求,因为我还没有使用过Cruisecontrol。
15 楼 kafei819000 2010-02-22  
在客户端安装Cruisecontrol和svn客户端或者cvs客户端与版本库进行配置,通过ant脚本加上windows命令或shell脚本进行程序更新呢,客户端的Cruisecontrol可以配置手工执行或者自动执行,进行程序重新部署,自己写程序多麻烦,当然你版本库的安全性设置好,如果还觉得不安全 建议研读Cruisecontrol代码 抽取有用的进行重新编写,也比楼主这样简单方便。
14 楼 flyeagle 2010-02-22  
我选择的是尽量避免在用户感知的情况下去更新,如果能做到这一步将是一大进步,所以能选择使用服务器更新的就用服务器更新,不能的才选择使用另外一个更新程序,在这个过程中要尽量缩短服务器停用的时间,所以,如果更新的程序文件不是很大,那么一般更新过程也就是几秒的问题(主要是文件覆盖和文件添加),可能在启动和停止服务的时间较长,如果采用服务的模式这个过程也将被缩短。所以,如果再选择在凌晨更新,这个时候通常使用的人应该是最少的时候,影响也相对的减小。

如果提供主动更新也是可以的,但是如果用户选择在用户使用高峰期进行更新,影响将会很大,因为如果程序不能自动更新,对有的人来说你要他在公司等到凌晨来更新,相信乐意的人不多。
13 楼 lz_cleaner 2010-02-22  
我们的产品也有同样的需求,还没做呢
我现在的想法是,给用户提供一个产品管理平台,可以由用户控制升级的方式(自动,半自动。。。)、进程,这样用户心里觉得更安心一些的。
12 楼 kukuwuwu 2010-02-22  
想要不影响用户使用同时更新服务器
可以启动多个服务,更新时候,先更新文件,
然后一个服务一个服务的重启,这样就不影响用户使用 而且完成了更新,前提是数据库结构不发生重要变化
11 楼 ssuupv 2010-02-22  
收藏起来先。谢谢你共享
10 楼 ssuupv 2010-02-22  
做产品的,对这方面需求很强烈,你的思路对我们有很大帮助。

相关推荐

Global site tag (gtag.js) - Google Analytics