基于http协议的在线升级系统

 

基于http协议的在线升级系统
摘要
       做了一个省级项目,由于采用了三层的架构(前端pb,java做web服务),从这些年的项目经验上来,这种架构有非常严重的缺陷,首先是维护的成本上,很多文章都探讨过瘦客户端的易维护性。但是随着业务的变更,比如增加一个字段这样简单的事情,你的客户端也必定要作出调整,当然你可以写一定的基础代码来动态的忽略掉简单的功能变更 ,但是还有一个最致命的因素是架构师和程序员不能根除的,那就是bug,并且由于程序员水平的参差不齐,客户端能否真正从业务中剥离出来都很难说。因此,几乎所有的客户端都不可避免的面临着功能或者是bug修改后的升级。
为什么选择http协议
       不需要很多的水分,我选择采用这种方式的原因主要有,服务器出于安全的考虑安装了硬件防火墙,其他的各种通讯协议穿越防火墙都存在着难度。当然最重要的是我让他们为我开放端口有一定的难度才是根本。这是体制上的悲哀,同时也是我的动力。另外,我所熟练的语言是java,而java在web开发上所具有的优势非常明显。
系统原理
 一个系统部署到客户的机器上,通常会拷贝文件到某个分区上,写入注册表(windows系统),启动某些服务。而通常的升级可能会做的就是覆盖以前的文件,至于其他的动作可能不是必须的,并且如果需要,我们会重新制作安装文件给客户来安装来完成那些动作。因此升级的任务简单说来就是下载,更新文件。
       升级并不是简单的覆盖,一个大型的信息系统会有非常多的编译文件,例如我们的系统就有数十个pbd文件,如果单纯的下载所有的文件覆盖,开销是不可以容忍的,不过这种方法也有人在用,我亲眼看到过。只是这需要在网络条件要非常好的情况下,不然上百M的下载可不是几分钟就能搞定的。所以如何标识文件是否需要下载便是首要的问题:方法是给每个文件一个版本号,让客户端程序根据自身版本号与服务器进行比对来决定哪些需要升级,这种比对的工作可以由客户端或者服务段完成都可以。初期我选择由客户端来完成这些比对,包括目前的实现都只是支持这种方案,不过我决定后期会把这种控制权让给服务端来完成。
       我们有二十多个用户(当然,这不指客户端的数目),每个客户都或多或少的要求了自己的东西,而这些要求都不可能紧紧去用if else去控制程序去实现,所以项目的版本逐渐成一个树形发展,以后或者会增加。维护版本是一项非常繁琐的工作,前期规划不好导致的问题会,在soursafe上现在不同的版本已经有接近20个了,而且这种分化是不可逆转的,即你增加了版本分支后,后续的功能拓展就使得你必须去分别维护分支上的代码,这项工作会带来重复性的代码移植和测试工作.罗嗦了这么多只是为了发泄项目管理的不成功会造成资源的浪费,很多人认为我们这种大公司的管理体制一定很好,但是事实是,种种原因在项目上线后的管理变得一塌糊(初期还能按部就班的做,后期项目就便很快发展成一个烂摊子了).
文件比度
       继续我们的正题,每个客户端都会有一个自己的版本文件,这个文件格式都一样,只是文件数目和版本号有所不同,文件的格式采用了xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<pbds>
 <pbd name="account_dw.pbd" size="170496" edition="1.01.03" leastTime="2006-11-24 07:32:54.000GMT+08:00"/> 
 <pbd name="account_nvo.pbd" size="22016" edition="1.01.03" leastTime="2006-11-24 07:32:56.000GMT+08:00"/> 
 <pbd name="account_vo.pbd" size="125440" edition="1.01.03" leastTime="2006-11-24 07:32:56.000GMT+08:00"/>
</pbds>

       Name指升级文件名,size指文件大小,edition是版本号, leastTime指更新的时间.前三个是比较重要的, leastTime只是一个参考.服务端也会动态的保持一个客户端的升级配置信息,不过结构略有不同:

<?xml version="1.0" encoding="UTF-8"?>
<pbds>
 <pbd name="account_dw.pbd" size="170496" edition="1.01.03" domain=”default” leastTime="2006-11-24 07:32:54.000GMT+08:00"/> 
 <pbd name="account_nvo.pbd" size="22016" edition="1.01.03" domain=”default” leastTime="2006-11-24 07:32:56.000GMT+08:00"/> 
 <pbd name="account_vo.pbd" size="125440" edition="1.01.03" domain=”update” leastTime="2006-11-24 07:32:56.000GMT+08:00"/>
</pbds>

Element pbd的domain属性决定了改文件从哪个域来下载,前面说过,版本的控制不好造成了这种本地化的分支,这些事情客户不会知道也不需要知道,他们只需要程序能完成自己的功能就好了.
       Pbd还有一个size的属性,这是因为从servlet下载完成时能够比对一下文件是否完全下载,因为下载是采用了pb的inet组件,所以功能不是很强大,暂时也没有时间允许自己开发一个更好的东西,其实也没有必要过分的追求完美,那样就是把自己前进的道路弄得更加曲折,就像我开发这个系统的管理模块时,过分追求实现的框架复用性,结果到现在也没有真正交付这个系统,好在这是我自己的,没有项目周期去限制.对比文件是否下载可以有两种方式,一种是在文件传输或结束时做标志,再就是用我们的size属性,我选择后者,简单而有效.
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
程序功能: 本程序是检查程序版本并提供HTTP方式在线更新的程序! 支持多个文件、不同目录更新。 windows环境通用。 使用: 1.把所有需要更新的文件名称和版本号信息添加到更新列表XML文件中,XML文件内容格式: <?xml version="1.0" encoding="gb2312"?> BPL\FORM.bpl 2012.6.4.0 main.exe 2012.6.5.0 注意: 1)与XML文件同一个目录的,文件名不要含目录信息。 2)没有版本号的文件,每次发布时,自己编一个不同的版本号填入XML. 3)XML文件清单信息,每次发布都应包含所有的程序文件。 4)更新列表XML文件与程序文件一同发布到IIS虚拟目录中(windows环境下的)。 2.手动直接执行UPDATE.EXE文件更新时, 需要把更新列表XML文件的URL地址写在文本配置文件CLIENTDB.LXH中。 内容格式如下: [UPDATE] XMLURL=HTTP://192.168.0.80/RELEASE/FILELISTS.XML 3.由主控程序调用时,调用代码格式如下: ShellAPI.ShellExecute(0, 'Open', 'UPDATE.EXE', PWideChar(Params), '',SW_SHOWNORMAL); 其中Params参数,字符串内容必须按顺序分别为: 更新列表XML文件的URL地址 + 主控程序文件名 + 个性程序标题, 共传入三个入口参数,每个参数之间用空格隔开。 可以不传参数,则默认用CLIENTDB.LXH配置文件中的XML URL地址; 可以只传1个参数,参数此时必须为XML URL地址; 如果传第2个参数,更新完毕会自动启动主控程序; 如果传第3个参数,则更新程序标题为第3个参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值