好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

web动态部署(热部署)

web动态部署(热部署)

web动态部署(热部署)

今天跟大家探讨一下关于web动态部署,也就是热部署的问题。说这个之前,先说一个敏捷开发的原则。

【最小发布、增量开发】

我们在做项目时,设定的期限都特别长。总是想第一个版本就想把所有想到的问题都做完,以至于项目一再延期。所以我们应该改变我们的开发策略。采用敏捷开发的方式。


这里我想强调的有2点, 1.最小发布。2.增量开发 。


对于最小发布,就是要在第一版中把核心功能实现,即立即发布第一个版本。在实际的开发中,公司为了抢占市场,都会尽可能早的发布一个V1.0的版本。能有效的占领市场,同时对于开发人员来讲,可以减少对项目的排斥情绪。因为项目拖得越久,开发人员就会越疲惫,就会消极怠工,bug数会直线上升。这显然对与开发是极其不利的。


而增量开发,则是没增加一个功能模块,就要发布一个版本。保证在规定的时间内,至少可以让用户使用到新的功能。而且,采用增量开发的技术,也从可以降低模块之间的耦合性。人不可能一口吃成胖子,项目也一样,需要分阶段,分目标的去开发。中国还实行“五年计划”,更何况我们的项目呢。


【热部署】
热插拔,这个词儿可能只有在硬件中听过,在软件开发中可能没有听过。而热部署,跟热插拔一样,就算没听过,看到这个词儿也能想出个1,2,3来。
不错,热部署就是系统在运行过程中,可以对功能进行可配置,而不用停止或关闭系统。不用我说大家也能想到它的好处吧。
解耦,灵活性自然不必说,最重要的是用户可以按自己的喜好,个性化设置自己的系统,这对于用户来说是非常欢喜的。有这样的系统,没有人会去选择死板一块的系统。而且也同时印证和支持了最小发布和增量开发的方针。增量开发,每开发一个功能,就采用热部署,对系统进行在线升级。

说了这么多废话,还是给了代码看看吧,毕竟实践是检验真理的唯一标准。

热部署,主要用到了xml文件来实现动态效果。菜单用xml文件来存储,系统动态读取xml文件来动态生成菜单。例子菜单分为2级,一级菜单在同一个xml文件中,二级菜单存在放各自对应的文件夹中的xml文件里。

一级菜单存放在Config文件夹下的ChildSystem.config:

 1   <?  xml version="1.0" encoding="utf-8"  ?> 
 2   <!--  系统中的子系统或子模块。  --> 
 3   <  childsystem  > 
 4     <  system   name  ="GoodsManager"   value  ="商品管理"   assembly  ="GoodsManager.dll"   /> 
 5     <  system   name  ="UserManager"   value  ="用户管理"   assembly  ="UserManager.dll"   /> 
 6   </  childsystem  > 

商品管理二级菜单 存放在 GoodsManager文件夹下的App.config:

  1   <?  xml version="1.0" encoding="utf-8"  ?> 
  2   <  Pages  > 
  3     <  page   name  ="socket"   value  ="测试界面"   url  ="~/GoodsManager/Socket.aspx"   /> 
  4     <  page   name  ="config"   value  ="配置页面"    url  ="~/GoodsManager/Configer.aspx"   /> 
  5     <  main  > 
  6       <  name  > GoodsManager </  name  > 
  7       <  author  > longxuan </  author  > 
  8       <  version  > 1.00 </  version  > 
  9       <  assmebly  > GoodsManager.dll </  assmebly  > 
 10     </  main  >   
 11   </  Pages  > 

用户管理二级菜单存放在UserManager文件夹下的 App.config:

 1   <?  xml version="1.0" encoding="utf-8"  ?> 
 2   <  Pages  > 
 3     <  page   name   ="internet"   value  ="网络时间"   url  ="~/UserManager/InternetTime.aspx"   /> 
 4     <  page   name  ="socket"   value  ="测试界面"   url  ="~/UserManager/Socket.aspx"   /> 
 5     <  page   name  ="config"   value  ="配置页面"    url  ="~/UserManager/Configer.aspx"   /> 
 6     <  main  > 
 7       <  name  > returnCashStrategy </  name  > 
 8       <  author  > longxuan </  author  > 
 9       <  version  > 1.00 </  version  > 

主界面Default.aspx ,拖入一个TreeView控件,name修改为TreeViewMU,添加SelectedNodeChanged事件。后台代码:

  1   using   System;
   2   using   System.IO;
   3   using   System.Web.UI.WebControls;
   4   using   System.Xml;
   5  
  6   namespace   PluginTest
   7   {
   8       public   partial   class   Default : System.Web.UI.Page
   9       {
  10           protected   void  Page_Load( object   sender, EventArgs e)
  11           {
  12               if  (! IsPostBack)
  13               {
  14                   ShowChildSystem();
  15               }
  16           }
  17  
 18           ///   <summary> 
 19           ///   子系统、子模块的显示
  20           ///   </summary> 
 21           private   void   ShowChildSystem()
  22           {
  23               string  xmlpath = Server.MapPath( "  ~\\Config\\ChildSystem.config  "  );
  24               if  (!File.Exists(xmlpath))  return  ;
  25              XmlDocument xmlDoc =  new   XmlDocument();
  26               xmlDoc.Load(xmlpath);
  27               var  selectSingleNode = xmlDoc.SelectSingleNode( "  childsystem  "  );
  28               if  (selectSingleNode !=  null  )
  29               {
  30                  XmlNodeList nodelist =  selectSingleNode.ChildNodes;
  31  
 32                   TreeViewMU.Nodes.Clear();
  33  
 34                   foreach  ( var  VARIABLE  in   nodelist)
  35                   {
  36                      TreeNode node =  new   TreeNode();
  37                      XmlAttributeCollection xmlAttributeCollection =  ((XmlNode)VARIABLE).Attributes;
  38                       if  (xmlAttributeCollection !=  null  )
  39                       {
  40                          node.Text = xmlAttributeCollection[ "  value  "  ].InnerXml;
  41                          node.Target = xmlAttributeCollection[ "  assembly  "  ].InnerXml;
  42                          node.Value = xmlAttributeCollection[ "  name  "  ].InnerXml;
  43                       }
  44                       TreeViewMU.Nodes.Add(node);
  45                   }
  46               }
  47           }
  48  
 49  
 50           protected   void  TreeViewMU_SelectedNodeChanged( object   sender, EventArgs e)
  51           {
  52               ChildSystemManager();
  53           }
  54  
 55           ///   <summary> 
 56           ///   子系统、子模块的管理
  57           ///   </summary> 
 58           private   void   ChildSystemManager()
  59           {
  60               string  xmlpath = Server.MapPath( "  ~\\  "  + TreeViewMU.SelectedNode.Value +  "  \\App.config  "  );
  61  
 62               if  (!File.Exists(xmlpath))  return  ;
  63              XmlDocument xmlDoc =  new   XmlDocument();
  64               xmlDoc.Load(xmlpath);
  65               var  selectSingleNode = xmlDoc.SelectNodes( "  Pages//page  "  );
  66               if  (selectSingleNode !=  null  )
  67               {
  68                  XmlNodeList nodelist =  selectSingleNode;
  69  
 70                   TreeViewMU.SelectedNode.ChildNodes.Clear();
  71  
 72                   foreach  ( var  VARIABLE  in   nodelist)
  73                   {
  74                      TreeNode node =  new   TreeNode();
  75                      XmlAttributeCollection xmlAttributeCollection =  ((XmlNode)VARIABLE).Attributes;
  76                       if  (xmlAttributeCollection !=  null  )
  77                       {
  78                          node.Text = xmlAttributeCollection[ "  value  "  ].InnerXml;
  79                          node.Value = xmlAttributeCollection[ "  name  "  ].InnerXml;
  80                          node.NavigateUrl = xmlAttributeCollection[ "  url  "  ].InnerXml;
  81                       }
  82                       TreeViewMU.SelectedNode.ChildNodes.Add(node);
  83                   }
  84               }
  85           }
  86       }
  87  }


每次开发一个新的功能模块,或者子系统,把网页放到一个文件夹中,并在该文件夹中写好App.config文件,然后放到已经部署好的系统根目录下,对一级菜单配置文件稍作修改即可。不用关闭系统,重新发布,重新启动。这对与大型系统是极为重要的,比如金融,电力、水利系统等,关闭一秒钟的损失都是不可估量的。而热部署是解决这类问题的一个很好的例子。  

动态修改配置文件的类这里不再赘述,在《 重新演绎动态编译类,打造灵活多变的系统 》中发表过一篇类似的Config配置修改类,可以做参考。

 

 

 

标签:  DoNet

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于web动态部署(热部署)的详细内容...

  阅读:43次